diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2024-11-09 18:43:29 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2024-11-09 18:43:29 +0100 |
| commit | 6e6cbe2a611203ef651878dbfe97eb7ce5fda516 (patch) | |
| tree | 53808ae0eb5151f8e2c94fbc4ca1d6dd1040b3f7 /libs/documents/src | |
| parent | 78219cc5219b364b17df48bd20e636bcfec39cc4 (diff) | |
documents: Allow many methods to take a path, not just a name
Can't create entries with "/" in for the other backends, so they
will resolve the path. documents would not. Change that so they
are more similar.
Diffstat (limited to 'libs/documents/src')
2 files changed, 78 insertions, 2 deletions
diff --git a/libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt b/libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt index c9e0782..accd0db 100644 --- a/libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt +++ b/libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt @@ -148,6 +148,36 @@ class DocumentTreeAndroidTest : TreeAbstractTest() { runTest { super.unicodeFilename() } } + @Test + override fun openDirInDir() { + runTest { super.openDirInDir() } + } + + @Test + override fun openFileInDir() { + runTest { super.openFileInDir() } + } + + @Test + override fun createDirInDir() { + runTest { super.createDirInDir() } + } + + @Test + override fun createFileInDir() { + runTest { super.createFileInDir() } + } + + @Test + override fun removeDirInDir() { + runTest { super.removeDirInDir() } + } + + @Test + override fun removeFileInDir() { + runTest { super.removeFileInDir() } + } + override fun supportSymlinks() = false override fun idle() { diff --git a/libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt b/libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt index 23ffad9..613118d 100644 --- a/libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt +++ b/libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt @@ -62,13 +62,27 @@ internal open class DocumentDirectory( } override fun modifiableOpenDir(name: String): ModifiableDirectory? { - val childMetadata = findChild(name) ?: return null + val parts = name.split('/') + val childMetadata = findChild(parts[0]) ?: return null if (!childMetadata.isDir()) return null val childTreeUri = DocumentsContract.buildChildDocumentsUriUsingTree(treeUri, childMetadata.documentId) - return DocumentDirectory(contentResolver, childTreeUri, childMetadata, liveUpdateInterval) + var dir: ModifiableDirectory = + DocumentDirectory(contentResolver, childTreeUri, childMetadata, liveUpdateInterval) + for (i in 1..<parts.size) { + dir = dir.modifiableOpenDir(parts[i]) ?: return null + } + return dir } override fun modifiableOpenFile(name: String): ModifiableFile? { + val parts = name.split('/') + if (parts.size > 1) { + var dir: ModifiableDirectory = this + for (i in 0..<parts.size-1) { + dir = dir.modifiableOpenDir(parts[i]) ?: return null + } + return dir.modifiableOpenFile(parts.last()) + } val childMetadata = findChild(name) ?: return null if (childMetadata.isDir()) return null val documentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, childMetadata.documentId) @@ -104,6 +118,14 @@ internal open class DocumentDirectory( override fun createDirectory(name: String): ModifiableDirectory { if (!metadata.supportsCreate()) throw IOException("Directory doesn't support creation") + val parts = name.split('/') + if (parts.size > 1) { + var dir: ModifiableDirectory = this + for (i in 0..<parts.size-1) { + dir = dir.modifiableOpenDir(parts[i]) ?: throw IOException("Path does not exist") + } + return dir.createDirectory(parts.last()) + } if (findChild(name) != null) throw FileAlreadyExistsException(name) val documentUri = DocumentsContract.createDocument( contentResolver, @@ -120,6 +142,14 @@ internal open class DocumentDirectory( override fun createFile(name: String): ModifiableFile { if (!metadata.supportsCreate()) throw IOException("Directory doesn't support creation") + val parts = name.split('/') + if (parts.size > 1) { + var dir: ModifiableDirectory = this + for (i in 0..<parts.size-1) { + dir = dir.modifiableOpenDir(parts[i]) ?: throw IOException("Path does not exist") + } + return dir.createFile(parts.last()) + } if (findChild(name) != null) throw FileAlreadyExistsException(name) // TODO: Handle .tar.gz and such? Is it worth it (will android find them anyway) val dotIndex = name.lastIndexOf('.') @@ -211,6 +241,14 @@ internal open class DocumentDirectory( } override fun removeDirectory(name: String): Boolean { + val parts = name.split('/') + if (parts.size > 1) { + var dir: ModifiableDirectory = this + for (i in 0..<parts.size - 1) { + dir = dir.modifiableOpenDir(parts[i]) ?: return false + } + return dir.removeDirectory(parts.last()) + } val childMetadata = findChild(name) ?: return false if (!childMetadata.isDir()) return false val childUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, childMetadata.documentId) @@ -220,6 +258,14 @@ internal open class DocumentDirectory( } override fun removeFile(name: String): Boolean { + val parts = name.split('/') + if (parts.size > 1) { + var dir: ModifiableDirectory = this + for (i in 0..<parts.size - 1) { + dir = dir.modifiableOpenDir(parts[i]) ?: return false + } + return dir.removeFile(parts.last()) + } val childMetadata = findChild(name) ?: return false if (childMetadata.isDir()) return false val documentUri = DocumentsContract.buildDocumentUriUsingTree( |
