File indexing completed on 2024-05-26 05:37:12

0001 /*
0002     SPDX-FileCopyrightText: 2020 Alexander Lohnau <alexander.lohnau@gmx.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "PackageKitJob.h"
0008 
0009 #include <KOSRelease>
0010 #include <KShell>
0011 #include <PackageKit/Daemon>
0012 #include <PackageKit/Details>
0013 #include <QDBusConnection>
0014 #include <QFileInfo>
0015 #include <QMimeDatabase>
0016 #include <QProcess>
0017 #include <QRegularExpression>
0018 
0019 #include "PackageKitConfirmationDialog.h"
0020 
0021 void PackageKitJob::executeOperation(const QFileInfo &fileInfo, const QString &mimeType, bool install)
0022 {
0023     if (!supportedPackagekitMimeTypes().contains(mimeType)) {
0024         Q_EMIT error(i18nc("@info", "The mime type %1 is not supported by the packagekit backend", mimeType));
0025         return;
0026     }
0027 
0028     if (install) {
0029         PackageKitConfirmationDialog dlg(fileInfo.absoluteFilePath());
0030         if (dlg.exec() == QDialog::Accepted) {
0031             packageKitInstall(fileInfo.absoluteFilePath());
0032         } else {
0033             Q_EMIT error(QString());
0034         }
0035     } else {
0036         packageKitUninstall(fileInfo.absoluteFilePath());
0037     }
0038 }
0039 
0040 void PackageKitJob::packageKitInstall(const QString &fileName)
0041 {
0042     PackageKit::Transaction *transaction = PackageKit::Daemon::installFile(fileName, {});
0043     connect(transaction, &PackageKit::Transaction::finished, this, &PackageKitJob::transactionFinished);
0044     connect(transaction, &PackageKit::Transaction::errorCode, this, &PackageKitJob::transactionError);
0045 }
0046 
0047 void PackageKitJob::packageKitUninstall(const QString &fileName)
0048 {
0049     PackageKit::Transaction *transaction = PackageKit::Daemon::getDetailsLocal(fileName);
0050     connect(transaction, &PackageKit::Transaction::details, this, [this](const PackageKit::Details &details) {
0051         removePackage(details.packageId());
0052     });
0053     connect(transaction, &PackageKit::Transaction::errorCode, this, &PackageKitJob::transactionError);
0054 }
0055 
0056 void PackageKitJob::removePackage(const QString &packageId)
0057 {
0058     PackageKit::Transaction *transaction = PackageKit::Daemon::removePackage(packageId);
0059     connect(transaction, &PackageKit::Transaction::finished, this, &PackageKitJob::transactionFinished);
0060     connect(transaction, &PackageKit::Transaction::errorCode, this, &PackageKitJob::transactionError);
0061 }
0062 
0063 void PackageKitJob::transactionError(PackageKit::Transaction::Error, const QString &details)
0064 {
0065     Q_EMIT error(details);
0066 }
0067 
0068 void PackageKitJob::transactionFinished(PackageKit::Transaction::Exit status, uint)
0069 {
0070     if (status == PackageKit::Transaction::ExitSuccess) {
0071         Q_EMIT finished();
0072     }
0073 }
0074 
0075 QStringList PackageKitJob::supportedPackagekitMimeTypes()
0076 {
0077     QDBusMessage message =
0078         QDBusMessage::createMethodCall("org.freedesktop.PackageKit", "/org/freedesktop/PackageKit", "org.freedesktop.DBus.Properties", "Get");
0079     message.setArguments({"org.freedesktop.PackageKit", "MimeTypes"});
0080     QDBusMessage reply = QDBusConnection::systemBus().call(message);
0081     return reply.arguments().at(0).value<QDBusVariant>().variant().toStringList();
0082 }