Skip to content
Snippets Groups Projects
Verified Commit c750a353 authored by Torsten Grote's avatar Torsten Grote
Browse files

Add FileProvider interface for cross-platform File access

parent e8c3e899
No related branches found
No related tags found
1 merge request!28Implement file management API
package org.briarproject.mailbox.android package org.briarproject.mailbox.android
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context.MODE_PRIVATE
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import org.briarproject.mailbox.core.CoreModule import org.briarproject.mailbox.core.CoreModule
import org.briarproject.mailbox.core.db.DatabaseConfig import org.briarproject.mailbox.core.db.DatabaseConfig
import org.briarproject.mailbox.core.files.FileProvider
import java.io.File import java.io.File
import javax.inject.Singleton import javax.inject.Singleton
...@@ -23,7 +24,18 @@ internal class AppModule { ...@@ -23,7 +24,18 @@ internal class AppModule {
@Provides @Provides
fun provideDatabaseConfig(app: Application) = object : DatabaseConfig { fun provideDatabaseConfig(app: Application) = object : DatabaseConfig {
override fun getDatabaseDirectory(): File { override fun getDatabaseDirectory(): File {
return app.applicationContext.getDir("db", Context.MODE_PRIVATE) return app.applicationContext.getDir("db", MODE_PRIVATE)
} }
} }
@Singleton
@Provides
fun provideFileProvider(app: Application) = object : FileProvider {
private val tempFilesDir = File(app.applicationContext.cacheDir, "tmp").also { it.mkdirs() }
private val filesDir = app.applicationContext.getDir("folders", MODE_PRIVATE)
override fun getTemporaryFile(fileId: String) = File(tempFilesDir, fileId)
override fun getFolder(folderId: String) = File(filesDir, folderId).also { it.mkdirs() }
override fun getFile(folderId: String, fileId: String) = File(getFolder(folderId), fileId)
}
} }
...@@ -7,6 +7,7 @@ import dagger.hilt.components.SingletonComponent ...@@ -7,6 +7,7 @@ import dagger.hilt.components.SingletonComponent
import org.briarproject.mailbox.core.CoreModule import org.briarproject.mailbox.core.CoreModule
import org.briarproject.mailbox.core.db.DatabaseConfig import org.briarproject.mailbox.core.db.DatabaseConfig
import org.briarproject.mailbox.core.event.DefaultEventExecutorModule import org.briarproject.mailbox.core.event.DefaultEventExecutorModule
import org.briarproject.mailbox.core.files.FileProvider
import org.briarproject.mailbox.core.system.DefaultTaskSchedulerModule import org.briarproject.mailbox.core.system.DefaultTaskSchedulerModule
import org.briarproject.mailbox.core.tor.JavaTorModule import org.briarproject.mailbox.core.tor.JavaTorModule
import org.briarproject.mailbox.core.util.LogUtils.info import org.briarproject.mailbox.core.util.LogUtils.info
...@@ -41,22 +42,7 @@ internal class JavaCliModule { ...@@ -41,22 +42,7 @@ internal class JavaCliModule {
private const val DATAHOME_SUBDIR = "briar-mailbox" private const val DATAHOME_SUBDIR = "briar-mailbox"
} }
@Singleton private val dataDir: File by lazy {
@Provides
fun provideDatabaseConfig() = object : DatabaseConfig {
override fun getDatabaseDirectory(): File {
val dataDir = getDataDir()
val dbDir = File(dataDir, "db")
if (!dbDir.exists() && !dbDir.mkdirs()) {
throw IOException("dbDir could not be created: ${dbDir.absolutePath}")
} else if (!dbDir.isDirectory) {
throw IOException("dbDir is not a directory: ${dbDir.absolutePath}")
}
return dbDir
}
}
private fun getDataDir(): File {
val dataHome = when (val custom = System.getenv("XDG_DATA_HOME").orEmpty()) { val dataHome = when (val custom = System.getenv("XDG_DATA_HOME").orEmpty()) {
"" -> File(DEFAULT_DATAHOME) "" -> File(DEFAULT_DATAHOME)
else -> File(custom) else -> File(custom)
...@@ -79,7 +65,32 @@ internal class JavaCliModule { ...@@ -79,7 +65,32 @@ internal class JavaCliModule {
setPosixFilePermissions(dataDir.toPath(), perms) setPosixFilePermissions(dataDir.toPath(), perms)
LOG.info { "Datadir set to: ${dataDir.absolutePath}" } LOG.info { "Datadir set to: ${dataDir.absolutePath}" }
return dataDir dataDir
}
@Singleton
@Provides
fun provideDatabaseConfig() = object : DatabaseConfig {
override fun getDatabaseDirectory(): File {
val dbDir = File(dataDir, "db")
if (!dbDir.exists() && !dbDir.mkdirs()) {
throw IOException("dbDir could not be created: ${dbDir.absolutePath}")
} else if (!dbDir.isDirectory) {
throw IOException("dbDir is not a directory: ${dbDir.absolutePath}")
}
return dbDir
}
}
@Singleton
@Provides
fun provideFileProvider() = object : FileProvider {
private val tempFilesDir = File(dataDir, "tmp").also { it.mkdirs() }
private val filesDir = File(dataDir, "folders").also { it.mkdirs() }
override fun getTemporaryFile(fileId: String) = File(tempFilesDir, fileId)
override fun getFolder(folderId: String) = File(filesDir, folderId).also { it.mkdirs() }
override fun getFile(folderId: String, fileId: String) = File(getFolder(folderId), fileId)
} }
} }
package org.briarproject.mailbox.core.files
import java.io.File
interface FileProvider {
fun getTemporaryFile(fileId: String): File
fun getFolder(folderId: String): File
fun getFile(folderId: String, fileId: String): File
}
...@@ -6,6 +6,7 @@ import dagger.hilt.InstallIn ...@@ -6,6 +6,7 @@ import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import org.briarproject.mailbox.core.db.DatabaseConfig import org.briarproject.mailbox.core.db.DatabaseConfig
import org.briarproject.mailbox.core.db.DatabaseModule import org.briarproject.mailbox.core.db.DatabaseModule
import org.briarproject.mailbox.core.files.FileProvider
import org.briarproject.mailbox.core.lifecycle.LifecycleModule import org.briarproject.mailbox.core.lifecycle.LifecycleModule
import org.briarproject.mailbox.core.server.WebServerModule import org.briarproject.mailbox.core.server.WebServerModule
import org.briarproject.mailbox.core.settings.SettingsModule import org.briarproject.mailbox.core.settings.SettingsModule
...@@ -35,4 +36,15 @@ internal class TestModule(private val tempDir: File) { ...@@ -35,4 +36,15 @@ internal class TestModule(private val tempDir: File) {
return File(tempDir, "db") return File(tempDir, "db")
} }
} }
@Singleton
@Provides
fun provideFileProvider() = object : FileProvider {
private val tempFilesDir = File(tempDir, "tmp").also { it.mkdirs() }
private val filesDir = File(tempDir, "folders")
override fun getTemporaryFile(fileId: String) = File(tempFilesDir, fileId)
override fun getFolder(folderId: String) = File(filesDir, folderId).also { it.mkdirs() }
override fun getFile(folderId: String, fileId: String) = File(getFolder(folderId), fileId)
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment