From 2982d4ef7bbd49f622bc51c8364e1846fbd196d9 Mon Sep 17 00:00:00 2001 From: Laserlicht <13953785+Laserlicht@users.noreply.github.com> Date: Sun, 31 Aug 2025 02:52:34 +0200 Subject: [PATCH] fix android url encoding --- launcher/helper.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/launcher/helper.cpp b/launcher/helper.cpp index e741dfb43..ac211e4b6 100644 --- a/launcher/helper.cpp +++ b/launcher/helper.cpp @@ -89,8 +89,34 @@ QString getRealPath(QString path) void performNativeCopy(QString src, QString dst) { #ifdef VCMI_ANDROID - auto srcStr = QAndroidJniObject::fromString(src); - auto dstStr = QAndroidJniObject::fromString(dst); + auto percentEncodeNonAscii = [](const QString &input) { + QByteArray utf8 = input.toUtf8(); + QByteArray encoded; + + for (char c : utf8) { + // If ASCII (0x00 to 0x7F), keep as is + if (static_cast(c) < 0x80) { + encoded.append(c); + } else { + // Non-ASCII: encode as %HH + encoded.append('%'); + encoded.append(QByteArray::number(static_cast(c), 16).toUpper().rightJustified(2, '0')); + } + } + + return QString::fromUtf8(encoded); + }; + + auto safeEncode = [&](QString uri) -> QString + { + if (!uri.startsWith("content://", Qt::CaseInsensitive)) + return uri; + uri.replace(" ", "%20"); + return percentEncodeNonAscii(uri); + }; + + auto srcStr = QAndroidJniObject::fromString(safeEncode(src)); + auto dstStr = QAndroidJniObject::fromString(safeEncode(dst)); QAndroidJniObject::callStaticObjectMethod("eu/vcmi/vcmi/util/FileUtil", "copyFileFromUri", "(Ljava/lang/String;Ljava/lang/String;Landroid/content/Context;)V", srcStr.object(), dstStr.object(), QtAndroid::androidContext().object()); #else QFile::copy(src, dst);