mirror of
https://github.com/owncloud/android-library.git
synced 2026-08-20 12:52:53 +00:00
Reordered packages
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
/* ownCloud Android Library is available under MIT license
|
||||
* Copyright (C) 2014 ownCloud (http://www.owncloud.org/)
|
||||
* Copyright (C) 2012 Bartek Przybylski
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.owncloud.android.lib.common.operations;
|
||||
|
||||
|
||||
public interface OnRemoteOperationListener {
|
||||
|
||||
void onRemoteOperationFinish(RemoteOperation caller, RemoteOperationResult result);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
/* ownCloud Android Library is available under MIT license
|
||||
* Copyright (C) 2014 ownCloud (http://www.owncloud.org/)
|
||||
* Copyright (C) 2012 Bartek Przybylski
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.owncloud.android.lib.common.operations;
|
||||
|
||||
public class OperationCancelledException extends Exception {
|
||||
|
||||
/**
|
||||
* Generated serial version - to avoid Java warning
|
||||
*/
|
||||
private static final long serialVersionUID = -6350981497740424983L;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,272 @@
|
||||
/* ownCloud Android Library is available under MIT license
|
||||
* Copyright (C) 2014 ownCloud (http://www.owncloud.org/)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.owncloud.android.lib.common.operations;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.commons.httpclient.Credentials;
|
||||
|
||||
import com.owncloud.android.lib.common.OwnCloudClient;
|
||||
import com.owncloud.android.lib.common.OwnCloudClientFactory;
|
||||
import com.owncloud.android.lib.common.network.BearerCredentials;
|
||||
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
|
||||
|
||||
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountManager;
|
||||
import android.accounts.AccountsException;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
/**
|
||||
* Operation which execution involves one or several interactions with an ownCloud server.
|
||||
*
|
||||
* Provides methods to execute the operation both synchronously or asynchronously.
|
||||
*
|
||||
* @author David A. Velasco
|
||||
*/
|
||||
public abstract class RemoteOperation implements Runnable {
|
||||
|
||||
private static final String TAG = RemoteOperation.class.getSimpleName();
|
||||
|
||||
/** ownCloud account in the remote ownCloud server to operate */
|
||||
private Account mAccount = null;
|
||||
|
||||
/** Android Application context */
|
||||
private Context mContext = null;
|
||||
|
||||
/** Object to interact with the remote server */
|
||||
private OwnCloudClient mClient = null;
|
||||
|
||||
/** Callback object to notify about the execution of the remote operation */
|
||||
private OnRemoteOperationListener mListener = null;
|
||||
|
||||
/** Handler to the thread where mListener methods will be called */
|
||||
private Handler mListenerHandler = null;
|
||||
|
||||
/** Activity */
|
||||
private Activity mCallerActivity;
|
||||
|
||||
|
||||
/**
|
||||
* Abstract method to implement the operation in derived classes.
|
||||
*/
|
||||
protected abstract RemoteOperationResult run(OwnCloudClient client);
|
||||
|
||||
|
||||
/**
|
||||
* Synchronously executes the remote operation on the received ownCloud account.
|
||||
*
|
||||
* Do not call this method from the main thread.
|
||||
*
|
||||
* This method should be used whenever an ownCloud account is available, instead of {@link #execute(OwnCloudClient)}.
|
||||
*
|
||||
* @param account ownCloud account in remote ownCloud server to reach during the execution of the operation.
|
||||
* @param context Android context for the component calling the method.
|
||||
* @return Result of the operation.
|
||||
*/
|
||||
public RemoteOperationResult execute(Account account, Context context) {
|
||||
if (account == null)
|
||||
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL Account");
|
||||
if (context == null)
|
||||
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL Context");
|
||||
mAccount = account;
|
||||
mContext = context.getApplicationContext();
|
||||
try {
|
||||
mClient = OwnCloudClientFactory.createOwnCloudClient(mAccount, mContext);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
|
||||
return new RemoteOperationResult(e);
|
||||
}
|
||||
return run(mClient);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Synchronously executes the remote operation
|
||||
*
|
||||
* Do not call this method from the main thread.
|
||||
*
|
||||
* @param client Client object to reach an ownCloud server during the execution of the operation.
|
||||
* @return Result of the operation.
|
||||
*/
|
||||
public RemoteOperationResult execute(OwnCloudClient client) {
|
||||
if (client == null)
|
||||
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL OwnCloudClient");
|
||||
mClient = client;
|
||||
return run(client);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Asynchronously executes the remote operation
|
||||
*
|
||||
* This method should be used whenever an ownCloud account is available, instead of {@link #execute(OwnCloudClient)}.
|
||||
*
|
||||
* @param account ownCloud account in remote ownCloud server to reach during the execution of the operation.
|
||||
* @param context Android context for the component calling the method.
|
||||
* @param listener Listener to be notified about the execution of the operation.
|
||||
* @param listenerHandler Handler associated to the thread where the methods of the listener objects must be called.
|
||||
* @return Thread were the remote operation is executed.
|
||||
*/
|
||||
public Thread execute(Account account, Context context, OnRemoteOperationListener listener, Handler listenerHandler, Activity callerActivity) {
|
||||
if (account == null)
|
||||
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL Account");
|
||||
if (context == null)
|
||||
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL Context");
|
||||
mAccount = account;
|
||||
mContext = context.getApplicationContext();
|
||||
mCallerActivity = callerActivity;
|
||||
mClient = null; // the client instance will be created from mAccount and mContext in the runnerThread to create below
|
||||
|
||||
mListener = listener;
|
||||
|
||||
mListenerHandler = listenerHandler;
|
||||
|
||||
Thread runnerThread = new Thread(this);
|
||||
runnerThread.start();
|
||||
return runnerThread;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Asynchronously executes the remote operation
|
||||
*
|
||||
* @param client Client object to reach an ownCloud server during the execution of the operation.
|
||||
* @param listener Listener to be notified about the execution of the operation.
|
||||
* @param listenerHandler Handler associated to the thread where the methods of the listener objects must be called.
|
||||
* @return Thread were the remote operation is executed.
|
||||
*/
|
||||
public Thread execute(OwnCloudClient client, OnRemoteOperationListener listener, Handler listenerHandler) {
|
||||
if (client == null) {
|
||||
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL OwnCloudClient");
|
||||
}
|
||||
mClient = client;
|
||||
|
||||
if (listener == null) {
|
||||
throw new IllegalArgumentException("Trying to execute a remote operation asynchronously without a listener to notiy the result");
|
||||
}
|
||||
mListener = listener;
|
||||
|
||||
if (listenerHandler == null) {
|
||||
throw new IllegalArgumentException("Trying to execute a remote operation asynchronously without a handler to the listener's thread");
|
||||
}
|
||||
mListenerHandler = listenerHandler;
|
||||
|
||||
Thread runnerThread = new Thread(this);
|
||||
runnerThread.start();
|
||||
return runnerThread;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asynchronous execution of the operation
|
||||
* started by {@link RemoteOperation#execute(OwnCloudClient, OnRemoteOperationListener, Handler)},
|
||||
* and result posting.
|
||||
*
|
||||
* TODO refactor && clean the code; now it's a mess
|
||||
*/
|
||||
@Override
|
||||
public final void run() {
|
||||
RemoteOperationResult result = null;
|
||||
boolean repeat = false;
|
||||
do {
|
||||
try{
|
||||
if (mClient == null) {
|
||||
if (mAccount != null && mContext != null) {
|
||||
if (mCallerActivity != null) {
|
||||
mClient = OwnCloudClientFactory.createOwnCloudClient(mAccount, mContext, mCallerActivity);
|
||||
} else {
|
||||
mClient = OwnCloudClientFactory.createOwnCloudClient(mAccount, mContext);
|
||||
}
|
||||
} else {
|
||||
throw new IllegalStateException("Trying to run a remote operation asynchronously with no client instance or account");
|
||||
}
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Error while trying to access to " + mAccount.name, new AccountsException("I/O exception while trying to authorize the account", e));
|
||||
result = new RemoteOperationResult(e);
|
||||
|
||||
} catch (AccountsException e) {
|
||||
Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
|
||||
result = new RemoteOperationResult(e);
|
||||
}
|
||||
|
||||
if (result == null)
|
||||
result = run(mClient);
|
||||
|
||||
repeat = false;
|
||||
if (mCallerActivity != null && mAccount != null && mContext != null && !result.isSuccess() &&
|
||||
// (result.getCode() == ResultCode.UNAUTHORIZED || (result.isTemporalRedirection() && result.isIdPRedirection()))) {
|
||||
(result.getCode() == ResultCode.UNAUTHORIZED || result.isIdPRedirection())) {
|
||||
/// possible fail due to lack of authorization in an operation performed in foreground
|
||||
Credentials cred = mClient.getCredentials();
|
||||
String ssoSessionCookie = mClient.getSsoSessionCookie();
|
||||
if (cred != null || ssoSessionCookie != null) {
|
||||
/// confirmed : unauthorized operation
|
||||
AccountManager am = AccountManager.get(mContext);
|
||||
boolean bearerAuthorization = (cred != null && cred instanceof BearerCredentials);
|
||||
boolean samlBasedSsoAuthorization = (cred == null && ssoSessionCookie != null);
|
||||
if (bearerAuthorization) {
|
||||
am.invalidateAuthToken(mAccount.type, ((BearerCredentials)cred).getAccessToken());
|
||||
} else if (samlBasedSsoAuthorization ) {
|
||||
am.invalidateAuthToken(mAccount.type, ssoSessionCookie);
|
||||
} else {
|
||||
am.clearPassword(mAccount);
|
||||
}
|
||||
mClient = null;
|
||||
repeat = true; // when repeated, the creation of a new OwnCloudClient after erasing the saved credentials will trigger the login activity
|
||||
result = null;
|
||||
}
|
||||
}
|
||||
} while (repeat);
|
||||
|
||||
final RemoteOperationResult resultToSend = result;
|
||||
if (mListenerHandler != null && mListener != null) {
|
||||
mListenerHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mListener.onRemoteOperationFinish(RemoteOperation.this, resultToSend);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the current client instance to access the remote server.
|
||||
*
|
||||
* @return Current client instance to access the remote server.
|
||||
*/
|
||||
public final OwnCloudClient getClient() {
|
||||
return mClient;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,363 @@
|
||||
/* ownCloud Android Library is available under MIT license
|
||||
* Copyright (C) 2014 ownCloud (http://www.owncloud.org/)
|
||||
* Copyright (C) 2012 Bartek Przybylski
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.owncloud.android.lib.common.operations;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.SocketException;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.net.ssl.SSLException;
|
||||
|
||||
import org.apache.commons.httpclient.ConnectTimeoutException;
|
||||
import org.apache.commons.httpclient.Header;
|
||||
import org.apache.commons.httpclient.HttpException;
|
||||
import org.apache.commons.httpclient.HttpStatus;
|
||||
import org.apache.jackrabbit.webdav.DavException;
|
||||
import org.json.JSONException;
|
||||
|
||||
import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
|
||||
import com.owncloud.android.lib.common.network.CertificateCombinedException;
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountsException;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
/**
|
||||
* 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 - should be refreshed every time the class changes!! */
|
||||
private static final long serialVersionUID = -8257349554488668693L;
|
||||
|
||||
private static final String TAG = "RemoteOperationResult";
|
||||
|
||||
public enum ResultCode {
|
||||
OK,
|
||||
OK_SSL,
|
||||
OK_NO_SSL,
|
||||
UNHANDLED_HTTP_CODE,
|
||||
UNAUTHORIZED,
|
||||
FILE_NOT_FOUND,
|
||||
INSTANCE_NOT_CONFIGURED,
|
||||
UNKNOWN_ERROR,
|
||||
WRONG_CONNECTION,
|
||||
TIMEOUT,
|
||||
INCORRECT_ADDRESS,
|
||||
HOST_NOT_AVAILABLE,
|
||||
NO_NETWORK_CONNECTION,
|
||||
SSL_ERROR,
|
||||
SSL_RECOVERABLE_PEER_UNVERIFIED,
|
||||
BAD_OC_VERSION,
|
||||
CANCELLED,
|
||||
INVALID_LOCAL_FILE_NAME,
|
||||
INVALID_OVERWRITE,
|
||||
CONFLICT,
|
||||
OAUTH2_ERROR,
|
||||
SYNC_CONFLICT,
|
||||
LOCAL_STORAGE_FULL,
|
||||
LOCAL_STORAGE_NOT_MOVED,
|
||||
LOCAL_STORAGE_NOT_COPIED,
|
||||
OAUTH2_ERROR_ACCESS_DENIED,
|
||||
QUOTA_EXCEEDED,
|
||||
ACCOUNT_NOT_FOUND,
|
||||
ACCOUNT_EXCEPTION,
|
||||
ACCOUNT_NOT_NEW,
|
||||
ACCOUNT_NOT_THE_SAME,
|
||||
INVALID_CHARACTER_IN_NAME
|
||||
}
|
||||
|
||||
private boolean mSuccess = false;
|
||||
private int mHttpCode = -1;
|
||||
private Exception mException = null;
|
||||
private ResultCode mCode = ResultCode.UNKNOWN_ERROR;
|
||||
private String mRedirectedLocation;
|
||||
|
||||
private ArrayList<Object> mData;
|
||||
|
||||
public RemoteOperationResult(ResultCode code) {
|
||||
mCode = code;
|
||||
mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL);
|
||||
mData = null;
|
||||
}
|
||||
|
||||
private RemoteOperationResult(boolean success, int httpCode) {
|
||||
mSuccess = success;
|
||||
mHttpCode = httpCode;
|
||||
|
||||
if (success) {
|
||||
mCode = ResultCode.OK;
|
||||
|
||||
} 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;
|
||||
case HttpStatus.SC_INSUFFICIENT_STORAGE:
|
||||
mCode = ResultCode.QUOTA_EXCEEDED;
|
||||
break;
|
||||
default:
|
||||
mCode = ResultCode.UNHANDLED_HTTP_CODE;
|
||||
Log.d(TAG, "RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " + httpCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public RemoteOperationResult(boolean success, int httpCode, Header[] headers) {
|
||||
this(success, httpCode);
|
||||
if (headers != null) {
|
||||
Header current;
|
||||
for (int i=0; i<headers.length; i++) {
|
||||
current = headers[i];
|
||||
if ("Location".equals(current.getName())) {
|
||||
mRedirectedLocation = current.getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public RemoteOperationResult(Exception e) {
|
||||
mException = e;
|
||||
|
||||
if (e instanceof OperationCancelledException) {
|
||||
mCode = ResultCode.CANCELLED;
|
||||
|
||||
} else if (e instanceof SocketException) {
|
||||
mCode = ResultCode.WRONG_CONNECTION;
|
||||
|
||||
} else if (e instanceof SocketTimeoutException) {
|
||||
mCode = ResultCode.TIMEOUT;
|
||||
|
||||
} else if (e instanceof ConnectTimeoutException) {
|
||||
mCode = ResultCode.TIMEOUT;
|
||||
|
||||
} else if (e instanceof MalformedURLException) {
|
||||
mCode = ResultCode.INCORRECT_ADDRESS;
|
||||
|
||||
} else if (e instanceof UnknownHostException) {
|
||||
mCode = ResultCode.HOST_NOT_AVAILABLE;
|
||||
|
||||
} else if (e instanceof AccountNotFoundException) {
|
||||
mCode = ResultCode.ACCOUNT_NOT_FOUND;
|
||||
|
||||
} else if (e instanceof AccountsException) {
|
||||
mCode = ResultCode.ACCOUNT_EXCEPTION;
|
||||
|
||||
} 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 if (e instanceof RuntimeException) {
|
||||
mCode = ResultCode.HOST_NOT_AVAILABLE;
|
||||
|
||||
} else {
|
||||
mCode = ResultCode.SSL_ERROR;
|
||||
}
|
||||
|
||||
} else {
|
||||
mCode = ResultCode.UNKNOWN_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void setData(ArrayList<Object> files){
|
||||
mData = files;
|
||||
}
|
||||
|
||||
public ArrayList<Object> getData(){
|
||||
return mData;
|
||||
}
|
||||
|
||||
public boolean isSuccess() {
|
||||
return mSuccess;
|
||||
}
|
||||
|
||||
public boolean isCancelled() {
|
||||
return mCode == ResultCode.CANCELLED;
|
||||
}
|
||||
|
||||
public int getHttpCode() {
|
||||
return mHttpCode;
|
||||
}
|
||||
|
||||
public ResultCode getCode() {
|
||||
return mCode;
|
||||
}
|
||||
|
||||
public Exception getException() {
|
||||
return mException;
|
||||
}
|
||||
|
||||
public boolean isSslRecoverableException() {
|
||||
return mCode == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED;
|
||||
}
|
||||
|
||||
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 if (mException instanceof AccountNotFoundException) {
|
||||
Account failedAccount = ((AccountNotFoundException)mException).getFailedAccount();
|
||||
return mException.getMessage() + " (" + (failedAccount != null ? failedAccount.name : "NULL") + ")";
|
||||
|
||||
} else if (mException instanceof AccountsException) {
|
||||
return "Exception while using account";
|
||||
|
||||
} else if (mException instanceof JSONException) {
|
||||
return "JSON 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.LOCAL_STORAGE_FULL) {
|
||||
return "Local storage full";
|
||||
|
||||
} else if (mCode == ResultCode.LOCAL_STORAGE_NOT_MOVED) {
|
||||
return "Error while moving file to final directory";
|
||||
|
||||
} else if (mCode == ResultCode.ACCOUNT_NOT_NEW) {
|
||||
return "Account already existing when creating a new one";
|
||||
|
||||
} else if (mCode == ResultCode.ACCOUNT_NOT_THE_SAME) {
|
||||
return "Authenticated with a different account than the one updating";
|
||||
} else if (mCode == ResultCode.INVALID_CHARACTER_IN_NAME) {
|
||||
return "The file name contains an forbidden character";
|
||||
}
|
||||
|
||||
return "Operation finished with HTTP status code " + mHttpCode + " (" + (isSuccess() ? "success" : "fail") + ")";
|
||||
|
||||
}
|
||||
|
||||
public boolean isServerFail() {
|
||||
return (mHttpCode >= HttpStatus.SC_INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
|
||||
public boolean isException() {
|
||||
return (mException != null);
|
||||
}
|
||||
|
||||
public boolean isTemporalRedirection() {
|
||||
return (mHttpCode == 302 || mHttpCode == 307);
|
||||
}
|
||||
|
||||
public String getRedirectedLocation() {
|
||||
return mRedirectedLocation;
|
||||
}
|
||||
|
||||
public boolean isIdPRedirection() {
|
||||
return (mRedirectedLocation != null &&
|
||||
(mRedirectedLocation.toUpperCase().contains("SAML") ||
|
||||
mRedirectedLocation.toLowerCase().contains("wayf")));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user