refactor(archive): Move stuff around

Hopefully this makes it easier for me to make it KMM compatible in the future
This commit is contained in:
Ahmad Ansori Palembani 2024-06-27 12:16:18 +07:00
parent 7d4e3d7bbc
commit e19d048bb1
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
4 changed files with 22 additions and 11 deletions

View file

@ -43,7 +43,7 @@ class AndroidArchiveInputStream(buffer: Long, size: Long) : ArchiveInputStream()
Archive.readFree(archive) 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 name = ArchiveEntry.pathnameUtf8(entry) ?: ArchiveEntry.pathname(entry)?.decodeToString() ?: return null
val isFile = ArchiveEntry.filetype(entry) == ArchiveEntry.AE_IFREG val isFile = ArchiveEntry.filetype(entry) == ArchiveEntry.AE_IFREG
ArchiveEntry(name, isFile) ArchiveEntry(name, isFile)

View file

@ -9,15 +9,17 @@ import eu.kanade.tachiyomi.util.system.openFileDescriptor
import me.zhanghai.android.libarchive.ArchiveException import me.zhanghai.android.libarchive.ArchiveException
import java.io.InputStream import java.io.InputStream
class AndroidArchiveReader(pfd: ParcelFileDescriptor) : ArchiveReader { class AndroidArchiveReader(pfd: ParcelFileDescriptor) : ArchiveReader() {
val size = pfd.statSize override val size =
val address = Os.mmap(0, size, OsConstants.PROT_READ, OsConstants.MAP_PRIVATE, pfd.fileDescriptor, 0) pfd.statSize
override val address =
Os.mmap(0, size, OsConstants.PROT_READ, OsConstants.MAP_PRIVATE, pfd.fileDescriptor, 0)
override fun <T> useEntries(block: (Sequence<ArchiveEntry>) -> T): T = override fun createInputStream(address: Long, size: Long): ArchiveInputStream =
AndroidArchiveInputStream(address, size).use { block(generateSequence { it.getNextEntry() }) } AndroidArchiveInputStream(address, size)
override fun getInputStream(entryName: String): InputStream? { override fun getInputStream(entryName: String): InputStream? {
val archive = AndroidArchiveInputStream(address, size) val archive = createInputStream(address, size)
try { try {
while (true) { while (true) {
val entry = archive.getNextEntry() ?: break val entry = archive.getNextEntry() ?: break

View file

@ -3,4 +3,6 @@ package yokai.core.archive
import java.io.InputStream import java.io.InputStream
// TODO: Use Okio's Source // TODO: Use Okio's Source
abstract class ArchiveInputStream : InputStream() abstract class ArchiveInputStream : InputStream() {
abstract fun getNextEntry(): ArchiveEntry?
}

View file

@ -3,7 +3,14 @@ package yokai.core.archive
import java.io.Closeable import java.io.Closeable
import java.io.InputStream import java.io.InputStream
interface ArchiveReader : Closeable { abstract class ArchiveReader : Closeable {
fun <T> useEntries(block: (Sequence<ArchiveEntry>) -> T): T abstract val address: Long
fun getInputStream(entryName: String): InputStream? abstract val size: Long
abstract fun createInputStream(address: Long, size: Long): ArchiveInputStream
inline fun <T> useEntries(block: (Sequence<ArchiveEntry>) -> T): T =
createInputStream(address, size).use { block(generateSequence { it.getNextEntry() }) }
abstract fun getInputStream(entryName: String): InputStream?
} }