From 0265ddc6e1234a512642224be3d9ed2eb26058ad Mon Sep 17 00:00:00 2001 From: tarsin Date: Thu, 27 Jul 2023 12:02:30 +0800 Subject: [PATCH] Introduce CronetRequest.copyToChannel --- .../com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt | 9 +++------ .../main/java/com/hippo/ehviewer/cronet/CronetKt.kt | 6 ++++++ .../main/java/com/hippo/ehviewer/spider/SpiderDen.kt | 11 +++++------ 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt b/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt index 7bbb1f263..61cefa37b 100644 --- a/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt +++ b/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt @@ -12,7 +12,7 @@ import coil.fetch.FetchResult import coil.fetch.Fetcher import coil.fetch.SourceResult import coil.request.Options -import com.hippo.ehviewer.cronet.awaitBodyFully +import com.hippo.ehviewer.cronet.copyToChannel import com.hippo.ehviewer.cronet.cronetRequest import com.hippo.ehviewer.cronet.execute import java.io.RandomAccessFile @@ -30,11 +30,8 @@ class CronetHttpUriFetcher(private val data: String, private val options: Option disableCache() }.execute { val success = diskCache.suspendEdit(diskCacheKey) { - RandomAccessFile(data.toFile(), "rw").use { f -> - val chan = f.channel - awaitBodyFully { buffer -> - chan.write(buffer) - } + RandomAccessFile(data.toFile(), "rw").use { + copyToChannel(it.channel) } } check(success) diff --git a/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt b/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt index c8ef4640e..38e7b82f4 100644 --- a/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt +++ b/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt @@ -18,6 +18,7 @@ import org.chromium.net.UrlRequest import org.chromium.net.UrlResponseInfo import splitties.init.appCtx import java.nio.ByteBuffer +import java.nio.channels.FileChannel import kotlin.coroutines.Continuation import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException @@ -98,6 +99,11 @@ suspend inline fun CronetRequest.awaitBodyFully(crossinline callback: (ByteBuffe } } +suspend inline fun CronetRequest.copyToChannel(chan: FileChannel, crossinline listener: ((Int) -> Unit) = {}) = awaitBodyFully { + val bytes = chan.write(it) + listener(bytes) +} + suspend inline fun CronetRequest.execute(crossinline callback: suspend CronetRequest.(UrlResponseInfo) -> Unit) = coroutineScope { onResponse = { launch { callback(it) } } suspendCancellableCoroutine { cont -> diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt index a7ea0fff8..fa1a7bb90 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -26,7 +26,7 @@ import com.hippo.ehviewer.client.executeNonCache import com.hippo.ehviewer.client.getImageKey import com.hippo.ehviewer.coil.read import com.hippo.ehviewer.coil.suspendEdit -import com.hippo.ehviewer.cronet.awaitBodyFully +import com.hippo.ehviewer.cronet.copyToChannel import com.hippo.ehviewer.cronet.cronetRequest import com.hippo.ehviewer.cronet.execute import com.hippo.ehviewer.download.downloadLocation @@ -141,11 +141,10 @@ class SpiderDen(mGalleryInfo: GalleryInfo) { val type = headers["Content-Type"]?.first()?.toMediaType()?.subtype ?: "jpg" val length = headers["Content-Length"]!!.first().toLong() saveResponseMeta(index, type, length) { file -> - file.openOutputStream().use { - val chan = it.channel - awaitBodyFully { buffer -> - val read = chan.write(buffer) - notifyProgress(length, info.receivedByteCount, read) + file.openOutputStream().use { os -> + val chan = os.channel + copyToChannel(chan) { + notifyProgress(length, info.receivedByteCount, it) }.also { size -> if (chan.size() != size) chan.truncate(size) } } }