From 4e0c0b0a6161c3befb318195cc3df9f073fbfd98 Mon Sep 17 00:00:00 2001 From: ComixHe Date: Thu, 10 Apr 2025 16:05:22 +0800 Subject: [PATCH 1/2] fix: convert file:// to local path passing local path to application instead of url when desktop Exec specify %F or %f. other change: - respect the original url, passing it to application directly - correct the application command generating process Signed-off-by: ComixHe --- src/dbus/applicationservice.cpp | 77 ++++++++++++++++++--------------- src/dbus/jobmanager1service.h | 2 +- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index 08c6ea16..bceef769 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -371,10 +371,6 @@ ApplicationService::Launch(const QString &action, const QStringList &fields, con return objectPath; } - QStringList rawRes; - if(value.canConvert()){ - rawRes = value.toStringList(); - } if (task.argNum != -1) { if (task.argNum >= newCommands.size()) { @@ -382,21 +378,48 @@ ApplicationService::Launch(const QString &action, const QStringList &fields, con return QDBusError::Failed; } - auto tmp = task.command; - if (task.fieldLocation == -1) { - for(int i = 0; i < rawRes.size(); i++){ - tmp.insert(task.argNum + 1 + i, rawRes.at(i)); - } + QStringList rawRes; + if (value.canConvert()) { // from %F, %U + rawRes = value.toStringList(); + } else if (value.canConvert()) { // from %f, %u + rawRes.append(value.toString()); + } else { + qWarning() << "value type mismatch:" << value; + return QDBusError::Failed; + } + + if (task.local) { + std::for_each(rawRes.begin(), rawRes.end(), [](QString &str) { + auto url = QUrl::fromUserInput(str); + + if (url.isLocalFile()) { + str = url.toLocalFile(); + return; + } + + // TODO: processing remote files + // str = downloadToLocal(url).toLocalFile(); + }); + } + + auto newCmds = task.command; + if (task.fieldLocation == -1) { // single field, e.g. "demo %U" + auto it = newCmds.begin() + task.argNum + 1; + std::for_each( + rawRes.rbegin(), rawRes.rend(), [&newCmds, &it](QString &str) { it = newCmds.insert(it, str); }); } else { - auto arg = tmp.at(task.argNum); - for(int i = 0; i < rawRes.size(); i++){ - tmp.insert(task.fieldLocation, rawRes.at(i)); - } - tmp[task.argNum] = arg; + auto arg = newCmds.begin() + task.argNum + 1; + arg->insert(task.fieldLocation, rawRes.takeFirst()); + ++arg; + + // expand the rest of res + std::for_each( + rawRes.rbegin(), rawRes.rend(), [&newCmds, &arg](QString &str) { arg = newCmds.insert(arg, str); }); } - newCommands.append(std::move(tmp)); + newCommands.append(std::move(newCmds)); } + newCommands.push_front(QString{"--SourcePath=%1"}.arg(m_desktopSource.sourcePath())); newCommands.push_front(QString{R"(--unitName=DDE-%1@%2.service)"}.arg(this->id(), instanceRandomUUID)); @@ -1066,20 +1089,6 @@ LaunchTask ApplicationService::unescapeExec(const QString &str, QStringList fiel return {}; } - auto processUrl = [](const QString &str) { - auto url = QUrl::fromUserInput(str); - if (!url.isValid()) { - qDebug() << "url is invalid, pass to exec directly."; - return str; - } - - if (url.isLocalFile()) { - return url.toLocalFile(); - } - - return url.toString(); - }; - task.LaunchBin = args->first(); const QChar percentage{'%'}; bool exclusiveField{false}; @@ -1129,6 +1138,7 @@ LaunchTask ApplicationService::unescapeExec(const QString &str, QStringList fiel task.argNum = std::distance(args->begin(), arg) - 1; task.fieldLocation = std::distance(arg->cbegin(), it) - 1; + task.local = true; } break; case 'u': case 'U': { @@ -1143,15 +1153,12 @@ LaunchTask ApplicationService::unescapeExec(const QString &str, QStringList fiel break; } - QStringList urls; - std::transform(fields.cbegin(), fields.cend(), std::back_inserter(urls), processUrl); - fields.clear(); - + // respect the original url, pass it to exec directly if (c == 'U') { - task.Resources.emplace_back(urls.join(' ')); + task.Resources.emplace_back(std::move(fields)); } else { std::for_each( - urls.begin(), urls.end(), [&task](QString &url) { task.Resources.emplace_back(std::move(url)); }); + fields.begin(), fields.end(), [&task](QString &url) { task.Resources.emplace_back(std::move(url)); }); } task.argNum = std::distance(args->begin(), arg) - 1; diff --git a/src/dbus/jobmanager1service.h b/src/dbus/jobmanager1service.h index 1aa180c7..0a7051a0 100644 --- a/src/dbus/jobmanager1service.h +++ b/src/dbus/jobmanager1service.h @@ -33,7 +33,7 @@ struct LaunchTask QString LaunchBin; QStringList command; QVariantList Resources; - bool singleInstance{false}; + bool local{false}; int argNum{-1}; int fieldLocation{-1}; }; From f9e06afc078c8d672db55fad246d27692a7a301a Mon Sep 17 00:00:00 2001 From: ComixHe Date: Thu, 10 Apr 2025 16:53:43 +0800 Subject: [PATCH 2/2] chore: bump version to 1.2.27 Signed-off-by: ComixHe --- debian/changelog | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index f27bdc46..982f0b52 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +dde-application-manager (1.2.27) unstable; urgency=medium + + * fix: convert file:// to local path + + -- heyuming Thu, 10 Apr 2025 16:52:52 +0800 + dde-application-manager (1.2.26) unstable; urgency=medium * fix: abnormal splitting of parameters enclosed in quotation marks in Exec @@ -96,7 +102,7 @@ dde-application-manager (1.2.11) unstable; urgency=medium dde-application-manager (1.2.10) unstable; urgency=medium - * fix: crashed when launching a application contains "%U" + * fix: crashed when launching a application contains "%U" * fix: revert "crashed when removing a invalid index" -- Wang Fei Fri, 10 May 2024 15:18:39 +0800