From 21a75d7ff0cfbe8627b2413d1a7481f86409df3f Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Fri, 4 Oct 2024 17:59:47 +0200 Subject: [PATCH] WebView: use Asset_read() instead of Asset_openFileDescriptor() openFileDescriptor doesn't work for assets which are compressed inside the APK. --- meson.build | 1 + src/api-impl-jni/AssetInputStream.c | 30 +++++++++++++++++++ src/api-impl-jni/AssetInputStream.h | 11 +++++++ .../widgets/android_webkit_WebView.c | 10 ++----- 4 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 src/api-impl-jni/AssetInputStream.c create mode 100644 src/api-impl-jni/AssetInputStream.h diff --git a/meson.build b/meson.build index 4be7a5eb..11efabdb 100644 --- a/meson.build +++ b/meson.build @@ -92,6 +92,7 @@ libtranslationlayer_so = shared_library('translation_layer_main', [ 'src/api-impl-jni/app/android_app_AlertDialog.c', 'src/api-impl-jni/app/android_app_Dialog.c', 'src/api-impl-jni/app/android_app_NotificationManager.c', + 'src/api-impl-jni/AssetInputStream.c', 'src/api-impl-jni/audio/android_media_AudioTrack.c', 'src/api-impl-jni/audio/android_media_SoundPool.c', 'src/api-impl-jni/content/android_content_ClipboardManager.c', diff --git a/src/api-impl-jni/AssetInputStream.c b/src/api-impl-jni/AssetInputStream.c new file mode 100644 index 00000000..66051c9f --- /dev/null +++ b/src/api-impl-jni/AssetInputStream.c @@ -0,0 +1,30 @@ +#include + +#include "AssetInputStream.h" + +static gssize asset_input_stream_read(GInputStream *gstream, void *buffer, gsize count, GCancellable *cancellable, GError **error) { + return Asset_read(ATL_ASSET_INPUT_STREAM(gstream)->asset, buffer, count); +} + +static gboolean asset_input_stream_close(GInputStream *gstream, GCancellable *cancellable, GError **error) { + AssetInputStream *stream = ATL_ASSET_INPUT_STREAM(gstream); + Asset_delete(stream->asset); + stream->asset = NULL; + return TRUE; +} + +static void asset_input_stream_class_init(AssetInputStreamClass *class) { + class->parent_class.read_fn = asset_input_stream_read; + class->parent_class.close_fn = asset_input_stream_close; +} + +static void asset_input_stream_init(AssetInputStream *self) { +} + +G_DEFINE_TYPE(AssetInputStream, asset_input_stream, G_TYPE_INPUT_STREAM) + +GInputStream *asset_input_stream_new(struct Asset *asset) { + AssetInputStream *stream = g_object_new(asset_input_stream_get_type(), NULL); + stream->asset = asset; + return &stream->parent_instance; +} diff --git a/src/api-impl-jni/AssetInputStream.h b/src/api-impl-jni/AssetInputStream.h new file mode 100644 index 00000000..183dd879 --- /dev/null +++ b/src/api-impl-jni/AssetInputStream.h @@ -0,0 +1,11 @@ +#include + +struct _AssetInputStream +{ + GInputStream parent_instance; + struct Asset *asset; +}; + +G_DECLARE_FINAL_TYPE(AssetInputStream, asset_input_stream, ATL, ASSET_INPUT_STREAM, GInputStream); + +GInputStream *asset_input_stream_new(struct Asset *asset); diff --git a/src/api-impl-jni/widgets/android_webkit_WebView.c b/src/api-impl-jni/widgets/android_webkit_WebView.c index 23821651..92e7fc79 100644 --- a/src/api-impl-jni/widgets/android_webkit_WebView.c +++ b/src/api-impl-jni/widgets/android_webkit_WebView.c @@ -8,6 +8,7 @@ #include "../util.h" #include "WrapperWidget.h" +#include "../AssetInputStream.h" #include "../generated_headers/android_view_View.h" #include "../generated_headers/android_webkit_WebView.h" @@ -23,13 +24,8 @@ static void asset_uri_scheme_request_cb(WebKitURISchemeRequest *request, gpointe jobject asset_manager_obj = (*env)->CallObjectMethod(env, wrapper->jobj, handle_cache.webview.internalGetAssetManager); struct AssetManager *asset_manager = _PTR(_GET_LONG_FIELD(asset_manager_obj, "mObject")); struct Asset *asset = AssetManager_openNonAsset(asset_manager, path, ACCESS_STREAMING); - off_t offset; - off_t size; - int fd = Asset_openFileDescriptor(asset, &offset, &size); - Asset_delete(asset); - GInputStream *stream = g_unix_input_stream_new(fd, TRUE); - g_input_stream_skip(stream, offset, NULL, NULL); - webkit_uri_scheme_request_finish(request, stream, size, NULL); + GInputStream *stream = asset_input_stream_new(asset); + webkit_uri_scheme_request_finish(request, stream, Asset_getLength(asset), NULL); g_object_unref(stream); }