From 522ea30da06e2c1a6a7243847cd349a5a3a0149d Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 22 Jul 2015 10:40:50 +0200 Subject: [PATCH] Simplified flow of interruption of uploads in cancellations --- .../ChunkedUploadRemoteFileOperation.java | 5 ++- .../files/UploadRemoteFileOperation.java | 33 ++++++++++--------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java index f8c19d3e..281745ad 100644 --- a/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java @@ -32,7 +32,6 @@ import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import java.util.Random; -import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.methods.PutMethod; import com.owncloud.android.lib.common.OwnCloudClient; @@ -85,6 +84,10 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation mPutMethod.addRequestHeader(OC_TOTAL_LENGTH_HEADER, String.valueOf(file.length())); ((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset); mPutMethod.setRequestEntity(mEntity); + if (mCancellationRequested.get()) { + mPutMethod.abort(); + // next method will throw an exception + } status = client.executeMethod(mPutMethod); if (status == 400) { diff --git a/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java index d6e90922..7e4ad499 100644 --- a/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java @@ -67,7 +67,7 @@ public class UploadRemoteFileOperation extends RemoteOperation { protected PutMethod mPutMethod = null; protected boolean mForbiddenCharsInServer = false; - private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); + protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); protected Set mDataTransferListeners = new HashSet(); protected RequestEntity mEntity = null; @@ -83,27 +83,28 @@ public class UploadRemoteFileOperation extends RemoteOperation { RemoteOperationResult result = null; try { - // / perform the upload - synchronized (mCancellationRequested) { - if (mCancellationRequested.get()) { - throw new OperationCancelledException(); + mPutMethod = new PutMethod(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath)); + + if (mCancellationRequested.get()) { + // the operation was cancelled before getting it's turn to be executed in the queue of uploads + result = new RemoteOperationResult(new OperationCancelledException()); + + } else { + // perform the upload + int status = uploadFile(client); + if (mForbiddenCharsInServer){ + result = new RemoteOperationResult( + RemoteOperationResult.ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER); } else { - mPutMethod = new PutMethod(client.getWebdavUri() + - WebdavUtils.encodePath(mRemotePath)); + result = new RemoteOperationResult(isSuccess(status), status, + (mPutMethod != null ? mPutMethod.getResponseHeaders() : null)); } } - int status = uploadFile(client); - if (mForbiddenCharsInServer){ - result = new RemoteOperationResult( - RemoteOperationResult.ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER); - } else { - result = new RemoteOperationResult(isSuccess(status), status, - (mPutMethod != null ? mPutMethod.getResponseHeaders() : null)); - } } catch (Exception e) { - if (mCancellationRequested.get() && !(e instanceof OperationCancelledException)) { + if (mPutMethod != null && mPutMethod.isAborted()) { result = new RemoteOperationResult(new OperationCancelledException()); + } else { result = new RemoteOperationResult(e); }