From 01e3f3e9b741ac054d8ce9d734927d6b98c6f311 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Thu, 29 Feb 2024 15:57:30 +0800 Subject: [PATCH] Sort only entries in external archive files --- app/src/main/cpp/archive.c | 10 ++++++---- .../com/hippo/ehviewer/gallery/ArchivePageLoader.kt | 2 +- app/src/main/kotlin/com/hippo/ehviewer/jni/Archive.kt | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/cpp/archive.c b/app/src/main/cpp/archive.c index 3f3224b2e..226959ddc 100644 --- a/app/src/main/cpp/archive.c +++ b/app/src/main/cpp/archive.c @@ -118,7 +118,7 @@ static inline int compare_entries(const void *a, const void *b) { return strnatcmp(fa, fb); } -static long archive_map_entries_index(archive_ctx *ctx) { +static long archive_map_entries_index(archive_ctx *ctx, bool sort) { long count = 0; while (archive_read_next_header(ctx->arc, &ctx->entry) == ARCHIVE_OK) { const char *name = archive_entry_pathname2(ctx->entry); @@ -131,7 +131,8 @@ static long archive_map_entries_index(archive_ctx *ctx) { } if (!count) LOGE("%s", archive_error_string(ctx->arc)); - qsort(entries, entryCount, sizeof(entry), compare_entries); + if (sort) + qsort(entries, entryCount, sizeof(entry), compare_entries); return count; } @@ -296,7 +297,7 @@ static int archive_get_ctx(archive_ctx **ctxptr, int idx) { JNIEXPORT jint JNICALL Java_com_hippo_ehviewer_jni_ArchiveKt_openArchive(JNIEnv *env, jclass thiz, jint fd, - jlong size) { + jlong size, jboolean sort_entries) { EH_UNUSED(env); EH_UNUSED(thiz); archive_ctx *ctx = NULL; @@ -356,7 +357,7 @@ Java_com_hippo_ehviewer_jni_ArchiveKt_openArchive(JNIEnv *env, jclass thiz, jint LOGE("%s%s", "Archive open failed:", archive_error_string(ctx->arc)); } else { entries = calloc(entryCount, sizeof(entry)); - r = archive_map_entries_index(ctx); + r = archive_map_entries_index(ctx, sort_entries); if (!archive_prealloc_mempool()) { r = 0; for (int i = 0; i < entryCount; ++i) { @@ -514,6 +515,7 @@ Java_com_hippo_ehviewer_jni_ArchiveKt_releaseByteBuffer(JNIEnv *env, jclass thiz JNIEXPORT jboolean JNICALL Java_com_hippo_ehviewer_jni_ArchiveKt_archiveFdBatch(JNIEnv *env, jclass clazz, jintArray fd_batch, jobjectArray names, jint arc_fd, jint size) { + EH_UNUSED(clazz); struct archive *arc = archive_write_new(); struct stat st; char buff[8192]; diff --git a/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt b/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt index e52b57811..af3541eba 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt @@ -55,7 +55,7 @@ class ArchivePageLoader( private val hostJob = launch(start = CoroutineStart.LAZY) { logcat(DEBUG_TAG) { "Open archive ${file.uri.displayPath}" } pfd = file.openFileDescriptor("r") - size = openArchive(pfd.fd, pfd.statSize) + size = openArchive(pfd.fd, pfd.statSize, gid == 0L) if (size == 0) { return@launch } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/jni/Archive.kt b/app/src/main/kotlin/com/hippo/ehviewer/jni/Archive.kt index 38e2ff27f..502646eea 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/jni/Archive.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/jni/Archive.kt @@ -3,7 +3,7 @@ package com.hippo.ehviewer.jni import java.nio.ByteBuffer external fun releaseByteBuffer(buffer: ByteBuffer) -external fun openArchive(fd: Int, size: Long): Int +external fun openArchive(fd: Int, size: Long, sortEntries: Boolean): Int external fun extractToByteBuffer(index: Int): ByteBuffer? external fun extractToFd(index: Int, fd: Int): Boolean external fun getExtension(index: Int): String