File indexing completed on 2024-06-02 05:34:37

0001 /*
0002  *   SPDX-FileCopyrightText: 2013 Lukas Appelhans <l.appelhans@gmx.de>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 #pragma once
0007 
0008 #include "PackageKitBackend.h"
0009 #include <PackageKit/Transaction>
0010 #include <resources/AbstractBackendUpdater.h>
0011 
0012 class SystemUpgrade;
0013 
0014 struct EulaHandling {
0015     std::function<PackageKit::Transaction *()> proceedFunction;
0016     bool request = false;
0017 };
0018 EulaHandling handleEula(const QString &eulaID, const QString &licenseAgreement);
0019 int percentageWithStatus(PackageKit::Transaction::Status status, uint percentage);
0020 
0021 class PackageKitUpdater : public AbstractBackendUpdater
0022 {
0023     Q_OBJECT
0024 public:
0025     explicit PackageKitUpdater(PackageKitBackend *parent = nullptr);
0026     ~PackageKitUpdater() override;
0027 
0028     void prepare() override;
0029     void checkFreeSpace();
0030 
0031     bool hasUpdates() const override;
0032     qreal progress() const override;
0033 
0034     void setProgressing(bool progressing);
0035 
0036     void removeResources(const QList<AbstractResource *> &resources) override;
0037     void addResources(const QList<AbstractResource *> &resources) override;
0038     QList<AbstractResource *> toUpdate() const override;
0039     bool isMarked(AbstractResource *resource) const override;
0040     QDateTime lastUpdate() const override;
0041     bool isCancelable() const override;
0042     bool isProgressing() const override;
0043     void fetchChangelog() const override;
0044     double updateSize() const override;
0045     quint64 downloadSpeed() const override;
0046 
0047     void proceed() override;
0048     void setOfflineUpdates(bool use) override;
0049     void setDistroUpgrade(const AppStream::Release &release);
0050     void clearDistroUpgrade();
0051     bool isDistroUpgrade() const;
0052 
0053 public Q_SLOTS:
0054     /// must be implemented if ever isCancelable is true
0055     void cancel() override;
0056     void start() override;
0057 
0058 private Q_SLOTS:
0059     void errorFound(PackageKit::Transaction::Error err, const QString &error);
0060     void mediaChange(PackageKit::Transaction::MediaType media, const QString &type, const QString &text);
0061     void eulaRequired(const QString &eulaID, const QString &packageID, const QString &vendor, const QString &licenseAgreement);
0062     void finished(PackageKit::Transaction::Exit exit, uint);
0063     void cancellableChanged();
0064     void percentageChanged();
0065     void updateDetail(const QString &packageID,
0066                       const QStringList &updates,
0067                       const QStringList &obsoletes,
0068                       const QStringList &vendorUrls,
0069                       const QStringList &bugzillaUrls,
0070                       const QStringList &cveUrls,
0071                       PackageKit::Transaction::Restart restart,
0072                       const QString &updateText,
0073                       const QString &changelog,
0074                       PackageKit::Transaction::UpdateState state,
0075                       const QDateTime &issued,
0076                       const QDateTime &updated);
0077     void packageResolved(PackageKit::Transaction::Info info, const QString &packageId);
0078     void repoSignatureRequired(const QString &packageID,
0079                                const QString &repoName,
0080                                const QString &keyUrl,
0081                                const QString &keyUserid,
0082                                const QString &keyId,
0083                                const QString &keyFingerprint,
0084                                const QString &keyTimestamp,
0085                                PackageKit::Transaction::SigType type);
0086 
0087 private:
0088     void processProceedFunction();
0089     void itemProgress(const QString &itemID, PackageKit::Transaction::Status status, uint percentage);
0090     void fetchLastUpdateTime();
0091     void lastUpdateTimeReceived(QDBusPendingCallWatcher *w);
0092     void setupTransaction(PackageKit::Transaction::TransactionFlags flags);
0093     bool useOfflineUpdates() const;
0094 
0095     QSet<QString> involvedPackages(const QSet<AbstractResource *> &packages) const;
0096     QSet<AbstractResource *> packagesForPackageId(const QSet<QString> &packages) const;
0097 
0098     QPointer<PackageKit::Transaction> m_transaction;
0099     PackageKitBackend *const m_backend;
0100     QSet<AbstractResource *> m_toUpgrade;
0101     QSet<AbstractResource *> m_allUpgradeable;
0102     bool m_isCancelable;
0103     bool m_isProgressing;
0104     bool m_useOfflineUpdates = false;
0105     int m_percentage;
0106     QDateTime m_lastUpdate;
0107     QMap<PackageKit::Transaction::Info, QStringList> m_packagesModified;
0108     QVector<std::function<PackageKit::Transaction *()>> m_proceedFunctions;
0109 
0110     SystemUpgrade *m_upgrade = nullptr;
0111 };