X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/e566d041d199b3a91bfcca7cda72160d7d4ddf8e..8d38fd331d43f21800843ae4cf340bc33e583a40:/src/com/owncloud/android/services/OperationsService.java diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index f0f37f5c..a9f92ed6 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -32,6 +32,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation; import com.owncloud.android.lib.resources.shares.ShareType; +import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation; import com.owncloud.android.operations.common.SyncOperation; import com.owncloud.android.operations.CreateShareOperation; import com.owncloud.android.operations.GetServerInfoOperation; @@ -72,12 +73,14 @@ public class OperationsService extends Service { public static final String EXTRA_PASSWORD = "PASSWORD"; public static final String EXTRA_AUTH_TOKEN = "AUTH_TOKEN"; public static final String EXTRA_FOLLOW_REDIRECTS = "FOLLOW_REDIRECTS"; + public static final String EXTRA_COOKIE = "COOKIE"; public static final String ACTION_CREATE_SHARE = "CREATE_SHARE"; public static final String ACTION_UNSHARE = "UNSHARE"; public static final String ACTION_GET_SERVER_INFO = "GET_SERVER_INFO"; public static final String ACTION_OAUTH2_GET_ACCESS_TOKEN = "OAUTH2_GET_ACCESS_TOKEN"; public static final String ACTION_EXISTENCE_CHECK = "EXISTENCE_CHECK"; + public static final String ACTION_GET_USER_NAME = "GET_USER_NAME"; public static final String ACTION_OPERATION_ADDED = OperationsService.class.getName() + ".OPERATION_ADDED"; public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() + ".OPERATION_FINISHED"; @@ -85,8 +88,14 @@ public class OperationsService extends Service { private ConcurrentLinkedQueue> mPendingOperations = new ConcurrentLinkedQueue>(); + /* private ConcurrentMap mOperationResults = new ConcurrentHashMap(); + */ + + private ConcurrentMap> + mUndispatchedFinishedOperations = + new ConcurrentHashMap>(); private static class Target { public Uri mServerUrl = null; @@ -96,9 +105,10 @@ public class OperationsService extends Service { public String mPassword = ""; public String mAuthToken = ""; public boolean mFollowRedirects = true; + public String mCookie = ""; public Target(Account account, Uri serverUrl, String webdavUrl, String username, String password, String authToken, - boolean followRedirects) { + boolean followRedirects, String cookie) { mAccount = account; mServerUrl = serverUrl; mWebDavUrl = webdavUrl; @@ -106,6 +116,7 @@ public class OperationsService extends Service { mPassword = password; mAuthToken = authToken; mFollowRedirects = followRedirects; + mCookie = cookie; } } @@ -143,22 +154,31 @@ public class OperationsService extends Service { */ @Override public int onStartCommand(Intent intent, int flags, int startId) { - //Log.wtf(TAG, "onStartCommand init" ); + Log_OC.wtf(TAG, "onStartCommand init" ); Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; mServiceHandler.sendMessage(msg); - //Log.wtf(TAG, "onStartCommand end" ); + Log_OC.wtf(TAG, "onStartCommand end" ); return START_NOT_STICKY; } - + @Override + public void onDestroy() { + Log_OC.wtf(TAG, "onDestroy init" ); + super.onDestroy(); + Log_OC.wtf(TAG, "Clear mUndispatchedFinisiedOperations" ); + mUndispatchedFinishedOperations.clear(); + Log_OC.wtf(TAG, "onDestroy end" ); + } + + /** * Provides a binder object that clients can use to perform actions on the queue of operations, * except the addition of new operations. */ @Override public IBinder onBind(Intent intent) { - //Log.wtf(TAG, "onBind" ); + Log_OC.wtf(TAG, "onBind" ); return mBinder; } @@ -260,6 +280,7 @@ public class OperationsService extends Service { String password = operationIntent.getStringExtra(EXTRA_PASSWORD); String authToken = operationIntent.getStringExtra(EXTRA_AUTH_TOKEN); boolean followRedirects = operationIntent.getBooleanExtra(EXTRA_FOLLOW_REDIRECTS, true); + String cookie = operationIntent.getStringExtra(EXTRA_COOKIE); target = new Target( account, (serverUrl == null) ? null : Uri.parse(serverUrl), @@ -267,7 +288,8 @@ public class OperationsService extends Service { (username == null) ? "" : username, (password == null) ? "" : password, (authToken == null) ? "" : authToken, - followRedirects + followRedirects, + (cookie == null) ? "" : cookie ); String action = operationIntent.getAction(); @@ -310,6 +332,9 @@ public class OperationsService extends Service { boolean successIfAbsent = operationIntent.getBooleanExtra(EXTRA_SUCCESS_IF_ABSENT, true); operation = new ExistenceCheckRemoteOperation(remotePath, OperationsService.this, successIfAbsent); + } else if (action.equals(ACTION_GET_USER_NAME)) { + // Get User Name + operation = new GetRemoteUserNameOperation(); } } @@ -321,16 +346,34 @@ public class OperationsService extends Service { if (operation != null) { mPendingOperations.add(new Pair(target, operation)); startService(new Intent(OperationsService.this, OperationsService.class)); + Log_OC.wtf(TAG, "New operation added, opId: " + operation.hashCode()); return operation.hashCode(); } else { + Log_OC.wtf(TAG, "New operation failed, returned -1"); return -1; } } - public RemoteOperationResult getOperationResultIfFinished(int mDetectAuthOpId) { - //Log_OC.wtf(TAG, "Searching result for operation with id " + mDetectAuthOpId); - return mOperationResults.remove(mDetectAuthOpId); + public RemoteOperationResult getOperationResultIfFinished(int operationId) { + Pair undispatched = + mUndispatchedFinishedOperations.remove(operationId); + if (undispatched != null) { + return undispatched.second; + } + return null; + } + + + public void dispatchResultIfFinished(int operationId, OnRemoteOperationListener listener) { + Pair undispatched = + mUndispatchedFinishedOperations.remove(operationId); + if (undispatched != null) { + listener.onRemoteOperationFinish(undispatched.first, undispatched.second); + Log_OC.wtf(TAG, "Sending callback later"); + } else { + Log_OC.wtf(TAG, "Not finished yet"); + } } } @@ -365,7 +408,7 @@ public class OperationsService extends Service { */ private void nextOperation() { - //Log.wtf(TAG, "nextOperation init" ); + Log_OC.wtf(TAG, "nextOperation init" ); Pair next = null; synchronized(mPendingOperations) { @@ -393,6 +436,8 @@ public class OperationsService extends Service { mOwnCloudClient.setBasicCredentials(mLastTarget.mUsername, mLastTarget.mPassword); } else if (mLastTarget.mAuthToken != "") { mOwnCloudClient.setBearerCredentials(mLastTarget.mAuthToken); + } else if (mLastTarget.mCookie != "") { + mOwnCloudClient.setSsoSessionCookie(mLastTarget.mCookie); } mStorageManager = null; } @@ -431,12 +476,11 @@ public class OperationsService extends Service { } finally { synchronized(mPendingOperations) { mPendingOperations.poll(); - mOperationResults.put(mCurrentOperation.hashCode(), result); } } //sendBroadcastOperationFinished(mLastTarget, mCurrentOperation, result); - callbackOperationListeners(mLastTarget, mCurrentOperation, result); + dispatchResultToOperationListeners(mLastTarget, mCurrentOperation, result); } } @@ -494,7 +538,7 @@ public class OperationsService extends Service { * @param operation Finished operation. * @param result Result of the operation. */ - private void callbackOperationListeners( + private void dispatchResultToOperationListeners( Target target, final RemoteOperation operation, final RemoteOperationResult result) { int count = 0; Iterator listeners = mBinder.mBoundListeners.keySet().iterator(); @@ -511,6 +555,12 @@ public class OperationsService extends Service { count += 1; } } + if (count == 0) { + //mOperationResults.put(operation.hashCode(), result); + Pair undispatched = + new Pair(operation, result); + mUndispatchedFinishedOperations.put(operation.hashCode(), undispatched); + } Log_OC.d(TAG, "Called " + count + " listeners"); }