From 37804e67c135e13d6fe96f21423017bc7e8e546f Mon Sep 17 00:00:00 2001 From: tarsin Date: Wed, 1 Feb 2023 11:28:24 +0800 Subject: [PATCH] Fix serialization --- .../ehviewer/download/DownloadManager.kt | 5 +- .../preference/RestoreDownloadPreference.kt | 4 +- .../com/hippo/ehviewer/spider/SpiderInfo.kt | 67 +------------------ .../hippo/ehviewer/spider/SpiderInfoUtils.kt | 57 ++++++++++++++++ .../hippo/ehviewer/spider/SpiderQueen.java | 16 ++--- 5 files changed, 71 insertions(+), 78 deletions(-) create mode 100644 app/src/main/java/com/hippo/ehviewer/spider/SpiderInfoUtils.kt diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt index 3866264d7..ba866c274 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt @@ -26,9 +26,10 @@ import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.dao.DownloadInfo import com.hippo.ehviewer.dao.DownloadLabel import com.hippo.ehviewer.spider.SpiderDen -import com.hippo.ehviewer.spider.SpiderInfo import com.hippo.ehviewer.spider.SpiderQueen import com.hippo.ehviewer.spider.SpiderQueen.OnSpiderListener +import com.hippo.ehviewer.spider.readCompatFromUniFile +import com.hippo.ehviewer.spider.write import com.hippo.image.Image import com.hippo.util.IoThreadPoolExecutor import com.hippo.yorozuya.ConcurrentPool @@ -581,7 +582,7 @@ class DownloadManager : OnSpiderListener { galleryInfo.rating = downloadInfo.rating val downloadDir = SpiderDen.getGalleryDownloadDir(galleryInfo.gid) ?: continue val file = downloadDir.findFile(SpiderQueen.SPIDER_INFO_FILENAME) ?: continue - val spiderInfo = SpiderInfo.readCompatFromUniFile(file) ?: continue + val spiderInfo = readCompatFromUniFile(file) ?: continue spiderInfo.startPage = 0 try { spiderInfo.write(file) diff --git a/app/src/main/java/com/hippo/ehviewer/preference/RestoreDownloadPreference.kt b/app/src/main/java/com/hippo/ehviewer/preference/RestoreDownloadPreference.kt index bba293c4d..372577b14 100644 --- a/app/src/main/java/com/hippo/ehviewer/preference/RestoreDownloadPreference.kt +++ b/app/src/main/java/com/hippo/ehviewer/preference/RestoreDownloadPreference.kt @@ -27,8 +27,8 @@ import com.hippo.ehviewer.client.EhEngine.fillGalleryListByApi import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.data.BaseGalleryInfo import com.hippo.ehviewer.download.DownloadManager -import com.hippo.ehviewer.spider.SpiderInfo import com.hippo.ehviewer.spider.SpiderQueen +import com.hippo.ehviewer.spider.readCompatFromUniFile import com.hippo.ehviewer.ui.scene.BaseScene import com.hippo.unifile.UniFile import com.hippo.util.ExceptionUtils @@ -52,7 +52,7 @@ class RestoreDownloadPreference constructor( } val siFile = file.findFile(SpiderQueen.SPIDER_INFO_FILENAME) ?: return null return try { - val spiderInfo = SpiderInfo.readCompatFromUniFile(siFile) ?: return null + val spiderInfo = readCompatFromUniFile(siFile) ?: return null val gid = spiderInfo.gid val dirname = file.name if (mManager.containDownloadInfo(gid)) { diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.kt index f9c4cddcb..40baacc60 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.kt @@ -1,18 +1,6 @@ -@file:OptIn(ExperimentalSerializationApi::class) - package com.hippo.ehviewer.spider -import coil.annotation.ExperimentalCoilApi -import coil.disk.DiskCache -import com.hippo.compat.readLegacySpiderInfo -import com.hippo.ehviewer.EhApplication -import com.hippo.unifile.UniFile -import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable -import kotlinx.serialization.cbor.Cbor -import kotlinx.serialization.decodeFromByteArray -import kotlinx.serialization.encodeToByteArray -import java.io.File @Serializable class SpiderInfo @JvmOverloads constructor( @@ -29,57 +17,4 @@ class SpiderInfo @JvmOverloads constructor( var previewPages: Int = -1, var previewPerPage: Int = -1 -) { - fun write(file: UniFile) { - file.openOutputStream().use { - it.write(Cbor.encodeToByteArray(this)) - } - } - - @OptIn(ExperimentalCoilApi::class) - fun saveToCache() { - val entry = spiderInfoCache.edit(gid.toString()) ?: return - runCatching { - entry.data.toFile().writeBytes(Cbor.encodeToByteArray(this)) - }.onFailure { - it.printStackTrace() - entry.abort() - }.onSuccess { - entry.commit() - } - } - - companion object { - private val spiderInfoCache by lazy { - DiskCache.Builder() - .directory(File(EhApplication.application.cacheDir, "spider_info_v2_1")) - .maxSizeBytes(20 * 1024 * 1024).build() - } - - @JvmStatic - @OptIn(ExperimentalCoilApi::class) - fun readFromCache(gid: Long): SpiderInfo? { - val snapshot = spiderInfoCache[gid.toString()] ?: return null - return runCatching { - snapshot.use { - return Cbor.decodeFromByteArray(it.data.toFile().readBytes()) - } - }.onFailure { - it.printStackTrace() - }.getOrNull() - } - - @JvmStatic - fun readCompatFromUniFile(file: UniFile): SpiderInfo? { - return runCatching { - file.openInputStream().use { - Cbor.decodeFromByteArray(it.readBytes()) - } - }.getOrNull() ?: runCatching { - file.openInputStream().use { readLegacySpiderInfo(it) } - }.getOrNull() - } - - const val TOKEN_FAILED = "failed" - } -} \ No newline at end of file +) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfoUtils.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfoUtils.kt new file mode 100644 index 000000000..a78f75589 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfoUtils.kt @@ -0,0 +1,57 @@ +package com.hippo.ehviewer.spider + +import coil.disk.DiskCache +import com.hippo.compat.readLegacySpiderInfo +import com.hippo.ehviewer.EhApplication +import com.hippo.unifile.UniFile +import kotlinx.serialization.cbor.Cbor +import kotlinx.serialization.decodeFromByteArray +import kotlinx.serialization.encodeToByteArray +import java.io.File + +fun SpiderInfo.write(file: UniFile) { + file.openOutputStream().use { + it.write(Cbor.encodeToByteArray(this)) + } +} + +fun SpiderInfo.saveToCache() { + val entry = spiderInfoCache.edit(gid.toString()) ?: return + runCatching { + entry.data.toFile().writeBytes(Cbor.encodeToByteArray(this)) + }.onFailure { + it.printStackTrace() + entry.abort() + }.onSuccess { + entry.commit() + } +} + +private val spiderInfoCache by lazy { + DiskCache.Builder() + .directory(File(EhApplication.application.cacheDir, "spider_info_v2_1")) + .maxSizeBytes(20 * 1024 * 1024).build() +} + +fun readFromCache(gid: Long): SpiderInfo? { + val snapshot = spiderInfoCache[gid.toString()] ?: return null + return runCatching { + snapshot.use { + return Cbor.decodeFromByteArray(it.data.toFile().readBytes()) + } + }.onFailure { + it.printStackTrace() + }.getOrNull() +} + +fun readCompatFromUniFile(file: UniFile): SpiderInfo? { + return runCatching { + file.openInputStream().use { + Cbor.decodeFromByteArray(it.readBytes()) + } + }.getOrNull() ?: runCatching { + file.openInputStream().use { readLegacySpiderInfo(it) } + }.getOrNull() +} + +const val TOKEN_FAILED = "failed" diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java index bacfaa632..ef5524119 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -598,7 +598,7 @@ public final class SpiderQueen implements Runnable { // Slow path, read diskcache if (spiderInfo == null) { - spiderInfo = SpiderInfo.readFromCache(gid); + spiderInfo = SpiderInfoUtilsKt.readFromCache(gid); } if (spiderInfo == null) return 0; @@ -630,7 +630,7 @@ public final class SpiderQueen implements Runnable { if (downloadDir != null) { UniFile file = downloadDir.findFile(SPIDER_INFO_FILENAME); if (file != null) { - spiderInfo = SpiderInfo.readCompatFromUniFile(file); + spiderInfo = SpiderInfoUtilsKt.readCompatFromUniFile(file); if (spiderInfo != null && spiderInfo.getGid() == mGalleryInfo.getGid() && spiderInfo.getToken().equals(mGalleryInfo.getToken())) { return spiderInfo; @@ -639,7 +639,7 @@ public final class SpiderQueen implements Runnable { } // Read from cache - spiderInfo = SpiderInfo.readFromCache(mGalleryInfo.getGid()); + spiderInfo = SpiderInfoUtilsKt.readFromCache(mGalleryInfo.getGid()); if (spiderInfo != null && spiderInfo.getGid() == mGalleryInfo.getGid() && spiderInfo.getToken().equals(mGalleryInfo.getToken())) { return spiderInfo; } @@ -766,9 +766,9 @@ public final class SpiderQueen implements Runnable { UniFile downloadDir = mSpiderDen.getDownloadDir(); if (downloadDir != null) { UniFile file = downloadDir.createFile(SPIDER_INFO_FILENAME); - spiderInfo.write(file); + SpiderInfoUtilsKt.write(spiderInfo, file); } - spiderInfo.saveToCache(); + SpiderInfoUtilsKt.saveToCache(spiderInfo); } } @@ -864,7 +864,7 @@ public final class SpiderQueen implements Runnable { if (null == pToken) { // If failed, set the pToken "failed" synchronized (mPTokenLock) { - spiderInfo.getPTokenMap().put(index, SpiderInfo.TOKEN_FAILED); + spiderInfo.getPTokenMap().put(index, SpiderInfoUtilsKt.TOKEN_FAILED); } } @@ -1284,7 +1284,7 @@ public final class SpiderQueen implements Runnable { if (force) { synchronized (mPTokenLock) { String pToken = spiderInfo.getPTokenMap().get(index); - if (SpiderInfo.TOKEN_FAILED.equals(pToken)) { + if (SpiderInfoUtilsKt.TOKEN_FAILED.equals(pToken)) { spiderInfo.getPTokenMap().remove(index); } } @@ -1360,7 +1360,7 @@ public final class SpiderQueen implements Runnable { } } - if (SpiderInfo.TOKEN_FAILED.equals(pToken)) { + if (SpiderInfoUtilsKt.TOKEN_FAILED.equals(pToken)) { // Get token failed updatePageState(index, STATE_FAILED, GetText.getString(R.string.error_get_ptoken_error)); return true;