From a2bf79ef1243bcbe4a2c0bb998824a811836c398 Mon Sep 17 00:00:00 2001 From: Michael Totschnig Date: Wed, 18 Dec 2024 20:24:47 +0100 Subject: [PATCH] Robustness: If possible, do not chock on 0-lenght resources remove unused return value of saveFileContents --- .../drive/sync/GoogleDriveBackendProvider.kt | 8 +++++--- .../dropbox/sync/DropboxBackendProvider.kt | 4 ++-- .../myexpenses/sync/AbstractSyncBackendProvider.kt | 2 +- .../sync/StorageAccessFrameworkBackendProvider.kt | 9 ++++----- .../onedrive/sync/OneDriveBackendProvider.kt | 6 +++--- .../totschnig/webdav/sync/WebDavBackendProvider.kt | 14 ++++++-------- 6 files changed, 21 insertions(+), 22 deletions(-) diff --git a/drive/src/main/java/org/totschnig/drive/sync/GoogleDriveBackendProvider.kt b/drive/src/main/java/org/totschnig/drive/sync/GoogleDriveBackendProvider.kt index 4561bdf28b..6dc8be08eb 100644 --- a/drive/src/main/java/org/totschnig/drive/sync/GoogleDriveBackendProvider.kt +++ b/drive/src/main/java/org/totschnig/drive/sync/GoogleDriveBackendProvider.kt @@ -115,7 +115,7 @@ class GoogleDriveBackendProvider internal constructor( fileContents: String, mimeType: String, maybeEncrypt: Boolean - ): File { + ) { val base = if (toAccountDir) accountFolder else baseFolder val driveFolder = if (folder == null) base else { getResInAccountDir(folder) ?: driveServiceHelper.createFolder( @@ -125,7 +125,6 @@ class GoogleDriveBackendProvider internal constructor( ) } saveFileContents(driveFolder, fileName, fileContents, mimeType, maybeEncrypt) - return driveFolder } @Throws(IOException::class) @@ -239,7 +238,10 @@ class GoogleDriveBackendProvider internal constructor( } override fun childrenForCollection(folder: File?) = - driveServiceHelper.listChildren(folder ?: accountFolder) + driveServiceHelper.listChildren(folder ?: accountFolder).filter { + @Suppress("UsePropertyAccessSyntax") + it.getSize() > 0 + } override fun nameForResource(resource: File): String? = resource.name diff --git a/dropbox/src/main/java/org/totschnig/dropbox/sync/DropboxBackendProvider.kt b/dropbox/src/main/java/org/totschnig/dropbox/sync/DropboxBackendProvider.kt index b6e2e6eaa3..d3f30d59ac 100644 --- a/dropbox/src/main/java/org/totschnig/dropbox/sync/DropboxBackendProvider.kt +++ b/dropbox/src/main/java/org/totschnig/dropbox/sync/DropboxBackendProvider.kt @@ -242,7 +242,7 @@ class DropboxBackendProvider internal constructor(context: Context, folderName: fileContents: String, mimeType: String, maybeEncrypt: Boolean - ): Metadata { + ) { val base = if (toAccountDir) accountPath else basePath val path = if (folder == null) { base @@ -251,7 +251,7 @@ class DropboxBackendProvider internal constructor(context: Context, folderName: requireFolder(it) } } - return saveInputStream("$path/$fileName", toInputStream(fileContents, maybeEncrypt)) + saveInputStream("$path/$fileName", toInputStream(fileContents, maybeEncrypt)) } @Throws(IOException::class) diff --git a/myExpenses/src/main/java/org/totschnig/myexpenses/sync/AbstractSyncBackendProvider.kt b/myExpenses/src/main/java/org/totschnig/myexpenses/sync/AbstractSyncBackendProvider.kt index afcd297f31..ff1ccfabae 100644 --- a/myExpenses/src/main/java/org/totschnig/myexpenses/sync/AbstractSyncBackendProvider.kt +++ b/myExpenses/src/main/java/org/totschnig/myexpenses/sync/AbstractSyncBackendProvider.kt @@ -413,7 +413,7 @@ abstract class AbstractSyncBackendProvider(protected val context: Context) fileContents: String, mimeType: String, maybeEncrypt: Boolean - ): Res + ) protected abstract fun readFileContents( fromAccountDir: Boolean, diff --git a/myExpenses/src/main/java/org/totschnig/myexpenses/sync/StorageAccessFrameworkBackendProvider.kt b/myExpenses/src/main/java/org/totschnig/myexpenses/sync/StorageAccessFrameworkBackendProvider.kt index fa4fb053a1..2905b5309e 100644 --- a/myExpenses/src/main/java/org/totschnig/myexpenses/sync/StorageAccessFrameworkBackendProvider.kt +++ b/myExpenses/src/main/java/org/totschnig/myexpenses/sync/StorageAccessFrameworkBackendProvider.kt @@ -110,7 +110,7 @@ class StorageAccessFrameworkBackendProvider internal constructor(context: Contex baseDir.getFolder(collectionName, require) override fun childrenForCollection(folder: DocumentFile?) = - (folder ?: accountDir).listFiles().asList() + (folder ?: accountDir).listFiles().filter { it.length() > 0 } override fun nameForResource(resource: DocumentFile) = resource.name @@ -139,10 +139,10 @@ class StorageAccessFrameworkBackendProvider internal constructor(context: Contex fileContents: String, mimeType: String, maybeEncrypt: Boolean - ): DocumentFile { + ) { val base = if (toAccountDir) accountDir else baseDir val dir = if (folder == null) base else base.getFolder(folder)!! - return saveFileContents(dir, fileName, fileContents, mimeType, maybeEncrypt) + saveFileContents(dir, fileName, fileContents, mimeType, maybeEncrypt) } private fun saveFileContents( @@ -151,11 +151,10 @@ class StorageAccessFrameworkBackendProvider internal constructor(context: Contex fileContents: String, mimeType: String, maybeEncrypt: Boolean - ): DocumentFile { + ) { val file = (folder.findFile(fileName) ?: folder.createFile(mimeType, fileName) ?: throw IOException()) saveFileContents(file, fileContents, maybeEncrypt) - return file } @Throws(IOException::class) diff --git a/onedrive/src/main/java/org/totschnig/onedrive/sync/OneDriveBackendProvider.kt b/onedrive/src/main/java/org/totschnig/onedrive/sync/OneDriveBackendProvider.kt index 59037aff08..1d2f420fe5 100644 --- a/onedrive/src/main/java/org/totschnig/onedrive/sync/OneDriveBackendProvider.kt +++ b/onedrive/src/main/java/org/totschnig/onedrive/sync/OneDriveBackendProvider.kt @@ -184,13 +184,13 @@ class OneDriveBackendProvider internal constructor(context: Context, folderName: fileContents: String, mimeType: String, maybeEncrypt: Boolean - ): DriveItem { + ) { val base = if (toAccountDir) accountPath else basePath val driveFolder = if (folder == null) base else { getFolderRequestBuilder(base, folder, true) base.appendPath(folder) } - return saveInputStream( + saveInputStream( itemWithPath(driveFolder.appendPath(fileName)), toInputStream(fileContents, maybeEncrypt) ) @@ -330,7 +330,7 @@ class OneDriveBackendProvider internal constructor(context: Context, folderName: override fun childrenForCollection(folder: DriveItem?): Collection { return (folder ?: accountRes).let { itemWithId(it.id!!).children().safeGet()?.getAll() - } ?: emptyList() + }?.filter { it.size?.compareTo(0) != 0 } ?: emptyList() } override fun getInputStream(resource: DriveItem) = diff --git a/webdav/src/main/java/org/totschnig/webdav/sync/WebDavBackendProvider.kt b/webdav/src/main/java/org/totschnig/webdav/sync/WebDavBackendProvider.kt index 8a5683e537..d2052bb0c4 100644 --- a/webdav/src/main/java/org/totschnig/webdav/sync/WebDavBackendProvider.kt +++ b/webdav/src/main/java/org/totschnig/webdav/sync/WebDavBackendProvider.kt @@ -229,7 +229,7 @@ class WebDavBackendProvider @SuppressLint("MissingPermission") internal construc fileContents: String, mimeType: String, maybeEncrypt: Boolean - ): DavResource { + ) { val base = if (toAccountDir) accountRes else webDavClient.base val parent = if (folder != null) { webDavClient.mkCol(folder, base) @@ -239,18 +239,16 @@ class WebDavBackendProvider @SuppressLint("MissingPermission") internal construc } } } else base - return saveFileContents(fileName, fileContents, mimeType, maybeEncrypt, parent) + saveFileContents(fileName, fileContents, mimeType, maybeEncrypt, parent) } - private fun transform(e: HttpException): IOException? { - return if (e.cause is IOException) e.cause as IOException? else IOException(e) - } + private fun transform(e: HttpException) = e.cause as? IOException ?: IOException(e) @Throws(IOException::class) private fun saveFileContents( fileName: String, fileContents: String, mimeType: String, maybeEncrypt: Boolean, parent: DavResource - ): DavResource { + ) { val encrypt = isEncrypted && maybeEncrypt val mediaType: MediaType? = "$mimeType; charset=utf-8".toMediaTypeOrNull() val requestBody: RequestBody = if (encrypt) object : RequestBody() { @@ -269,9 +267,9 @@ class WebDavBackendProvider @SuppressLint("MissingPermission") internal construc } } else fileContents.toRequestBody(mediaType) try { - return webDavClient.upload(fileName, requestBody, parent) + webDavClient.upload(fileName, requestBody, parent) } catch (e: HttpException) { - throw transform(e)!! + throw transform(e) } }