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