1 /*
2 SPDX-FileCopyrightText: 2020 Alexander Lohnau <alexander.lohnau@gmx.de>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7 #include "PackageKitJob.h"
8
9 #include <KOSRelease>
10 #include <KShell>
11 #include <PackageKit/Daemon>
12 #include <PackageKit/Details>
13 #include <QDBusConnection>
14 #include <QFileInfo>
15 #include <QMimeDatabase>
16 #include <QProcess>
17 #include <QRegularExpression>
18
19 #include "PackageKitConfirmationDialog.h"
20
executeOperation(const QFileInfo & fileInfo,const QString & mimeType,bool install)21 void PackageKitJob::executeOperation(const QFileInfo &fileInfo, const QString &mimeType, bool install)
22 {
23 if (!supportedPackagekitMimeTypes().contains(mimeType)) {
24 Q_EMIT error(i18nc("@info", "The mime type %1 is not supported by the packagekit backend", mimeType));
25 return;
26 }
27
28 if (install) {
29 PackageKitConfirmationDialog dlg(fileInfo.absoluteFilePath());
30 if (dlg.exec() == QDialog::Accepted) {
31 packageKitInstall(fileInfo.absoluteFilePath());
32 } else {
33 Q_EMIT error(QString());
34 }
35 } else {
36 packageKitUninstall(fileInfo.absoluteFilePath());
37 }
38 }
39
packageKitInstall(const QString & fileName)40 void PackageKitJob::packageKitInstall(const QString &fileName)
41 {
42 PackageKit::Transaction *transaction = PackageKit::Daemon::installFile(fileName, {});
43 connect(transaction, &PackageKit::Transaction::finished, this, &PackageKitJob::transactionFinished);
44 connect(transaction, &PackageKit::Transaction::errorCode, this, &PackageKitJob::transactionError);
45 }
46
packageKitUninstall(const QString & fileName)47 void PackageKitJob::packageKitUninstall(const QString &fileName)
48 {
49 PackageKit::Transaction *transaction = PackageKit::Daemon::getDetailsLocal(fileName);
50 connect(transaction, &PackageKit::Transaction::details, this, [this](const PackageKit::Details &details) {
51 removePackage(details.packageId());
52 });
53 connect(transaction, &PackageKit::Transaction::errorCode, this, &PackageKitJob::transactionError);
54 }
55
removePackage(const QString & packageId)56 void PackageKitJob::removePackage(const QString &packageId)
57 {
58 PackageKit::Transaction *transaction = PackageKit::Daemon::removePackage(packageId);
59 connect(transaction, &PackageKit::Transaction::finished, this, &PackageKitJob::transactionFinished);
60 connect(transaction, &PackageKit::Transaction::errorCode, this, &PackageKitJob::transactionError);
61 }
62
transactionError(PackageKit::Transaction::Error,const QString & details)63 void PackageKitJob::transactionError(PackageKit::Transaction::Error, const QString &details)
64 {
65 Q_EMIT error(details);
66 }
67
transactionFinished(PackageKit::Transaction::Exit status,uint)68 void PackageKitJob::transactionFinished(PackageKit::Transaction::Exit status, uint)
69 {
70 if (status == PackageKit::Transaction::ExitSuccess) {
71 Q_EMIT finished();
72 }
73 }
74
supportedPackagekitMimeTypes()75 QStringList PackageKitJob::supportedPackagekitMimeTypes()
76 {
77 QDBusMessage message =
78 QDBusMessage::createMethodCall("org.freedesktop.PackageKit", "/org/freedesktop/PackageKit", "org.freedesktop.DBus.Properties", "Get");
79 message.setArguments({"org.freedesktop.PackageKit", "MimeTypes"});
80 QDBusMessage reply = QDBusConnection::systemBus().call(message);
81 return reply.arguments().at(0).value<QDBusVariant>().variant().toStringList();
82 }
83