From b28fc3ffc4ce5585be7fe3777195a714c38fd86f Mon Sep 17 00:00:00 2001 From: tarsin Date: Fri, 28 Jul 2023 18:28:07 +0800 Subject: [PATCH] Make cronetRequest.execute(..., () -> R): R --- .../main/java/com/hippo/ehviewer/client/EhEngine.kt | 8 +++----- .../com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt | 6 +++--- .../main/java/com/hippo/ehviewer/cronet/CronetKt.kt | 12 ++++++------ 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt index a98f77213..699777883 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt @@ -133,8 +133,7 @@ private fun rethrowExactly(code: Int, headers: Headers, body: String, e: Throwab val httpContentPool = DirectByteBufferPool(16, 16384) suspend inline fun fetchCompat(url: String, referer: String? = null, crossinline parser: (ByteBuffer) -> T): T { - val ret: T - if (isCronetSupported) { + return if (isCronetSupported) { cronetRequest(url, referer).execute { val buffer = httpContentPool.borrow() try { @@ -142,7 +141,7 @@ suspend inline fun fetchCompat(url: String, referer: String? = null, crossin buffer.put(it) } buffer.flip() - ret = parser(buffer) + parser(buffer) } finally { httpContentPool.recycle(buffer) } @@ -155,13 +154,12 @@ suspend inline fun fetchCompat(url: String, referer: String? = null, crossin if (body.source().read(buffer) == -1) break } buffer.flip() - ret = parser(buffer) + parser(buffer) } finally { httpContentPool.recycle(buffer) } } } - return ret } @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") 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 61cefa37b..6339b9857 100644 --- a/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt +++ b/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt @@ -26,16 +26,16 @@ class CronetHttpUriFetcher(private val data: String, private val options: Option val diskCacheKey = options.diskCacheKey ?: data val diskCache = requireNotNull(imageLoader.diskCache) val snapshot = diskCache.openSnapshot(diskCacheKey) ?: run { - cronetRequest(data) { + val success = cronetRequest(data) { disableCache() }.execute { - val success = diskCache.suspendEdit(diskCacheKey) { + diskCache.suspendEdit(diskCacheKey) { RandomAccessFile(data.toFile(), "rw").use { copyToChannel(it.channel) } } - check(success) } + check(success) // diskcache snapshot MUST exist here requireNotNull(diskCache.openSnapshot(diskCacheKey)) } 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 6e8e0ce6a..c7e02195e 100644 --- a/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt +++ b/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt @@ -45,7 +45,7 @@ class CronetRequest { lateinit var consumer: (ByteBuffer) -> Unit lateinit var onResponse: CronetRequest.(UrlResponseInfo) -> Unit lateinit var request: UrlRequest - lateinit var daemonCont: Continuation + lateinit var onError: (Throwable) -> Unit lateinit var readerCont: Continuation val callback = object : UrlRequest.Callback() { override fun onRedirectReceived(req: UrlRequest, info: UrlResponseInfo, url: String) { @@ -64,11 +64,10 @@ class CronetRequest { override fun onSucceeded(req: UrlRequest, info: UrlResponseInfo) { readerCont.resume(Unit) - daemonCont.resume(true) } override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: CronetException) { - daemonCont.resumeWithException(e) + onError(e) } } } @@ -92,6 +91,7 @@ suspend inline fun CronetRequest.awaitBodyFully(crossinline callback: (ByteBuffe buffer.clear() request.read(buffer) } + onError = { readerCont.resumeWithException(it) } readerCont = cont request.read(buffer) } @@ -105,15 +105,15 @@ suspend inline fun CronetRequest.copyToChannel(chan: FileChannel, crossinline li listener(bytes) } -suspend inline fun CronetRequest.execute(crossinline callback: suspend CronetRequest.(UrlResponseInfo) -> Unit): Boolean { +suspend inline fun CronetRequest.execute(crossinline callback: suspend CronetRequest.(UrlResponseInfo) -> R): R { contract { callsInPlace(callback, InvocationKind.EXACTLY_ONCE) } return coroutineScope { - onResponse = { launch { callback(it) } } suspendCancellableCoroutine { cont -> + onResponse = { launch { cont.resume(callback(it)) } } cont.invokeOnCancellation { request.cancel() } - daemonCont = cont + onError = { cont.resumeWithException(it) } request.start() } }