summaryrefslogtreecommitdiff
path: root/libs/documents/src/main/java/org/the_jk/cleversync
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2024-11-09 18:43:29 +0100
committerJoel Klinghed <the_jk@spawned.biz>2024-11-09 18:43:29 +0100
commit6e6cbe2a611203ef651878dbfe97eb7ce5fda516 (patch)
tree53808ae0eb5151f8e2c94fbc4ca1d6dd1040b3f7 /libs/documents/src/main/java/org/the_jk/cleversync
parent78219cc5219b364b17df48bd20e636bcfec39cc4 (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/main/java/org/the_jk/cleversync')
-rw-r--r--libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt50
1 files changed, 48 insertions, 2 deletions
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(