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 }