From c8a0451e0656c7f0d741017d1ffe7d8766512d04 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 3 Jul 2018 10:57:58 +0200 Subject: [PATCH] Implement move method and finish basic chunked uploads --- .../lib/common/http/methods/webdav/MoveMethod.java | 9 ++++++++- .../lib/common/network/ChunkFromFileRequestBody.java | 12 +++++++++++- .../files/ChunkedUploadRemoteFileOperation.java | 11 +++-------- .../files/ExistenceCheckRemoteOperation.java | 4 ++-- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java b/src/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java index 45012af2..48861c6b 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java +++ b/src/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java @@ -1,5 +1,7 @@ package com.owncloud.android.lib.common.http.methods.webdav; +import com.owncloud.android.lib.common.http.HttpConstants; + import at.bitfire.dav4android.exception.UnauthorizedException; import okhttp3.HttpUrl; @@ -16,7 +18,12 @@ public class MoveMethod extends DavMethod { @Override public int execute() throws Exception { try { - mDavResource.move(destinationUrl, forceOverride); + mDavResource.move( + destinationUrl, + forceOverride, + super.getRequestHeader(HttpConstants.OC_TOTAL_LENGTH_HEADER), + super.getRequestHeader(HttpConstants.OC_X_OC_MTIME_HEADER) + ); mRequest = mDavResource.getRequest(); mResponse = mDavResource.getResponse(); diff --git a/src/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java b/src/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java index e78fd153..63ee682f 100644 --- a/src/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java +++ b/src/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java @@ -29,6 +29,7 @@ import android.util.Log; import com.owncloud.android.lib.common.utils.Log_OC; import java.io.File; +import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.Iterator; @@ -68,7 +69,11 @@ public class ChunkFromFileRequestBody extends FileRequestBody { @Override public long contentLength() { - return mChunkSize; + try { + return Math.min(mChunkSize, mChannel.size() - mChannel.position()); + } catch (IOException e) { + return mChunkSize; + } } @Override @@ -83,6 +88,7 @@ public class ChunkFromFileRequestBody extends FileRequestBody { long maxCount = Math.min(mOffset + mChunkSize, mChannel.size()); while (mChannel.position() < maxCount) { + Log_OC.d(TAG, "Sink buffer size: " + sink.buffer().size()); readCount = mChannel.read(mBuffer); @@ -122,4 +128,8 @@ public class ChunkFromFileRequestBody extends FileRequestBody { // } } } + + public void setOffset(long offset) { + this.mOffset = offset; + } } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java index 00ead627..2da93b78 100644 --- a/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java @@ -52,7 +52,6 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation { private static final int LAST_CHUNK_TIMEOUT = 900000; //15 mins. - public static final long CHUNK_SIZE = 1024000; private static final String TAG = ChunkedUploadRemoteFileOperation.class.getSimpleName(); @@ -66,9 +65,8 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation @Override protected RemoteOperationResult uploadFile(OwnCloudClient client) throws IOException { - int status = -1; + int status; RemoteOperationResult result = null; - FileChannel channel = null; RandomAccessFile raf = null; @@ -89,7 +87,6 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation String uriPrefix = client.getNewUploadsWebDavUri() + FileUtils.PATH_SEPARATOR + String.valueOf(mTransferId); long totalLength = fileToUpload.length(); long chunkCount = (long) Math.ceil((double) totalLength / CHUNK_SIZE); - String totalLengthStr = String.valueOf(fileToUpload.length()); for (int chunkIndex = 0; chunkIndex < chunkCount; chunkIndex++, offset += CHUNK_SIZE) { mPutMethod = new PutMethod( @@ -100,8 +97,8 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation mPutMethod.addRequestHeader(IF_MATCH_HEADER, "\"" + mRequiredEtag + "\""); } -// ((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset); -// mPutMethod.setRequestEntity(mEntity); + ((ChunkFromFileRequestBody) mFileRequestBody).setOffset(offset); + // if (mCancellationRequested.get()) { // mPutMethod.abort(); // // next method will throw an exception @@ -137,8 +134,6 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation channel.close(); if (raf != null) raf.close(); -// if (mPutMethod != null) -// mPutMethod.releaseConnection(); // let the connection available for other methods } return result; } diff --git a/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java b/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java index cc6da844..456a7425 100644 --- a/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java @@ -115,14 +115,14 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation { ? new RemoteOperationResult(OK) : new RemoteOperationResult(propfindMethod); - Log_OC.d(TAG, "Existence check for " + client.getOldFilesWebdavUri() + + Log_OC.d(TAG, "Existence check for " + client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mPath) + " targeting for " + (mSuccessIfAbsent ? " absence " : " existence ") + "finished with HTTP status " + status + (!isSuccess(status) ? "(FAIL)" : "")); } catch (Exception e) { result = new RemoteOperationResult(e); - Log_OC.e(TAG, "Existence check for " + client.getOldFilesWebdavUri() + + Log_OC.e(TAG, "Existence check for " + client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mPath) + " targeting for " + (mSuccessIfAbsent ? " absence " : " existence ") + ": " + result.getLogMessage(), result.getException());