diff --git a/core/src/androidMain/kotlin/yokai/core/archive/AndroidArchiveInputStream.kt b/core/src/androidMain/kotlin/yokai/core/archive/AndroidArchiveInputStream.kt index bf08b6974d..54d68b06ae 100644 --- a/core/src/androidMain/kotlin/yokai/core/archive/AndroidArchiveInputStream.kt +++ b/core/src/androidMain/kotlin/yokai/core/archive/AndroidArchiveInputStream.kt @@ -43,7 +43,7 @@ class AndroidArchiveInputStream(buffer: Long, size: Long) : ArchiveInputStream() Archive.readFree(archive) } - fun getNextEntry() = Archive.readNextHeader(archive).takeUnless { it == 0L }?.let { entry -> + override fun getNextEntry() = Archive.readNextHeader(archive).takeUnless { it == 0L }?.let { entry -> val name = ArchiveEntry.pathnameUtf8(entry) ?: ArchiveEntry.pathname(entry)?.decodeToString() ?: return null val isFile = ArchiveEntry.filetype(entry) == ArchiveEntry.AE_IFREG ArchiveEntry(name, isFile) diff --git a/core/src/androidMain/kotlin/yokai/core/archive/AndroidArchiveReader.kt b/core/src/androidMain/kotlin/yokai/core/archive/AndroidArchiveReader.kt index 8309e9b1a6..f9194e53c6 100644 --- a/core/src/androidMain/kotlin/yokai/core/archive/AndroidArchiveReader.kt +++ b/core/src/androidMain/kotlin/yokai/core/archive/AndroidArchiveReader.kt @@ -9,15 +9,17 @@ import eu.kanade.tachiyomi.util.system.openFileDescriptor import me.zhanghai.android.libarchive.ArchiveException import java.io.InputStream -class AndroidArchiveReader(pfd: ParcelFileDescriptor) : ArchiveReader { - val size = pfd.statSize - val address = Os.mmap(0, size, OsConstants.PROT_READ, OsConstants.MAP_PRIVATE, pfd.fileDescriptor, 0) +class AndroidArchiveReader(pfd: ParcelFileDescriptor) : ArchiveReader() { + override val size = + pfd.statSize + override val address = + Os.mmap(0, size, OsConstants.PROT_READ, OsConstants.MAP_PRIVATE, pfd.fileDescriptor, 0) - override fun useEntries(block: (Sequence) -> T): T = - AndroidArchiveInputStream(address, size).use { block(generateSequence { it.getNextEntry() }) } + override fun createInputStream(address: Long, size: Long): ArchiveInputStream = + AndroidArchiveInputStream(address, size) override fun getInputStream(entryName: String): InputStream? { - val archive = AndroidArchiveInputStream(address, size) + val archive = createInputStream(address, size) try { while (true) { val entry = archive.getNextEntry() ?: break diff --git a/core/src/commonMain/kotlin/yokai/core/archive/ArchiveInputStream.kt b/core/src/commonMain/kotlin/yokai/core/archive/ArchiveInputStream.kt index 6a9cd0185b..1da5acfe4a 100644 --- a/core/src/commonMain/kotlin/yokai/core/archive/ArchiveInputStream.kt +++ b/core/src/commonMain/kotlin/yokai/core/archive/ArchiveInputStream.kt @@ -3,4 +3,6 @@ package yokai.core.archive import java.io.InputStream // TODO: Use Okio's Source -abstract class ArchiveInputStream : InputStream() +abstract class ArchiveInputStream : InputStream() { + abstract fun getNextEntry(): ArchiveEntry? +} diff --git a/core/src/commonMain/kotlin/yokai/core/archive/ArchiveReader.kt b/core/src/commonMain/kotlin/yokai/core/archive/ArchiveReader.kt index 00d646f3a7..0eb3669d49 100644 --- a/core/src/commonMain/kotlin/yokai/core/archive/ArchiveReader.kt +++ b/core/src/commonMain/kotlin/yokai/core/archive/ArchiveReader.kt @@ -3,7 +3,14 @@ package yokai.core.archive import java.io.Closeable import java.io.InputStream -interface ArchiveReader : Closeable { - fun useEntries(block: (Sequence) -> T): T - fun getInputStream(entryName: String): InputStream? +abstract class ArchiveReader : Closeable { + abstract val address: Long + abstract val size: Long + + abstract fun createInputStream(address: Long, size: Long): ArchiveInputStream + + inline fun useEntries(block: (Sequence) -> T): T = + createInputStream(address, size).use { block(generateSequence { it.getNextEntry() }) } + + abstract fun getInputStream(entryName: String): InputStream? }