diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.kt index 217f3ca9..dece5053 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.kt @@ -36,7 +36,7 @@ import java.net.URL class CopyMethod( val url: URL, private val destinationUrl: String, - private val forceOverride: Boolean = false + val forceOverride: Boolean = false ) : DavMethod(url) { @Throws(Exception::class) public override fun onDavExecute(davResource: DavOCResource): Int { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.kt index 8cb4c0e9..0921f180 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.kt @@ -36,7 +36,7 @@ import java.net.URL class MoveMethod( url: URL, private val destinationUrl: String, - private val forceOverride: Boolean = false + val forceOverride: Boolean = false ) : DavMethod(url) { @Throws(Exception::class) override fun onDavExecute(davResource: DavOCResource): Int { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.kt index c4fdd5da..89c7ab94 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.kt @@ -79,6 +79,7 @@ class CopyRemoteFileOperation( destinationUrl = (targetSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath), forceOverride = forceOverride, ).apply { + addRequestHeaders(this) setReadTimeout(COPY_READ_TIMEOUT, TimeUnit.SECONDS) setConnectionTimeout(COPY_CONNECTION_TIMEOUT, TimeUnit.SECONDS) } @@ -111,6 +112,13 @@ class CopyRemoteFileOperation( return result } + private fun addRequestHeaders(copyMethod: CopyMethod) { + //Adding this because the library has an error whit override + if (copyMethod.forceOverride) { + copyMethod.setRequestHeader(OVERWRITE, TRUE) + } + } + private fun isSuccess(status: Int) = status.isOneOf(HttpConstants.HTTP_CREATED, HttpConstants.HTTP_NO_CONTENT) private fun isPreconditionFailed(status: Int) = status == HttpConstants.HTTP_PRECONDITION_FAILED @@ -118,5 +126,7 @@ class CopyRemoteFileOperation( companion object { private const val COPY_READ_TIMEOUT = 10L private const val COPY_CONNECTION_TIMEOUT = 6L + private const val OVERWRITE = "overwrite" + private const val TRUE = "T" } } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.kt index 6689c5f9..0646c239 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.kt @@ -46,6 +46,7 @@ import java.util.concurrent.TimeUnit * @author David González Verdugo * @author Abel García de Prada * @author Juan Carlos Garrote Gascón + * @author Manuel Plazas Palacio * * @param sourceRemotePath Remote path of the file/folder to copy. * @param targetRemotePath Remote path desired for the file/folder to copy it. @@ -54,6 +55,7 @@ open class MoveRemoteFileOperation( private val sourceRemotePath: String, private val targetRemotePath: String, private val spaceWebDavUrl: String? = null, + private val forceOverride: Boolean = false, ) : RemoteOperation() { /** @@ -80,6 +82,7 @@ open class MoveRemoteFileOperation( val moveMethod = MoveMethod( url = URL((spaceWebDavUrl ?: srcWebDavUri.toString()) + WebdavUtils.encodePath(sourceRemotePath)), destinationUrl = (spaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath), + forceOverride = forceOverride, ).apply { addRequestHeaders(this) setReadTimeout(MOVE_READ_TIMEOUT, TimeUnit.SECONDS) @@ -92,6 +95,7 @@ open class MoveRemoteFileOperation( isSuccess(status) -> { result = RemoteOperationResult(ResultCode.OK) } + isPreconditionFailed(status) -> { result = RemoteOperationResult(ResultCode.INVALID_OVERWRITE) client.exhaustResponse(moveMethod.getResponseBodyAsStream()) @@ -99,6 +103,7 @@ open class MoveRemoteFileOperation( /// for other errors that could be explicitly handled, check first: /// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4 } + else -> { result = RemoteOperationResult(moveMethod) client.exhaustResponse(moveMethod.getResponseBodyAsStream()) @@ -125,6 +130,10 @@ open class MoveRemoteFileOperation( * In case new headers are needed, override this method */ open fun addRequestHeaders(moveMethod: MoveMethod) { + //Adding this because the library has an error whit override + if (moveMethod.forceOverride) { + moveMethod.setRequestHeader(OVERWRITE, TRUE) + } } private fun isSuccess(status: Int) = status.isOneOf(HttpConstants.HTTP_CREATED, HttpConstants.HTTP_NO_CONTENT) @@ -134,5 +143,7 @@ open class MoveRemoteFileOperation( companion object { private const val MOVE_READ_TIMEOUT = 10L private const val MOVE_CONNECTION_TIMEOUT = 6L + private const val OVERWRITE = "overwrite" + private const val TRUE = "T" } } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt index d92d7dc2..43f5c57c 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt @@ -58,6 +58,7 @@ interface FileService : Service { sourceRemotePath: String, targetRemotePath: String, spaceWebDavUrl: String?, + replace: Boolean, ): RemoteOperationResult fun readFile( diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index 170bcfab..4d110858 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -90,11 +90,13 @@ class OCFileService(override val client: OwnCloudClient) : FileService { sourceRemotePath: String, targetRemotePath: String, spaceWebDavUrl: String?, + replace: Boolean, ): RemoteOperationResult = MoveRemoteFileOperation( sourceRemotePath = sourceRemotePath, targetRemotePath = targetRemotePath, spaceWebDavUrl = spaceWebDavUrl, + forceOverride = replace, ).execute(client) override fun readFile(