X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/fc965a725cd0cfdca520b1a08e1f144f06aab7d2..dd07a327:/src/settings/contextmenu/servicemenuinstaller/servicemenuinstaller.cpp diff --git a/src/settings/contextmenu/servicemenuinstaller/servicemenuinstaller.cpp b/src/settings/contextmenu/servicemenuinstaller/servicemenuinstaller.cpp index 7f42ee3bd..fa7369e06 100644 --- a/src/settings/contextmenu/servicemenuinstaller/servicemenuinstaller.cpp +++ b/src/settings/contextmenu/servicemenuinstaller/servicemenuinstaller.cpp @@ -4,32 +4,31 @@ * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +#include +#include +#include #include -#include -#include -#include #include #include -#include +#include #include +#include +#include +#include #include -#include -#include -#include -#include "../../../config-packagekit.h" +#include "../../../config-dolphin.h" -Q_GLOBAL_STATIC_WITH_ARGS(QStringList, binaryPackages, ({QLatin1String("application/vnd.debian.binary-package"), - QLatin1String("application/x-rpm"), - QLatin1String("application/x-xz"), - QLatin1String("application/zstd")})) +Q_GLOBAL_STATIC_WITH_ARGS(QStringList, + binaryPackages, + ({QLatin1String("application/vnd.debian.binary-package"), + QLatin1String("application/x-rpm"), + QLatin1String("application/x-xz"), + QLatin1String("application/zstd")})) -enum PackageOperation { - Install, - Uninstall -}; +enum PackageOperation { Install, Uninstall }; -#ifdef HAVE_PACKAGEKIT +#if HAVE_PACKAGEKIT #include #include #include @@ -41,7 +40,7 @@ enum PackageOperation { Q_NORETURN void fail(const QString &str) { qCritical() << str; - const QStringList args = {"--detailederror" ,i18n("Dolphin service menu installation failed"), str}; + const QStringList args = {"--detailederror", i18n("Dolphin service menu installation failed"), str}; QProcess::startDetached("kdialog", args); exit(1); @@ -53,26 +52,24 @@ QString getServiceMenusDir() return QDir(dataLocation).absoluteFilePath("kio/servicemenus"); } -#ifdef HAVE_PACKAGEKIT +#if HAVE_PACKAGEKIT void packageKitInstall(const QString &fileName) { PackageKit::Transaction *transaction = PackageKit::Daemon::installFile(fileName, PackageKit::Transaction::TransactionFlagNone); const auto exitWithError = [=](PackageKit::Transaction::Error, const QString &details) { - fail(details); + fail(details); }; - QObject::connect(transaction, &PackageKit::Transaction::finished, - [=](PackageKit::Transaction::Exit status, uint) { - if (status == PackageKit::Transaction::ExitSuccess) { - exit(0); - } - // Fallback error handling - QTimer::singleShot(500, [=](){ - fail(i18n("Failed to install \"%1\", exited with status \"%2\"", - fileName, QVariant::fromValue(status).toString())); - }); - }); + QObject::connect(transaction, &PackageKit::Transaction::finished, [=](PackageKit::Transaction::Exit status, uint) { + if (status == PackageKit::Transaction::ExitSuccess) { + exit(0); + } + // Fallback error handling + QTimer::singleShot(500, [=]() { + fail(i18n("Failed to install \"%1\", exited with status \"%2\"", fileName, QVariant::fromValue(status).toString())); + }); + }); QObject::connect(transaction, &PackageKit::Transaction::errorCode, exitWithError); } @@ -88,30 +85,27 @@ void packageKitUninstall(const QString &fileName) }; PackageKit::Transaction *transaction = PackageKit::Daemon::getDetailsLocal(fileName); - QObject::connect(transaction, &PackageKit::Transaction::details, - [=](const PackageKit::Details &details) { - PackageKit::Transaction *transaction = PackageKit::Daemon::removePackage(details.packageId()); - QObject::connect(transaction, &PackageKit::Transaction::finished, uninstallLambda); - QObject::connect(transaction, &PackageKit::Transaction::errorCode, exitWithError); - }); + QObject::connect(transaction, &PackageKit::Transaction::details, [=](const PackageKit::Details &details) { + PackageKit::Transaction *transaction = PackageKit::Daemon::removePackage(details.packageId()); + QObject::connect(transaction, &PackageKit::Transaction::finished, uninstallLambda); + QObject::connect(transaction, &PackageKit::Transaction::errorCode, exitWithError); + }); QObject::connect(transaction, &PackageKit::Transaction::errorCode, exitWithError); // Fallback error handling - QObject::connect(transaction, &PackageKit::Transaction::finished, - [=](PackageKit::Transaction::Exit status, uint) { - if (status != PackageKit::Transaction::ExitSuccess) { - QTimer::singleShot(500, [=]() { - fail(i18n("Failed to uninstall \"%1\", exited with status \"%2\"", - fileName, QVariant::fromValue(status).toString())); - }); - } - }); - } + QObject::connect(transaction, &PackageKit::Transaction::finished, [=](PackageKit::Transaction::Exit status, uint) { + if (status != PackageKit::Transaction::ExitSuccess) { + QTimer::singleShot(500, [=]() { + fail(i18n("Failed to uninstall \"%1\", exited with status \"%2\"", fileName, QVariant::fromValue(status).toString())); + }); + } + }); +} #endif Q_NORETURN void packageKit(PackageOperation operation, const QString &fileName) { -#ifdef HAVE_PACKAGEKIT +#if HAVE_PACKAGEKIT QFileInfo fileInfo(fileName); if (!fileInfo.exists()) { fail(i18n("The file does not exist!")); @@ -131,46 +125,54 @@ Q_NORETURN void packageKit(PackageOperation operation, const QString &fileName) #endif } -struct UncompressCommand -{ +struct UncompressCommand { QString command; QStringList args1; QStringList args2; }; -enum ScriptExecution{ - Process, - Konsole -}; +enum ScriptExecution { Process, Konsole }; void runUncompress(const QString &inputPath, const QString &outputPath) { QVector> mimeTypeToCommand; - mimeTypeToCommand.append({{"application/x-tar", "application/tar", "application/x-gtar", "multipart/x-tar"}, - UncompressCommand({"tar", {"-xf"}, {"-C"}})}); - mimeTypeToCommand.append({{"application/x-gzip", "application/gzip", - "application/x-gzip-compressed-tar", "application/gzip-compressed-tar", - "application/x-gzip-compressed", "application/gzip-compressed", - "application/tgz", "application/x-compressed-tar", - "application/x-compressed-gtar", "file/tgz", - "multipart/x-tar-gz", "application/x-gunzip", "application/gzipped", + mimeTypeToCommand.append({{"application/x-tar", "application/tar", "application/x-gtar", "multipart/x-tar"}, UncompressCommand({"tar", {"-xf"}, {"-C"}})}); + mimeTypeToCommand.append({{"application/x-gzip", + "application/gzip", + "application/x-gzip-compressed-tar", + "application/gzip-compressed-tar", + "application/x-gzip-compressed", + "application/gzip-compressed", + "application/tgz", + "application/x-compressed-tar", + "application/x-compressed-gtar", + "file/tgz", + "multipart/x-tar-gz", + "application/x-gunzip", + "application/gzipped", "gzip/document"}, UncompressCommand({"tar", {"-zxf"}, {"-C"}})}); - mimeTypeToCommand.append({{"application/bzip", "application/bzip2", "application/x-bzip", - "application/x-bzip2", "application/bzip-compressed", - "application/bzip2-compressed", "application/x-bzip-compressed", - "application/x-bzip2-compressed", "application/bzip-compressed-tar", - "application/bzip2-compressed-tar", "application/x-bzip-compressed-tar", - "application/x-bzip2-compressed-tar", "application/x-bz2"}, + mimeTypeToCommand.append({{"application/bzip", + "application/bzip2", + "application/x-bzip", + "application/x-bzip2", + "application/bzip-compressed", + "application/bzip2-compressed", + "application/x-bzip-compressed", + "application/x-bzip2-compressed", + "application/bzip-compressed-tar", + "application/bzip2-compressed-tar", + "application/x-bzip-compressed-tar", + "application/x-bzip2-compressed-tar", + "application/x-bz2"}, UncompressCommand({"tar", {"-jxf"}, {"-C"}})}); - mimeTypeToCommand.append({{"application/zip", "application/x-zip", "application/x-zip-compressed", - "multipart/x-zip"}, - UncompressCommand({"unzip", {}, {"-d"}})}); + mimeTypeToCommand.append( + {{"application/zip", "application/x-zip", "application/x-zip-compressed", "multipart/x-zip"}, UncompressCommand({"unzip", {}, {"-d"}})}); const auto mime = QMimeDatabase().mimeTypeForFile(inputPath).name(); UncompressCommand command{}; - for (const auto &pair : qAsConst(mimeTypeToCommand)) { + for (const auto &pair : std::as_const(mimeTypeToCommand)) { if (pair.first.contains(mime)) { command = pair.second; break; @@ -182,17 +184,13 @@ void runUncompress(const QString &inputPath, const QString &outputPath) } QProcess process; - process.start( - command.command, - QStringList() << command.args1 << inputPath << command.args2 << outputPath, - QIODevice::NotOpen); + process.start(command.command, QStringList() << command.args1 << inputPath << command.args2 << outputPath, QIODevice::NotOpen); if (!process.waitForStarted()) { fail(i18n("Failed to run uncompressor command for %1", inputPath)); } if (!process.waitForFinished()) { - fail( - i18n("Process did not finish in reasonable time: %1 %2", process.program(), process.arguments().join(" "))); + fail(i18n("Process did not finish in reasonable time: %1 %2", process.program(), process.arguments().join(" "))); } if (process.exitStatus() != QProcess::NormalExit || process.exitCode() != 0) { @@ -204,7 +202,7 @@ QString findRecursive(const QString &dir, const QString &basename) { QDirIterator it(dir, QStringList{basename}, QDir::Files, QDirIterator::Subdirectories); while (it.hasNext()) { - return QFileInfo(it.next()).canonicalFilePath(); + return QFileInfo(it.next()).absoluteFilePath(); } return QString(); @@ -224,7 +222,11 @@ bool runScriptOnce(const QString &path, const QStringList &args, ScriptExecution bashCommand.append("|| $SHELL"); // If the install script fails a shell opens and the user can fix the problem // without an error konsole closes - process.start("konsole", QStringList() << "-e" << "bash" << "-c" << bashCommand, QIODevice::NotOpen); + process.start("konsole", + QStringList() << "-e" + << "bash" + << "-c" << bashCommand, + QIODevice::NotOpen); } else { process.start(path, args, QIODevice::NotOpen); } @@ -267,9 +269,10 @@ bool runScriptVariants(const QString &path, bool hasArgVariants, const QStringLi return true; } - errorText = i18nc( - "%2 = comma separated list of arguments", - "Installer script %1 failed, tried arguments \"%2\".", path, argVariants.join(i18nc("Separator between arguments", "\", \""))); + errorText = i18nc("%2 = comma separated list of arguments", + "Installer script %1 failed, tried arguments \"%2\".", + path, + argVariants.join(i18nc("Separator between arguments", "\", \""))); return false; } @@ -337,7 +340,7 @@ bool cmdInstall(const QString &archive, QString &errorText) // If "install-it" is missing, try "install" QString installerPath; - const QStringList basenames2 = {"installKDE4.sh", "installKDE4", "install.sh", "install"}; + const QStringList basenames2 = {"installKDE4.sh", "installKDE4", "install.sh", "install*.sh"}; for (const auto &basename : basenames2) { const auto path = findRecursive(dir, basename); if (!path.isEmpty()) { @@ -379,7 +382,7 @@ bool cmdUninstall(const QString &archive, QString &errorText) // Try "deinstall" first QString deinstallPath; - const QStringList basenames1 = {"uninstall.sh", "uninstal", "deinstall.sh", "deinstall"}; + const QStringList basenames1 = {"uninstall.sh", "uninstall", "deinstall.sh", "deinstall"}; for (const auto &basename : basenames1) { const auto path = findRecursive(dir, basename); if (!path.isEmpty()) { @@ -396,8 +399,7 @@ bool cmdUninstall(const QString &archive, QString &errorText) } else { // If "deinstall" is missing, try "install --uninstall" QString installerPath; - const QStringList basenames2 = {"install-it.sh", "install-it", "installKDE4.sh", - "installKDE4", "install.sh", "install"}; + const QStringList basenames2 = {"install-it.sh", "install-it", "installKDE4.sh", "installKDE4", "install.sh", "install"}; for (const auto &basename : basenames2) { const auto path = findRecursive(dir, basename); if (!path.isEmpty()) { @@ -407,8 +409,7 @@ bool cmdUninstall(const QString &archive, QString &errorText) } if (!installerPath.isEmpty()) { - const bool ok = runScriptVariants(installerPath, true, - {"--remove", "--delete", "--uninstall", "--deinstall"}, errorText); + const bool ok = runScriptVariants(installerPath, true, {"--remove", "--delete", "--uninstall", "--deinstall"}, errorText); if (!ok) { return ok; }