repoindex/lib/alpm/upgradelookup.h

209 lines
4.5 KiB
C
Raw Normal View History

2015-09-04 14:37:01 +02:00
#ifndef PACKAGEMANAGEMENT_UPDATELOOKUP_H
#define PACKAGEMANAGEMENT_UPDATELOOKUP_H
#include "./package.h"
2015-09-04 14:37:01 +02:00
#include <QObject>
#include <QJsonObject>
#include <QJsonArray>
#include <QFutureWatcher>
namespace RepoIndex {
2015-09-04 14:37:01 +02:00
class Manager;
class UpgradeLookup;
class UpgradeLookupProcess;
class PackageReply;
class UpgradeResult
{
public:
UpgradeResult(const Package *package, const QString &currentVersion);
2015-09-04 14:37:01 +02:00
const Package *package;
QString currentVersion;
2015-09-27 19:29:45 +02:00
QJsonObject toJson() const;
2015-09-04 14:37:01 +02:00
};
/*!
* \brief Constructs a new upgrade result.
*/
2015-09-04 14:37:01 +02:00
inline UpgradeResult::UpgradeResult(const Package *package, const QString &previousVersion) :
package(package),
currentVersion(previousVersion)
2015-09-04 14:37:01 +02:00
{}
class UpgradeLookupResults
{
public:
UpgradeLookupResults();
/*!
* \brief Indicates that there are no upgrade sources available.
*/
bool noSources;
/*!
* \brief Packages providing a software upgrade (new version).
*/
QList<UpgradeResult> newVersions;
/*!
* \brief Package upgrades only (new release).
*/
QList<UpgradeResult> newReleases;
/*!
* \brief Downgrades (older version in sync db).
*/
QList<UpgradeResult> downgrades;
/*!
* \brief Orphaned packages (could not be found in any of the sync dbs).
*/
QSet<const Package *> orphaned;
/*!
* \brief Warnings occured when checking for updates.
*/
QStringList warnings;
/*!
* \brief Errors occured when checking for updates.
*/
QStringList errors;
};
/*!
* \brief Constructs new update lookup results.
*/
inline UpgradeLookupResults::UpgradeLookupResults() :
noSources(false)
{}
class UpgradeLookupProcess : public QObject
{
Q_OBJECT
public:
2015-09-27 19:29:45 +02:00
explicit UpgradeLookupProcess(UpgradeLookup *upgradeLookup, Repository *upgradeSource);
2015-09-04 14:37:01 +02:00
const UpgradeLookupResults &results() const;
2020-03-09 18:45:47 +01:00
Q_SIGNALS:
2015-09-04 14:37:01 +02:00
void finished();
2020-03-08 14:12:22 +01:00
private Q_SLOTS:
2016-02-25 22:53:33 +01:00
void requestSources();
2015-09-04 14:37:01 +02:00
void sourceReady();
void checkUpgrades();
private:
2016-02-26 01:27:57 +01:00
bool ensureNotBusy();
2015-09-04 14:37:01 +02:00
const Repository *m_toCheck;
2015-09-27 19:29:45 +02:00
Repository *m_upgradeSource;
2015-09-04 14:37:01 +02:00
PackageReply *m_reply;
QFutureWatcher<void> *m_watcher;
UpgradeLookupResults m_results;
};
class UpgradeLookup : public QObject
{
Q_OBJECT
friend class UpgradeLookupProcess;
2015-09-04 14:37:01 +02:00
public:
const Repository *toCheck() const;
2020-03-08 14:12:22 +01:00
private Q_SLOTS:
virtual void processFinished() = 0;
protected:
explicit UpgradeLookup(QObject *parent = nullptr);
2015-09-29 21:52:30 +02:00
2015-09-27 19:29:45 +02:00
Repository *m_toCheck;
unsigned int m_remainingProcesses;
bool m_firstFinished;
QSet<const Package *> m_orphanedPackages;
};
/*!
* \brief Returns the repository to be checked (if available; otherwise nullptr).
*/
inline const Repository *UpgradeLookup::toCheck() const
{
return m_toCheck;
}
class UpgradeLookupJson : public UpgradeLookup
{
Q_OBJECT
public:
2015-09-27 19:29:45 +02:00
explicit UpgradeLookupJson(Manager &manager, const QJsonObject &request, QObject *parent = nullptr);
const QJsonArray &errors() const;
2015-09-29 21:52:30 +02:00
QJsonArray results() const;
bool finished() const;
2020-03-09 18:45:47 +01:00
Q_SIGNALS:
2015-09-04 14:37:01 +02:00
void resultsAvailable(const QJsonValue &what, const QJsonValue &id, const QJsonValue &value);
2020-03-08 14:12:22 +01:00
private Q_SLOTS:
virtual void processFinished();
2015-09-04 14:37:01 +02:00
private:
const QJsonObject m_request;
QJsonArray m_warningsArray;
QJsonArray m_errorsArray;
QJsonArray m_softwareUpgradesArray;
QJsonArray m_packageOnlyUpgradesArray;
2015-09-04 14:37:01 +02:00
QJsonArray m_downgradesArray;
QJsonArray m_orphanedPackagesArray;
};
inline const QJsonArray &UpgradeLookupJson::errors() const
{
return m_errorsArray;
}
2015-09-29 21:52:30 +02:00
inline QJsonArray UpgradeLookupJson::results() const
{
return QJsonArray(); // results are currently only returned by emitting resultsAvailable()
}
inline bool UpgradeLookupJson::finished() const
{
return !m_remainingProcesses && m_errorsArray.isEmpty();
}
class UpgradeLookupCli : public UpgradeLookup
2015-09-04 14:37:01 +02:00
{
Q_OBJECT
friend class UpgradeLookupProcess;
public:
2015-09-27 19:29:45 +02:00
explicit UpgradeLookupCli(Manager &manager, const std::string &repo, QObject *parent = nullptr);
2017-01-23 21:59:45 +01:00
bool hasErrors() const;
const Repository *toCheck() const;
2020-03-08 14:12:22 +01:00
private Q_SLOTS:
void processFinished();
private:
void printResults();
QStringList m_warningsArray;
QStringList m_errorsArray;
QStringList m_softwareUpgradesArray;
QStringList m_packageOnlyUpgradesArray;
QStringList m_downgradesArray;
QStringList m_orphanedPackagesArray;
};
2017-01-23 21:59:45 +01:00
inline bool UpgradeLookupCli::hasErrors() const
{
return !m_errorsArray.isEmpty();
}
2015-09-04 14:37:01 +02:00
} // namespace PackageManagement
#endif // PACKAGEMANAGEMENT_UPDATELOOKUP_H