* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
+#include <KLocalizedString>
+#include <KShell>
+#include <QCommandLineParser>
#include <QDebug>
-#include <QProcess>
-#include <QTimer>
-#include <QStandardPaths>
#include <QDir>
#include <QDirIterator>
-#include <QCommandLineParser>
+#include <QGuiApplication>
#include <QMimeDatabase>
+#include <QProcess>
+#include <QStandardPaths>
+#include <QTimer>
#include <QUrl>
-#include <QGuiApplication>
-#include <KLocalizedString>
-#include <KShell>
-#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 <PackageKit/Daemon>
#include <PackageKit/Details>
#include <PackageKit/Transaction>
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);
QString getServiceMenusDir()
{
const QString dataLocation = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
- return QDir(dataLocation).absoluteFilePath("kservices5/ServiceMenus");
+ 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);
}
};
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!"));
#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<QPair<QStringList, UncompressCommand>> 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;
}
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) {
{
QDirIterator it(dir, QStringList{basename}, QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext()) {
- return QFileInfo(it.next()).canonicalFilePath();
+ return QFileInfo(it.next()).absoluteFilePath();
}
return QString();
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);
}
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;
}
errorText = i18n("Failed to copy .desktop file %1 to %2: %3", archive, dest, source.errorString());
return false;
}
+ QFile destFile(dest);
+ destFile.setPermissions(destFile.permissions() | QFile::ExeOwner);
} else {
if (binaryPackages->contains(QMimeDatabase().mimeTypeForFile(archive).name())) {
packageKit(PackageOperation::Install, archive);
// 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()) {
// 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()) {
} 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()) {
}
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;
}