From d41f82b99e405e1b6ef2e75d32efa31d91893824 Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Thu, 22 Aug 2024 00:08:33 +0200 Subject: Add AutoClosable to Tree interface Some backends have resources to free, such as the SambaTree. --- libs/io/src/main/java/org/the_jk/cleversync/io/Tree.kt | 2 +- .../main/java/org/the_jk/cleversync/io/local/PathTree.kt | 1 + .../org/the_jk/cleversync/io/samba/SambaConnection.kt | 16 ++++++++++++++-- .../java/org/the_jk/cleversync/io/samba/SambaTree.kt | 4 ++++ .../java/org/the_jk/cleversync/samba/SambaTreeFactory.kt | 6 +++++- 5 files changed, 25 insertions(+), 4 deletions(-) (limited to 'libs') diff --git a/libs/io/src/main/java/org/the_jk/cleversync/io/Tree.kt b/libs/io/src/main/java/org/the_jk/cleversync/io/Tree.kt index b6f2d54..69980c2 100644 --- a/libs/io/src/main/java/org/the_jk/cleversync/io/Tree.kt +++ b/libs/io/src/main/java/org/the_jk/cleversync/io/Tree.kt @@ -2,6 +2,6 @@ package org.the_jk.cleversync.io import android.content.res.Resources -interface Tree : Directory { +interface Tree : Directory, AutoCloseable { fun description(resources: Resources): CharSequence } diff --git a/libs/local/src/main/java/org/the_jk/cleversync/io/local/PathTree.kt b/libs/local/src/main/java/org/the_jk/cleversync/io/local/PathTree.kt index 23442a1..409701c 100644 --- a/libs/local/src/main/java/org/the_jk/cleversync/io/local/PathTree.kt +++ b/libs/local/src/main/java/org/the_jk/cleversync/io/local/PathTree.kt @@ -7,4 +7,5 @@ import java.nio.file.Path internal class PathTree(root: Path) : PathDirectory(root, PathWatcher()), ModifiableTree { override fun description(resources: Resources) = resources.getString(R.string.local_directory) + override fun close() = Unit } diff --git a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt index 04aff44..0b62b61 100644 --- a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt +++ b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaConnection.kt @@ -3,11 +3,23 @@ package org.the_jk.cleversync.io.samba internal class SambaConnection(uri: String, credentials: SambaCredentials) { private val context = NativeSamba.newContext() private val url = context.parseUrl(uri) + private var destroyed = false - val connected = if (url != null) { context.connect(url, credentials) } else false + val connected = if (url != null && !destroyed) { context.connect(url, credentials) } else false val error: String - get() = context.lastError() + get() = if (destroyed) "[destroyed]" else context.lastError() + + protected fun finalize() { + destroy() + } + + fun destroy() { + if (destroyed) return + url?.destroy() + context.destroy() + destroyed = true + } fun openDir(path: String): NativeSamba.Dir? = if (connected) context.openDir(join(url!!.path(), path)) else null diff --git a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt index 762a61f..3667a74 100644 --- a/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt +++ b/libs/samba/src/main/java/org/the_jk/cleversync/io/samba/SambaTree.kt @@ -7,4 +7,8 @@ internal class SambaTree(conn: SambaConnection, root: String) : SambaDirectory(c override fun description(resources: Resources): CharSequence { TODO("Not yet implemented") } + + override fun close() { + conn.destroy() + } } diff --git a/libs/samba/src/main/java/org/the_jk/cleversync/samba/SambaTreeFactory.kt b/libs/samba/src/main/java/org/the_jk/cleversync/samba/SambaTreeFactory.kt index ebf47d2..23b9769 100644 --- a/libs/samba/src/main/java/org/the_jk/cleversync/samba/SambaTreeFactory.kt +++ b/libs/samba/src/main/java/org/the_jk/cleversync/samba/SambaTreeFactory.kt @@ -11,7 +11,11 @@ object SambaTreeFactory { fun modifiableTree(uri: String, credentials: SambaCredentials): Result { val connection = SambaConnection(uri, credentials) - if (!connection.connected) return Result.failure(Exception(connection.error)) + if (!connection.connected) { + val e = Exception(connection.error) + connection.destroy() + return Result.failure(e) + } return Result.success(SambaTree(connection, "")) } } -- cgit v1.2.3-70-g09d2