From d81ca97f14282692e9a18f7ae0a71eb2e8dcca76 Mon Sep 17 00:00:00 2001 From: Manuel Plazas Palacio Date: Wed, 31 May 2023 17:46:06 +0200 Subject: [PATCH 1/3] Showing decision dialog when copying file conflict. --- .../lib/resources/files/CopyRemoteFileOperation.kt | 8 ++++++-- .../android/lib/resources/files/services/FileService.kt | 3 ++- .../files/services/implementation/OCFileService.kt | 4 +++- 3 files changed, 11 insertions(+), 4 deletions(-) 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 949d72e9..c4fdd5da 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 @@ -54,6 +54,7 @@ class CopyRemoteFileOperation( private val targetRemotePath: String, private val sourceSpaceWebDavUrl: String? = null, private val targetSpaceWebDavUrl: String? = null, + private val forceOverride: Boolean = false, ) : RemoteOperation() { /** @@ -74,8 +75,9 @@ class CopyRemoteFileOperation( var result: RemoteOperationResult try { val copyMethod = CopyMethod( - URL((sourceSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(sourceRemotePath)), - (targetSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath), + url = URL((sourceSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(sourceRemotePath)), + destinationUrl = (targetSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath), + forceOverride = forceOverride, ).apply { setReadTimeout(COPY_READ_TIMEOUT, TimeUnit.SECONDS) setConnectionTimeout(COPY_CONNECTION_TIMEOUT, TimeUnit.SECONDS) @@ -87,6 +89,7 @@ class CopyRemoteFileOperation( result = RemoteOperationResult(ResultCode.OK) result.setData(fileRemoteId) } + isPreconditionFailed(status) -> { result = RemoteOperationResult(ResultCode.INVALID_OVERWRITE) client.exhaustResponse(copyMethod.getResponseBodyAsStream()) @@ -94,6 +97,7 @@ class CopyRemoteFileOperation( /// 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(copyMethod) client.exhaustResponse(copyMethod.getResponseBodyAsStream()) 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 b524dc3f..d92d7dc2 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 @@ -39,7 +39,8 @@ interface FileService : Service { targetRemotePath: String, sourceSpaceWebDavUrl: String?, targetSpaceWebDavUrl: String?, - ): RemoteOperationResult + replace: Boolean, + ): RemoteOperationResult fun createFolder( remotePath: String, 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 7b86a4fa..170bcfab 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 @@ -54,12 +54,14 @@ class OCFileService(override val client: OwnCloudClient) : FileService { targetRemotePath: String, sourceSpaceWebDavUrl: String?, targetSpaceWebDavUrl: String?, - ): RemoteOperationResult = + replace: Boolean, + ): RemoteOperationResult = CopyRemoteFileOperation( sourceRemotePath = sourceRemotePath, targetRemotePath = targetRemotePath, sourceSpaceWebDavUrl = sourceSpaceWebDavUrl, targetSpaceWebDavUrl = targetSpaceWebDavUrl, + forceOverride = replace, ).execute(client) override fun createFolder( From 5b64876e2c59028f69c6e42dedb8d7c575f48127 Mon Sep 17 00:00:00 2001 From: Manuel Plazas Palacio Date: Tue, 6 Jun 2023 11:16:25 +0200 Subject: [PATCH 2/3] Showing decision dialog when moving file conflict. Solving errors when copying, replace and keep both. --- .../lib/common/http/methods/webdav/CopyMethod.kt | 2 +- .../lib/common/http/methods/webdav/MoveMethod.kt | 2 +- .../lib/resources/files/CopyRemoteFileOperation.kt | 10 ++++++++++ .../lib/resources/files/MoveRemoteFileOperation.kt | 11 +++++++++++ .../lib/resources/files/services/FileService.kt | 1 + .../files/services/implementation/OCFileService.kt | 2 ++ 6 files changed, 26 insertions(+), 2 deletions(-) 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( From fa143804d20a8c580dd332faeee623b7b2b701ab Mon Sep 17 00:00:00 2001 From: Manuel Plazas Palacio Date: Thu, 8 Jun 2023 13:31:09 +0200 Subject: [PATCH 3/3] Solving CR changes. --- .../android/lib/resources/files/CopyRemoteFileOperation.kt | 3 ++- .../android/lib/resources/files/MoveRemoteFileOperation.kt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) 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 89c7ab94..3f0990c6 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 @@ -45,6 +45,7 @@ import java.util.concurrent.TimeUnit * @author Christian Schabesberger * @author David González V. * @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. @@ -113,7 +114,7 @@ class CopyRemoteFileOperation( } private fun addRequestHeaders(copyMethod: CopyMethod) { - //Adding this because the library has an error whit override + //Adding this because the library has an error with override if (copyMethod.forceOverride) { copyMethod.setRequestHeader(OVERWRITE, TRUE) } 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 0646c239..6f9fb3d2 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 @@ -130,7 +130,7 @@ 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 + //Adding this because the library has an error with override if (moveMethod.forceOverride) { moveMethod.setRequestHeader(OVERWRITE, TRUE) }