#ifndef ALPM_PACKAGE_H #define ALPM_PACKAGE_H #include "./list.h" #include #include #include #include #include #include QT_FORWARD_DECLARE_CLASS(QJsonObject) QT_FORWARD_DECLARE_CLASS(QJsonValue) namespace RepoIndex { class Repository; /*! * \brief The PackageVersionComparsion enum defines possible results of packages version comparison. */ enum class PackageVersionComparsion { Equal, /*!< The version of this package is the same as the version of the package from the sync db. */ SoftwareUpgrade, /*!< The software version of the package from the sync db is newer. */ PackageUpgradeOnly, /*!< The package release number of the package from the sync db is newer. */ NewerThenSyncVersion /*!< The version of this package is NEWER then the version of the package from the sync db. */ }; /*! * \brief The ComparsionResult enum defines possible results of package version part comparsion. */ enum class PackageVersionPartComparsion { Equal, /*!< Both parts are equal. */ Newer, /*!< Part 1 is newer then part 2. */ Older /*!< Part 2 is newer then part 1. */ }; /*! * \brief The PackageOrigin enum describes where a Package instance comes from. */ enum class PackageOrigin { Unknown = 20, /*! The origin is unknown. */ File = ALPM_PKG_FROM_FILE, /*!< The instance has been created from a package file; source() returns nullptr in this case. */ LocalDb = ALPM_PKG_FROM_LOCALDB, /*! The instance is from the local data base; source() is an AlpmDataBase instance. */ SyncDb = ALPM_PKG_FROM_SYNCDB, /*! The instance is from a sync data base; source() is an AlpmDataBase instance. */ Aur = 21 /*! The instance is from the AUR; source() is a UserRepository instance. */ }; enum class InstallStatus { Explicit = ALPM_PKG_REASON_EXPLICIT, AsDependency = ALPM_PKG_REASON_DEPEND, None = 20 }; class PackageVersion { public: explicit PackageVersion(const QString &versionStr); static PackageVersionPartComparsion compareParts(const QString &part1, const QString &part2); PackageVersionComparsion compare(const PackageVersion &other) const; QString epoch; QString version; QString release; }; class Dependency { public: explicit Dependency(const QString &name, const QString &version = QString(), _alpm_depmod_t mode = ALPM_DEP_MOD_ANY); QString name; QString version; _alpm_depmod_t mode; }; inline Dependency::Dependency(const QString &name, const QString &version, _alpm_depmod_t mode) : name(name), version(version), mode(mode) {} class Manager; class Package { public: virtual ~Package(); // general package meta data PackageOrigin origin() const; Repository *source() const; bool hasGeneralInfo() const; const QString &name() const; const QString &version() const; const QString &description() const; const QString &upstreamUrl() const; const QStringList &licenses() const; const QStringList &groups() const; const QList &dependencies() const; const QList &optionalDependencies() const; const QList &conflicts() const; const QList &provides() const; const QList &replaces() const; bool isRequiredByComputed() const; void computeRequiredBy(Manager &manager); const QStringList &requiredBy() const; const QStringList &optionalFor() const; bool hasInstallScript() const; // build related meta data bool hasBuildRelatedMetaData() const; const QString &fileName() const; const QJsonArray &files() const; ChronoUtilities::DateTime buildDate() const; const QString &packer() const; const QString &md5() const; const QString &sha256() const; const QString &buildArchitecture() const; uint32 packageSize() const; const QList &makeDependencies() const; // installation related meta data bool hasInstallRelatedMetaData() const; ChronoUtilities::DateTime installDate() const; uint32 installedSize() const; const QStringList &backupFiles() const; alpm_pkgvalidation_t validationMethods() const; alpm_pkgreason_t installReason() const; // source related meta data bool hasSourceRelatedMetaData() const; const QString &baseName() const; const QStringList &architectures() const; int32 id() const; int32 categoryId() const; int32 votes() const; ChronoUtilities::DateTime outOfDate() const; const QString &maintainer() const; ChronoUtilities::DateTime firstSubmitted() const; ChronoUtilities::DateTime lastModified() const; const QString &tarUrl() const; const std::map &sourceFiles() const; // version comparsion PackageVersionComparsion compareVersion(const Package *syncPackage) const; PackageVersionComparsion compareVersion(const Dependency &dependency) const; static bool matches(const QString &name, const QString &version, const Dependency &dependency); bool matches(const Dependency &dependency); // JSON serialization QJsonObject basicInfo(bool includeRepoAndName = false) const; QJsonObject fullInfo(bool includeRepoAndName = false) const; // caching void writeToCacheStream(QDataStream &out); void restoreFromCacheStream(QDataStream &in); protected: explicit Package(const QString &name, Repository *source); virtual void writeSpecificCacheHeader(QDataStream &out); virtual void restoreSpecificCacheHeader(QDataStream &in); PackageOrigin m_origin; Repository *m_source; // general package meta data bool m_hasGeneralInfo; QString m_name; QString m_version; QString m_description; QString m_upstreamUrl; QStringList m_licenses; QStringList m_groups; QList m_dependencies; QList m_optionalDependencies; QList m_conflicts; QList m_provides; QList m_replaces; bool m_requiredByComputed; QStringList m_requiredBy; QStringList m_optionalFor; bool m_hasInstallScript; // build related meta data bool m_hasBuildRelatedMetaData; QString m_fileName; QJsonArray m_files; ChronoUtilities::DateTime m_buildDate; QString m_packer; QString m_md5; QString m_sha256; QString m_buildArchitecture; uint32 m_packageSize; QList m_makeDependencies; // installation related meta data bool m_hasInstallRelatedMetaData; ChronoUtilities::DateTime m_installDate; uint32 m_installedSize; QStringList m_backupFiles; alpm_pkgvalidation_t m_validationMethods; alpm_pkgreason_t m_installReason; // source related meta data bool m_hasSourceRelatedMetaData; QString m_baseName; QStringList m_architectures; int32 m_id; int32 m_categoryId; int32 m_votes; ChronoUtilities::DateTime m_outOfDate; QString m_maintainer; ChronoUtilities::DateTime m_firstSubmitted; ChronoUtilities::DateTime m_lastModified; QString m_tarUrl; std::map m_sourceFiles; }; /*! * \brief Returns where the package instance comes from (local db, sync db, pkg file, AUR). */ inline PackageOrigin Package::origin() const { return m_origin; } /*! * \brief Returns the package source. * \remarks Might be nullptr if no source is associated. */ inline Repository *Package::source() const { return m_source; } /*! * \brief Returns whether general information is available for the package. */ inline bool Package::hasGeneralInfo() const { return m_hasGeneralInfo; } /*! * \brief Returns the name. */ inline const QString &Package::name() const { return m_name; } /*! * \brief Returns the version. */ inline const QString &Package::version() const { return m_version; } /*! * \brief Returns the description. */ inline const QString &Package::description() const { return m_description; } /*! * \brief Returns the upstream URL. */ inline const QString &Package::upstreamUrl() const { return m_upstreamUrl; } /*! * \brief Returns the licenses. */ inline const QStringList &Package::licenses() const { return m_licenses; } /*! * \brief Returns the groups. */ inline const QStringList &Package::groups() const { return m_groups; } /*! * \brief Returns the dependencies. */ inline const QList &Package::dependencies() const { return m_dependencies; } /*! * \brief Returns the optional dependencies. */ inline const QList &Package::optionalDependencies() const { return m_optionalDependencies; } /*! * \brief Returns conflicting packages. */ inline const QList &Package::conflicts() const { return m_conflicts; } /*! * \brief Returns provides. */ inline const QList &Package::provides() const { return m_provides; } /*! * \brief Returns packages which are replaced by this package. */ inline const QList &Package::replaces() const { return m_replaces; } /*! * \brief Returns whether required-by and optional-for have been computed. */ inline bool Package::isRequiredByComputed() const { return m_requiredByComputed; } /*! * \brief Returns packages requiring this packages. */ inline const QStringList &Package::requiredBy() const { return m_requiredBy; } /*! * \brief Returns packages having this package as optional dependency. */ inline const QStringList &Package::optionalFor() const { return m_optionalFor; } /*! * \brief Returns whether the package has an install script. */ inline bool Package::hasInstallScript() const { return m_hasInstallScript; } /*! * \brief Returns whether the package has build-related meta data. * * Build-related meta data is information about a particular package file such * as architecture, file name, build date, .... */ inline bool Package::hasBuildRelatedMetaData() const { return m_hasBuildRelatedMetaData; } /*! * \brief Returns the file name of the package file. */ inline const QString &Package::fileName() const { return m_fileName; } /*! * \brief Returns the file of the package as JSON array. */ inline const QJsonArray &Package::files() const { return m_files; } /*! * \brief Returns the build date of the package file. */ inline ChronoUtilities::DateTime Package::buildDate() const { return m_buildDate; } /*! * \brief Returns the packer of the package file. */ inline const QString &Package::packer() const { return m_packer; } /*! * \brief Returns the MD5 hash of the package file. */ inline const QString &Package::md5() const { return m_md5; } /*! * \brief Returns the SHA-256 hash of the package file. */ inline const QString &Package::sha256() const { return m_sha256; } /*! * \brief Returns the architecture of the package file. */ inline const QString &Package::buildArchitecture() const { return m_buildArchitecture; } /*! * \brief Returns the size of the package file. */ inline uint32 Package::packageSize() const { return m_packageSize; } /*! * \brief Returns make dependencies. */ inline const QList &Package::makeDependencies() const { return m_makeDependencies; } /*! * \brief Returns whether install-related meta data is available. * * Install-related meta data is information such as the install date, * the installed size, files backuped during installation, ... * * Most of the install-related meta data is only available for packages * from the local data base (see origin()). */ inline bool Package::hasInstallRelatedMetaData() const { return m_hasInstallRelatedMetaData; } /*! * \brief Returns the install date. */ inline ChronoUtilities::DateTime Package::installDate() const { return m_installDate; } /*! * \brief Returns the installed size. */ inline uint32 Package::installedSize() const { return m_installedSize; } /*! * \brief Returns the files which have been backued up during installation. */ inline const QStringList &Package::backupFiles() const { return m_backupFiles; } /*! * \brief Returns the validation methods used during installation. */ inline alpm_pkgvalidation_t Package::validationMethods() const { return m_validationMethods; } /*! * \brief Returns whether the package has been installed explicitely or as a dependency. */ inline alpm_pkgreason_t Package::installReason() const { return m_installReason; } /*! * \brief Returns whether source-related meta data is available. * * Source-related meta data is information about the PKGBUILD file such has * its AUR IDs, AUR votes, maintainer, flag date, ... */ inline bool Package::hasSourceRelatedMetaData() const { return m_hasSourceRelatedMetaData; } /*! * \brief Returns the base name. */ inline const QString &Package::baseName() const { return m_baseName; } /*! * \brief Returns the architecutes (from the PKGBUILD file). * \remarks For the architecture of the particular package file * see buildArchitecture(). */ inline const QStringList &Package::architectures() const { return m_architectures; } /*! * \brief Returns the ID. */ inline int32 Package::id() const { return m_id; } /*! * \brief Returns the category ID. */ inline int32 Package::categoryId() const { return m_categoryId; } /*! * \brief Returns the votes of the package. */ inline int32 Package::votes() const { return m_votes; } /*! * \brief Returns the flag date. */ inline ChronoUtilities::DateTime Package::outOfDate() const { return m_outOfDate; } /*! * \brief Returns the maintainer. */ inline const QString &Package::maintainer() const { return m_maintainer; } /*! * \brief Returns when the package was first submitted. */ inline ChronoUtilities::DateTime Package::firstSubmitted() const { return m_firstSubmitted; } /*! * \brief Returns the last time when the package was modified. */ inline ChronoUtilities::DateTime Package::lastModified() const { return m_lastModified; } /*! * \brief Returns a URL to a tar file with the sources. */ inline const QString &Package::tarUrl() const { return m_tarUrl; } /*! * \brief Returns the source files of the package. */ inline const std::map &Package::sourceFiles() const { return m_sourceFiles; } /*! * \brief Compares the version of the package with the specified sync package. */ inline PackageVersionComparsion Package::compareVersion(const Package *syncPackage) const { return PackageVersion(version()).compare(PackageVersion(syncPackage->version())); } /*! * \brief Compares the version of the package with the version of the specified \a dependency. */ inline PackageVersionComparsion Package::compareVersion(const Dependency &dependency) const { return PackageVersion(version()).compare(PackageVersion(dependency.version)); } /*! * \brief Checks whether the package matches the specified \a dependency. */ inline bool Package::matches(const Dependency &dependency) { return matches(name(), version(), dependency); } } #endif // ALPM_PACKAGE_H