|
@@ -24,6 +24,7 @@ import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
import java.io.OutputStream;
|
|
|
import java.util.HashSet;
|
|
|
+import java.util.Iterator;
|
|
|
import java.util.Set;
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
@@ -38,15 +39,18 @@ import com.owncloud.android.oc_framework.network.ProgressiveDataTransferer;
|
|
|
import com.owncloud.android.oc_framework.network.webdav.FileRequestEntity;
|
|
|
import com.owncloud.android.oc_framework.network.webdav.OnDatatransferProgressListener;
|
|
|
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
|
|
|
-import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
|
|
|
import com.owncloud.android.oc_framework.operations.OperationCancelledException;
|
|
|
import com.owncloud.android.oc_framework.operations.RemoteOperation;
|
|
|
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
|
|
|
import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
|
|
|
+import com.owncloud.android.oc_framework.operations.remote.ChunkedUploadRemoteFileOperation;
|
|
|
+import com.owncloud.android.oc_framework.operations.remote.ExistenceCheckRemoteOperation;
|
|
|
+import com.owncloud.android.oc_framework.operations.remote.UploadRemoteFileOperation;
|
|
|
import com.owncloud.android.utils.FileStorageUtils;
|
|
|
import com.owncloud.android.utils.Log_OC;
|
|
|
|
|
|
import android.accounts.Account;
|
|
|
+import android.content.Context;
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -62,6 +66,7 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
private OCFile mFile;
|
|
|
private OCFile mOldFile;
|
|
|
private String mRemotePath = null;
|
|
|
+ private boolean mChunked = false;
|
|
|
private boolean mIsInstant = false;
|
|
|
private boolean mRemoteFolderToBeCreated = false;
|
|
|
private boolean mForceOverwrite = false;
|
|
@@ -72,15 +77,20 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
PutMethod mPutMethod = null;
|
|
|
private Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
|
|
|
private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
|
|
|
+ private Context mContext;
|
|
|
+
|
|
|
+ private UploadRemoteFileOperation mUploadOperation;
|
|
|
|
|
|
protected RequestEntity mEntity = null;
|
|
|
|
|
|
|
|
|
public UploadFileOperation( Account account,
|
|
|
OCFile file,
|
|
|
+ boolean chunked,
|
|
|
boolean isInstant,
|
|
|
boolean forceOverwrite,
|
|
|
- int localBehaviour) {
|
|
|
+ int localBehaviour,
|
|
|
+ Context context) {
|
|
|
if (account == null)
|
|
|
throw new IllegalArgumentException("Illegal NULL account in UploadFileOperation creation");
|
|
|
if (file == null)
|
|
@@ -95,11 +105,13 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
mAccount = account;
|
|
|
mFile = file;
|
|
|
mRemotePath = file.getRemotePath();
|
|
|
+ mChunked = chunked;
|
|
|
mIsInstant = isInstant;
|
|
|
mForceOverwrite = forceOverwrite;
|
|
|
mLocalBehaviour = localBehaviour;
|
|
|
mOriginalStoragePath = mFile.getStoragePath();
|
|
|
mOriginalFileName = mFile.getFileName();
|
|
|
+ mContext = context;
|
|
|
}
|
|
|
|
|
|
public Account getAccount() {
|
|
@@ -199,7 +211,7 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
// !!!
|
|
|
expectedFile = new File(expectedPath);
|
|
|
|
|
|
- // / check location of local file; if not the expected, copy to a
|
|
|
+ // check location of local file; if not the expected, copy to a
|
|
|
// temporal file before upload (if COPY is the expected behaviour)
|
|
|
if (!mOriginalStoragePath.equals(expectedPath) && mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_COPY) {
|
|
|
|
|
@@ -260,19 +272,23 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
}
|
|
|
localCopyPassed = true;
|
|
|
|
|
|
- // / perform the upload
|
|
|
- synchronized (mCancellationRequested) {
|
|
|
- if (mCancellationRequested.get()) {
|
|
|
- throw new OperationCancelledException();
|
|
|
- } else {
|
|
|
- mPutMethod = new PutMethod(client.getBaseUri() + WebdavUtils.encodePath(mFile.getRemotePath()));
|
|
|
- }
|
|
|
+ /// perform the upload
|
|
|
+ if (mChunked) {
|
|
|
+ mUploadOperation = new ChunkedUploadRemoteFileOperation(mFile.getStoragePath(), mFile.getRemotePath(),
|
|
|
+ mFile.getMimetype());
|
|
|
+ } else {
|
|
|
+ mUploadOperation = new UploadRemoteFileOperation(mFile.getStoragePath(), mFile.getRemotePath(),
|
|
|
+ mFile.getMimetype());
|
|
|
+ }
|
|
|
+ Iterator <OnDatatransferProgressListener> listener = mDataTransferListeners.iterator();
|
|
|
+ while (listener.hasNext()) {
|
|
|
+ mUploadOperation.addDatatransferProgressListener(listener.next());
|
|
|
}
|
|
|
- int status = uploadFile(client);
|
|
|
+ result = mUploadOperation.execute(client);
|
|
|
|
|
|
- // / move local temporal file or original file to its corresponding
|
|
|
+ /// move local temporal file or original file to its corresponding
|
|
|
// location in the ownCloud local folder
|
|
|
- if (isSuccess(status)) {
|
|
|
+ if (result.isSuccess()) {
|
|
|
if (mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_FORGET) {
|
|
|
mFile.setStoragePath(null);
|
|
|
|
|
@@ -305,8 +321,6 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- result = new RemoteOperationResult(isSuccess(status), status, (mPutMethod != null ? mPutMethod.getResponseHeaders() : null));
|
|
|
-
|
|
|
} catch (Exception e) {
|
|
|
// TODO something cleaner with cancellations
|
|
|
if (mCancellationRequested.get()) {
|
|
@@ -358,28 +372,28 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
mFile = newFile;
|
|
|
}
|
|
|
|
|
|
- public boolean isSuccess(int status) {
|
|
|
- return ((status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED || status == HttpStatus.SC_NO_CONTENT));
|
|
|
- }
|
|
|
-
|
|
|
- protected int uploadFile(WebdavClient client) throws HttpException, IOException, OperationCancelledException {
|
|
|
- int status = -1;
|
|
|
- try {
|
|
|
- File f = new File(mFile.getStoragePath());
|
|
|
- mEntity = new FileRequestEntity(f, getMimeType());
|
|
|
- synchronized (mDataTransferListeners) {
|
|
|
- ((ProgressiveDataTransferer)mEntity).addDatatransferProgressListeners(mDataTransferListeners);
|
|
|
- }
|
|
|
- mPutMethod.setRequestEntity(mEntity);
|
|
|
- status = client.executeMethod(mPutMethod);
|
|
|
- client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
|
|
|
-
|
|
|
- } finally {
|
|
|
- mPutMethod.releaseConnection(); // let the connection available for
|
|
|
- // other methods
|
|
|
- }
|
|
|
- return status;
|
|
|
- }
|
|
|
+// public boolean isSuccess(int status) {
|
|
|
+// return ((status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED || status == HttpStatus.SC_NO_CONTENT));
|
|
|
+// }
|
|
|
+//
|
|
|
+// protected int uploadFile(WebdavClient client) throws HttpException, IOException, OperationCancelledException {
|
|
|
+// int status = -1;
|
|
|
+// try {
|
|
|
+// File f = new File(mFile.getStoragePath());
|
|
|
+// mEntity = new FileRequestEntity(f, getMimeType());
|
|
|
+// synchronized (mDataTransferListeners) {
|
|
|
+// ((ProgressiveDataTransferer)mEntity).addDatatransferProgressListeners(mDataTransferListeners);
|
|
|
+// }
|
|
|
+// mPutMethod.setRequestEntity(mEntity);
|
|
|
+// status = client.executeMethod(mPutMethod);
|
|
|
+// client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
|
|
|
+//
|
|
|
+// } finally {
|
|
|
+// mPutMethod.releaseConnection(); // let the connection available for
|
|
|
+// // other methods
|
|
|
+// }
|
|
|
+// return status;
|
|
|
+// }
|
|
|
|
|
|
/**
|
|
|
* Checks if remotePath does not exist in the server and returns it, or adds
|
|
@@ -389,7 +403,7 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
* @return
|
|
|
*/
|
|
|
private String getAvailableRemotePath(WebdavClient wc, String remotePath) throws Exception {
|
|
|
- boolean check = wc.existsFile(remotePath);
|
|
|
+ boolean check = existsFile(wc, remotePath);
|
|
|
if (!check) {
|
|
|
return remotePath;
|
|
|
}
|
|
@@ -404,10 +418,12 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
int count = 2;
|
|
|
do {
|
|
|
suffix = " (" + count + ")";
|
|
|
- if (pos >= 0)
|
|
|
- check = wc.existsFile(remotePath + suffix + "." + extension);
|
|
|
- else
|
|
|
- check = wc.existsFile(remotePath + suffix);
|
|
|
+ if (pos >= 0) {
|
|
|
+ check = existsFile(wc, remotePath + suffix + "." + extension);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ check = existsFile(wc, remotePath + suffix);
|
|
|
+ }
|
|
|
count++;
|
|
|
} while (check);
|
|
|
|
|
@@ -418,12 +434,14 @@ public class UploadFileOperation extends RemoteOperation {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private boolean existsFile(WebdavClient client, String remotePath){
|
|
|
+ ExistenceCheckRemoteOperation existsOperation = new ExistenceCheckRemoteOperation(remotePath, mContext, false);
|
|
|
+ RemoteOperationResult result = existsOperation.execute(client);
|
|
|
+ return result.isSuccess();
|
|
|
+ }
|
|
|
+
|
|
|
public void cancel() {
|
|
|
- synchronized (mCancellationRequested) {
|
|
|
- mCancellationRequested.set(true);
|
|
|
- if (mPutMethod != null)
|
|
|
- mPutMethod.abort();
|
|
|
- }
|
|
|
+ mUploadOperation.cancel();
|
|
|
}
|
|
|
|
|
|
}
|