X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/48f13c8adc5c4b9bc4ca96bf13939a7d7cfae562..9aab2d26da38f26e7ff03a0b5db3bd01b51bce05:/src/com/owncloud/android/operations/RemoteOperationResult.java?ds=inline diff --git a/src/com/owncloud/android/operations/RemoteOperationResult.java b/src/com/owncloud/android/operations/RemoteOperationResult.java index 1803f4cf..d8fbe460 100644 --- a/src/com/owncloud/android/operations/RemoteOperationResult.java +++ b/src/com/owncloud/android/operations/RemoteOperationResult.java @@ -1,5 +1,25 @@ +/* ownCloud Android client application + * Copyright (C) 2012 Bartek Przybylski + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + package com.owncloud.android.operations; +import java.io.IOException; +import java.io.Serializable; import java.net.MalformedURLException; import java.net.SocketException; import java.net.SocketTimeoutException; @@ -8,16 +28,32 @@ import java.net.UnknownHostException; import javax.net.ssl.SSLException; import org.apache.commons.httpclient.ConnectTimeoutException; +import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; +import org.apache.jackrabbit.webdav.DavException; + +import com.owncloud.android.network.CertificateCombinedException; + +/** + * The result of a remote operation required to an ownCloud server. + * + * Provides a common classification of remote operation results for all the application. + * + * @author David A. Velasco + */ +public class RemoteOperationResult implements Serializable { + + /** Generated - to refresh every time the class changes */ + private static final long serialVersionUID = -7805531062432602444L; -public class RemoteOperationResult { - public enum ResultCode { // TODO leave alone our own errors + public enum ResultCode { OK, OK_SSL, OK_NO_SSL, UNHANDLED_HTTP_CODE, + UNAUTHORIZED, FILE_NOT_FOUND, INSTANCE_NOT_CONFIGURED, UNKNOWN_ERROR, @@ -27,13 +63,20 @@ public class RemoteOperationResult { HOST_NOT_AVAILABLE, NO_NETWORK_CONNECTION, SSL_ERROR, - BAD_OC_VERSION, + SSL_RECOVERABLE_PEER_UNVERIFIED, + BAD_OC_VERSION, + STORAGE_ERROR_MOVING_FROM_TMP, + CANCELLED, + INVALID_LOCAL_FILE_NAME, + INVALID_OVERWRITE, + CONFLICT } - + private boolean mSuccess = false; private int mHttpCode = -1; private Exception mException = null; private ResultCode mCode = ResultCode.UNKNOWN_ERROR; + private Object mExtraData = null; public RemoteOperationResult(ResultCode code) { mCode = code; @@ -49,12 +92,18 @@ public class RemoteOperationResult { } else if (httpCode > 0) { switch (httpCode) { + case HttpStatus.SC_UNAUTHORIZED: + mCode = ResultCode.UNAUTHORIZED; + break; case HttpStatus.SC_NOT_FOUND: mCode = ResultCode.FILE_NOT_FOUND; break; case HttpStatus.SC_INTERNAL_SERVER_ERROR: mCode = ResultCode.INSTANCE_NOT_CONFIGURED; break; + case HttpStatus.SC_CONFLICT: + mCode = ResultCode.CONFLICT; + break; default: mCode = ResultCode.UNHANDLED_HTTP_CODE; } @@ -64,41 +113,40 @@ public class RemoteOperationResult { public RemoteOperationResult(Exception e) { mException = e; - if (e instanceof SocketException) { + if (e instanceof OperationCancelledException) { + mCode = ResultCode.CANCELLED; + + } else if (e instanceof SocketException) { mCode = ResultCode.WRONG_CONNECTION; - //Log.e(TAG, "Socket exception while trying connection", e); } else if (e instanceof SocketTimeoutException) { mCode = ResultCode.TIMEOUT; - //Log.e(TAG, "Socket timeout exception while trying connection", e); } else if (e instanceof ConnectTimeoutException) { mCode = ResultCode.TIMEOUT; - //Log.e(TAG, "Socket timeout exception while trying connection", e); } else if (e instanceof MalformedURLException) { mCode = ResultCode.INCORRECT_ADDRESS; - //Log.e(TAG, "Connect exception while trying connection", e); } else if (e instanceof UnknownHostException) { mCode = ResultCode.HOST_NOT_AVAILABLE; - //Log.e(TAG, "Unknown host exception while trying connection", e); - } else if (e instanceof SSLException) { - mCode = ResultCode.SSL_ERROR; - //Log.e(TAG, "SSL exception while trying connection", e); + } else if (e instanceof SSLException || e instanceof RuntimeException) { + CertificateCombinedException se = getCertificateCombinedException(e); + if (se != null) { + mException = se; + if (se.isRecoverable()) { + mCode = ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED; + } + + } else { + mCode = ResultCode.SSL_ERROR; + } } else { mCode = ResultCode.UNKNOWN_ERROR; } - - /* } catch (HttpException e) { // other specific exceptions from org.apache.commons.httpclient - Log.e(TAG, "HTTP exception while trying connection", e); - } catch (IOException e) { // UnkownsServiceException, and any other transport exceptions that could occur - Log.e(TAG, "I/O exception while trying connection", e); - } catch (Exception e) { - Log.e(TAG, "Unexpected exception while trying connection", e); - */ + } @@ -106,6 +154,10 @@ public class RemoteOperationResult { return mSuccess; } + public boolean isCancelled() { + return mCode == ResultCode.CANCELLED; + } + public int getHttpCode() { return mHttpCode; } @@ -118,4 +170,95 @@ public class RemoteOperationResult { return mException; } + public boolean isSslRecoverableException() { + return mCode == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED; + } + + public void setExtraData(Object data) { + mExtraData = data; + } + + public Object getExtraData() { + return mExtraData; + } + + private CertificateCombinedException getCertificateCombinedException(Exception e) { + CertificateCombinedException result = null; + if (e instanceof CertificateCombinedException) { + return (CertificateCombinedException)e; + } + Throwable cause = mException.getCause(); + Throwable previousCause = null; + while (cause != null && cause != previousCause && !(cause instanceof CertificateCombinedException)) { + previousCause = cause; + cause = cause.getCause(); + } + if (cause != null && cause instanceof CertificateCombinedException) { + result = (CertificateCombinedException)cause; + } + return result; + } + + + public String getLogMessage() { + + if (mException != null) { + if (mException instanceof OperationCancelledException) { + return "Operation cancelled by the caller"; + + } else if (mException instanceof SocketException) { + return "Socket exception"; + + } else if (mException instanceof SocketTimeoutException) { + return "Socket timeout exception"; + + } else if (mException instanceof ConnectTimeoutException) { + return "Connect timeout exception"; + + } else if (mException instanceof MalformedURLException) { + return "Malformed URL exception"; + + } else if (mException instanceof UnknownHostException) { + return "Unknown host exception"; + + } else if (mException instanceof CertificateCombinedException) { + if (((CertificateCombinedException) mException).isRecoverable()) + return "SSL recoverable exception"; + else + return "SSL exception"; + + } else if (mException instanceof SSLException) { + return "SSL exception"; + + } else if (mException instanceof DavException) { + return "Unexpected WebDAV exception"; + + } else if (mException instanceof HttpException) { + return "HTTP violation"; + + } else if (mException instanceof IOException) { + return "Unrecovered transport exception"; + + } else { + return "Unexpected exception"; + } + } + + if (mCode == ResultCode.INSTANCE_NOT_CONFIGURED) { + return "The ownCloud server is not configured!"; + + } else if (mCode == ResultCode.NO_NETWORK_CONNECTION) { + return "No network connection"; + + } else if (mCode == ResultCode.BAD_OC_VERSION) { + return "No valid ownCloud version was found at the server"; + + } else if (mCode == ResultCode.STORAGE_ERROR_MOVING_FROM_TMP) { + return "Error while moving file from temporal to final directory"; + } + + return "Operation finished with HTTP status code " + mHttpCode + " (" + (isSuccess()?"success":"fail") + ")"; + + } + }