import com.owncloud.android.files.services.FileDownloader;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.operations.OperationCancelledException;
-import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.utils.Log_OC;
/** 'True' means that the remote folder changed and should be fetched */
private boolean mRemoteFolderChanged;
- private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
private List<OCFile> mFilesForDirectDownload;
// to avoid extra PROPFINDs when there was no change in the folder
private List<SyncOperation> mFoldersToWalkDown;
+ private final AtomicBoolean mCancellationRequested;
/**
* Creates a new instance of {@link SynchronizeFolderOperation}.
mFilesToSyncContentsWithoutUpload = new Vector<SyncOperation>();
mFavouriteFilesToSyncContents = new Vector<SyncOperation>();
mFoldersToWalkDown = new Vector<SyncOperation>();
-
+ mCancellationRequested = new AtomicBoolean(false);
}
RemoteOperationResult result = null;
mFailsInFileSyncsFound = 0;
mConflictsFound = 0;
-
- synchronized(mCancellationRequested) {
- if (mCancellationRequested.get()) {
- // Cancel each operation in mFoldersToWalkDown
- for (SyncOperation synchOp: mFoldersToWalkDown) {
- ((SynchronizeFolderOperation) synchOp).cancel();
- }
- return new RemoteOperationResult(new OperationCancelledException());
- }
- }
-
- // get locally cached information about folder
- mLocalFolder = getStorageManager().getFileByPath(mRemotePath);
- result = checkForChanges(client);
-
- if (result.isSuccess()) {
- if (mRemoteFolderChanged) {
- result = fetchAndSyncRemoteFolder(client);
+ try {
+ // get locally cached information about folder
+ mLocalFolder = getStorageManager().getFileByPath(mRemotePath);
+
+ result = checkForChanges(client);
+
+ if (result.isSuccess()) {
+ if (mRemoteFolderChanged) {
+ result = fetchAndSyncRemoteFolder(client);
+
+ } else {
+ prepareOpsFromLocalKnowledge();
+ }
- } else {
- prepareOpsFromLocalKnowledge();
+ if (result.isSuccess()) {
+ syncContents(client);
+ }
}
+ } catch (OperationCancelledException e) {
+ result = new RemoteOperationResult(e);
- if (result.isSuccess()) {
- syncContents(client);
+ // cancel 'child' synchronizations
+ for (SyncOperation synchOp: mFoldersToWalkDown) {
+ ((SynchronizeFolderOperation) synchOp).cancel();
}
}
}
- private RemoteOperationResult checkForChanges(OwnCloudClient client) {
+ private RemoteOperationResult checkForChanges(OwnCloudClient client) throws OperationCancelledException {
Log_OC.d(TAG, "Checking changes in " + mAccount.name + mRemotePath);
mRemoteFolderChanged = true;
RemoteOperationResult result = null;
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
+
// remote request
ReadRemoteFileOperation operation = new ReadRemoteFileOperation(mRemotePath);
result = operation.execute(client);
}
- private RemoteOperationResult fetchAndSyncRemoteFolder(OwnCloudClient client) {
+ private RemoteOperationResult fetchAndSyncRemoteFolder(OwnCloudClient client) throws OperationCancelledException {
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
+
ReadRemoteFolderOperation operation = new ReadRemoteFolderOperation(mRemotePath);
RemoteOperationResult result = operation.execute(client);
Log_OC.d(TAG, "Synchronizing " + mAccount.name + mRemotePath);
}
- private void syncContents(OwnCloudClient client) {
+ private void syncContents(OwnCloudClient client) throws OperationCancelledException {
startDirectDownloads();
startContentSynchronizations(mFilesToSyncContentsWithoutUpload, client);
startContentSynchronizations(mFavouriteFilesToSyncContents, client);
}
- private void startDirectDownloads() {
+ private void startDirectDownloads() throws OperationCancelledException {
for (OCFile file : mFilesForDirectDownload) {
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
Intent i = new Intent(mContext, FileDownloader.class);
i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);
i.putExtra(FileDownloader.EXTRA_FILE, file);
* @param filesToSyncContents Synchronization operations to execute.
* @param client Interface to the remote ownCloud server.
*/
- private void startContentSynchronizations(List<SyncOperation> filesToSyncContents, OwnCloudClient client) {
+ private void startContentSynchronizations(List<SyncOperation> filesToSyncContents, OwnCloudClient client)
+ throws OperationCancelledException {
+
RemoteOperationResult contentsResult = null;
for (SyncOperation op: filesToSyncContents) {
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
contentsResult = op.execute(getStorageManager(), mContext);
if (!contentsResult.isSuccess()) {
if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) {
}
- private void walkSubfolders(OwnCloudClient client) {
+ private void walkSubfolders(OwnCloudClient client) throws OperationCancelledException {
RemoteOperationResult contentsResult = null;
for (SyncOperation op: mFoldersToWalkDown) {
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
contentsResult = op.execute(client, getStorageManager()); // to watch out: possibly deep recursion
if (!contentsResult.isSuccess()) {
// TODO - some kind of error count, and use it with notifications
}
}
-
+
/**
* Creates and populates a new {@link com.owncloud.android.datamodel.OCFile} object with the data read from the server.
*
/**
* Cancel operation
*/
- public void cancel(){
+ public void cancel() {
mCancellationRequested.set(true);
}
}