#ifndef PACKAGEMANAGEMENT_PACKAGESOURCE_H #define PACKAGEMANAGEMENT_PACKAGESOURCE_H #include "package.h" #include "group.h" #include #include #include QT_FORWARD_DECLARE_CLASS(QNetworkReply) namespace PackageManagement { class UpgradeLookupResults; class Reply : public QObject { Q_OBJECT public: Reply(QNetworkReply *networkReply); const QString &error() const; signals: void resultsAvailable(); private slots: virtual void processData() = 0; protected: QNetworkReply *m_networkReply; QString m_error; }; inline const QString &Reply::error() const { return m_error; } class PackageReply : public Reply { Q_OBJECT public: PackageReply(QNetworkReply *networkReply, std::map > &packages); const std::map > &packages() const; protected: std::map > &m_packages; }; inline PackageReply::PackageReply(QNetworkReply *networkReply, std::map > &packages) : Reply(networkReply), m_packages(packages) {} inline const std::map > &PackageReply::packages() const { return m_packages; } class SuggestionsReply : public Reply { Q_OBJECT public: SuggestionsReply(QNetworkReply *networkReply); const QJsonArray &suggestions() const; protected: QJsonArray m_suggestions; }; inline SuggestionsReply::SuggestionsReply(QNetworkReply *networkReply) : Reply(networkReply) {} inline const QJsonArray &SuggestionsReply::suggestions() const { return m_suggestions; } enum class RepositoryType { AlpmDataBase, /*! The repository is an AlpmDataBase instance. */ UserRepository, /*! The repository is a UserRepository instance. */ Other /*! The repository type is unknown. */ }; class Repository : public QObject { Q_OBJECT public: ~Repository(); virtual RepositoryType type() const = 0; // general meta data const QString &name() const; const QString &description() const; const std::map > &packages() const; std::map > &packages(); const QStringList packageNames() const; alpm_db_usage_t usage() const; virtual bool isSourceOnly() const; const std::map > &groups() const; const QStringList &serverUrls() const; alpm_siglevel_t sigLevel() const; // gathering data virtual bool requestsRequired() const; virtual SuggestionsReply *requestSuggestions(const QString &phrase) const; virtual PackageReply *requestPackageInfo(const QStringList &packageNames, bool forceUpdate = false) const; virtual PackageReply *requestFullPackageInfo(const QString &package, bool forceUpdate = false) const; // package search const Package *packageByName(const QString &name) const; Package *packageByName(const QString &name); const Package *packageProviding(const Dependency &dependency) const; QList packagesProviding(const Dependency &dependency) const; QList packageByFilter(std::function pred); // upgrade lookup const QList &upgradeSources() const; QList &upgradeSources(); QJsonArray upgradeSourcesJsonArray() const; void checkForUpgrades(UpgradeLookupResults &results) const; void checkForUpgrades(UpgradeLookupResults &results, const QList &upgradeSources) const; // build system const QString &sourcesDirectory() const; void setSourcesDirectory(const QString &dir); const QString &packagesDirectory() const; void setPackagesDirectory(const QString &dir); // JSON serialization QJsonArray packageNamesJsonArray() const; QJsonObject basicInfo() const; QJsonObject groupInfo() const; protected: explicit Repository(const QString &name, QObject *parent = nullptr); QString m_name; QString m_description; std::map > m_packages; alpm_db_usage_t m_usage; std::map > m_groups; QStringList m_serverUrls; alpm_siglevel_t m_sigLevel; QList m_upgradeSources; QString m_srcDir; QString m_pkgDir; }; /*! * \brief Returns the name. */ inline const QString &Repository::name() const { return m_name; } /*! * \brief Returns the description. */ inline const QString &Repository::description() const { return m_description; } /*! * \brief Returns the packages. */ inline const std::map > &Repository::packages() const { return m_packages; } /*! * \brief Returns the packages. */ inline std::map > &Repository::packages() { return m_packages; } /*! * \brief Returns the package with the specified \a name or nullptr if the package can not be found. * \remarks Ownership remains by this instance. */ inline const Package *Repository::packageByName(const QString &name) const { try { return m_packages.at(name).get(); } catch(const std::out_of_range &) { return nullptr; } } /*! * \brief Returns the package with the specified \a name or nullptr if the package can not be found. * \remarks Ownership remains by this instance. */ inline Package *Repository::packageByName(const QString &name) { try { return m_packages.at(name).get(); } catch(const std::out_of_range &) { return nullptr; } } inline alpm_db_usage_t Repository::usage() const { return m_usage; } inline const std::map > &Repository::groups() const { return m_groups; } /*! * \brief Returns the server URLs. */ inline const QStringList &Repository::serverUrls() const { return m_serverUrls; } /*! * \brief Returns the signature level of the database. */ inline alpm_siglevel_t Repository::sigLevel() const { return m_sigLevel; } inline const QList &Repository::upgradeSources() const { return m_upgradeSources; } inline QList &Repository::upgradeSources() { return m_upgradeSources; } inline void Repository::checkForUpgrades(UpgradeLookupResults &results) const { checkForUpgrades(results, upgradeSources()); } /*! * \brief Returns the path of the local sources directory. */ inline const QString &Repository::sourcesDirectory() const { return m_srcDir; } /*! * \brief Sets the path of the local sources directory. */ inline void Repository::setSourcesDirectory(const QString &dir) { m_srcDir = dir; } /*! * \brief Returns the path of the local packages directory. */ inline const QString &Repository::packagesDirectory() const { return m_pkgDir; } /*! * \brief Sets the path of the local packages directory. */ inline void Repository::setPackagesDirectory(const QString &dir) { m_pkgDir = dir; } } // namespace PackageManagement #endif // PACKAGEMANAGEMENT_PACKAGESOURCE_H