#ifndef ALPM_PACKAGE_H #define ALPM_PACKAGE_H #include #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. */ NewerThanSyncVersion /*!< The version of this package is NEWER than 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. * \remarks ALPM type: alpm_pkgfrom_t */ enum class PackageOrigin { Unknown = 20, /*! The origin is unknown. */ File = 1, /*!< The instance has been created from a package file; source() returns nullptr in this case. */ LocalDb = 2, /*! The instance is from the local data base; source() is an AlpmDataBase instance. */ SyncDb = 3, /*! 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. */ }; /*! * \brief The InstallStatus enum specifies whether a package has been installed explicitely or as dependency. */ enum class InstallStatus { Explicit = 0, AsDependency = 1, None = 20 }; /*! * \brief Either unknown, true or false. */ enum class UnknownTrueFalse : unsigned char { Unknown, True, False }; /*! * \brief The PackageValidation enum specifies methods used to validate a package. * \remarks ALMP type: alpm_pkgvalidation_t */ enum class PackageValidation { Unknown = 0, None = (1 << 0), Md5Sum = (1 << 1), Sha256Sum = (1 << 2), PgpSignature = (1 << 3) }; constexpr PackageValidation operator |(PackageValidation lhs, PackageValidation rhs) { return static_cast(static_cast(lhs) | static_cast(rhs)); } constexpr bool operator &(PackageValidation lhs, PackageValidation rhs) { return (static_cast(lhs) & static_cast(rhs)) != 0; } constexpr int operator ~(PackageValidation lhs) { return ~static_cast(lhs); } inline PackageValidation &operator |=(PackageValidation &lhs, PackageValidation rhs) { lhs = static_cast(static_cast(lhs) | static_cast(rhs)); return lhs; } inline PackageValidation &operator &=(PackageValidation &lhs, int rhs) { lhs = static_cast(static_cast(lhs) & rhs); return lhs; } /*! * \brief The SignatureLevel enum specifies PGP signature verification options. */ enum class SignatureLevel : unsigned int { Package = (1 << 0), PackageOptional = (1 << 1), PackageMarginalOk = (1 << 2), PackageUnknownOk = (1 << 3), Database = (1 << 10), DatabaseOptional = (1 << 11), DatabaseMarginalOk = (1 << 12), DatabaseUnknownOk = (1 << 13), UseDefault = (1u << 31) }; constexpr SignatureLevel operator |(SignatureLevel lhs, SignatureLevel rhs) { return static_cast(static_cast(lhs) | static_cast(rhs)); } constexpr bool operator &(SignatureLevel lhs, SignatureLevel rhs) { return (static_cast(lhs) & static_cast(rhs)) != 0; } constexpr int operator ~(SignatureLevel lhs) { return ~static_cast(lhs); } inline SignatureLevel &operator &=(SignatureLevel &lhs, int rhs) { lhs = static_cast(static_cast(lhs) & rhs); return lhs; } inline SignatureLevel &operator |=(SignatureLevel &lhs, SignatureLevel rhs) { lhs = static_cast(static_cast(lhs) | static_cast(rhs)); return lhs; } /*! * \brief The SigStatus enum specifies PGP signature verification status return codes. */ enum class SignatureStatus { Valid, KeyExpired, SigExpired, KeyUnknown, KeyDisabled, InvalidId }; class PackageVersion { public: explicit PackageVersion(const QString &versionStr); explicit PackageVersion(); static PackageVersionPartComparsion compareParts(const QString &part1, const QString &part2); PackageVersionComparsion compare(const PackageVersion &other) const; QString toString() const; QString epoch; QString version; QString release; }; /*! * \brief The DependencyMode enum specifies the version constraints in dependency specs. * \remarks ALPM: alpm_depmod_t */ enum class DependencyMode { Any = 1, /*! No version constraint */ Equal, /*! Test version equality (package=x.y.z) */ GreatherEqual, /*! Test for at least a version (package>=x.y.z) */ LessEqual, /*! Test for at most a version (package<=x.y.z) */ GreatherThen, /*! Test for greater than some version (package>x.y.z) */ LessThen /*! Test for less than some version (package(dependency.mode) ^ seed ^ qHash(dependency.description, seed); } class Manager; class Package { public: virtual ~Package(); // general package meta data PackageOrigin origin() const; Repository *repository() const; CppUtilities::DateTime timeStamp() const; void setTimeStamp(CppUtilities::DateTime timeStamp); bool hasGeneralInfo() const; bool hasAllGeneralInfo() 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(const QList &relevantRepositories); const QStringList &requiredBy() const; QStringList &requiredBy(); const QStringList &optionalFor() const; QStringList &optionalFor(); UnknownTrueFalse hasInstallScript() const; void setHasInstallScript(UnknownTrueFalse hasInstallScript); // build related meta data bool hasBuildRelatedMetaData() const; const QString &fileName() const; const QJsonArray &files() const; CppUtilities::DateTime buildDate() const; const QString &packager() const; const QString &md5() const; const QString &sha256() const; const QString &buildArchitecture() const; std::uint32_t packageSize() const; const QList &makeDependencies() const; const QList &checkDependencies() const; // installation related meta data bool hasInstallRelatedMetaData() const; CppUtilities::DateTime installDate() const; std::uint32_t installedSize() const; const QStringList &backupFiles() const; PackageValidation validationMethods() const; InstallStatus installReason() const; // source related meta data bool hasSourceRelatedMetaData() const; const QString &baseName() const; const QStringList &architectures() const; std::int32_t id() const; std::int32_t categoryId() const; std::int32_t votes() const; CppUtilities::DateTime outOfDate() const; const QString &maintainer() const; CppUtilities::DateTime firstSubmitted() const; CppUtilities::DateTime lastModified() const; const QString &tarUrl() const; const std::map &sourceFiles() const; QList *> allDependencies() 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 detailedInfo() const; QJsonObject simpleInfo() const; // caching void writeToCacheStream(QDataStream &out); void restoreFromCacheStream(QDataStream &in); void reinitEntries(); // parsing .SRCINFO/.PKGINFO/desc/depends/files info void putInfo(const QList > &baseInfo, const QList > &pkgInfo, bool includesSourceRelatedMetaData = false, bool includesBuildRelatedMetaData = false); void putDescription(const QString &name, const QList > &description, PackageOrigin origin); void putSourceFile(const QString &path, const QByteArray &data); protected: explicit Package(const QString &name, Repository *repository); virtual void writeSpecificCacheHeader(QDataStream &out); virtual void restoreSpecificCacheHeader(QDataStream &in); PackageOrigin m_origin; Repository *m_repository; CppUtilities::DateTime m_timeStamp; // general package meta data bool m_hasGeneralInfo; bool m_hasAllGeneralInfo; 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; UnknownTrueFalse m_hasInstallScript; // build related meta data bool m_hasBuildRelatedMetaData; QString m_fileName; QJsonArray m_files; CppUtilities::DateTime m_buildDate; QString m_packager; QString m_md5; QString m_sha256; QString m_pgpSignature; QString m_buildArchitecture; std::uint32_t m_packageSize; QList m_makeDependencies; QList m_checkDependencies; // installation related meta data bool m_hasInstallRelatedMetaData; CppUtilities::DateTime m_installDate; std::uint32_t m_installedSize; QStringList m_backupFiles; PackageValidation m_validationMethods; InstallStatus m_installReason; // source related meta data bool m_hasSourceRelatedMetaData; QString m_baseName; QStringList m_architectures; std::int32_t m_id; std::int32_t m_categoryId; std::int32_t m_votes; CppUtilities::DateTime m_outOfDate; QString m_maintainer; CppUtilities::DateTime m_firstSubmitted; CppUtilities::DateTime m_lastModified; QString m_tarUrl; std::map m_sourceFiles; // setter used in putDescription static const std::map m_descMap; void setName(const QStringList &values); void setVersion(const QStringList &values); void setDescription(const QStringList &values); void setUrl(const QStringList &values); void setArch(const QStringList &values); void setLicenses(const QStringList &values); void setDepends(const QStringList &values); void setMakeDepends(const QStringList &values); void setCheckDepends(const QStringList &values); void setOptDepends(const QStringList &values); void setConflicts(const QStringList &values); void setProvides(const QStringList &values); void setReplaces(const QStringList &values); void setBuildDate(const QStringList &values); void setInstallDate(const QStringList &values); void setInstalledSize(const QStringList &values); void setPackageSize(const QStringList &values); void setPackager(const QStringList &values); void setMd5(const QStringList &values); void setSha256(const QStringList &values); void setPgpSignature(const QStringList &values); void setFiles(const QStringList &values); void setValidation(const QStringList &values); void setGroups(const QStringList &values); void setFileName(const QStringList &values); void setInstallReason(const QStringList &values); }; /*! * \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 repository. * \remarks Might be nullptr if no repository is associated. */ inline Repository *Package::repository() const { return m_repository; } /*! * \brief Returns the package's timestamp. */ inline CppUtilities::DateTime Package::timeStamp() const { return m_timeStamp; } /*! * \brief Sets the package's timestamp. */ inline void Package::setTimeStamp(CppUtilities::DateTime timeStamp) { m_timeStamp = timeStamp; } /*! * \brief Returns whether general information is available for the package. */ inline bool Package::hasGeneralInfo() const { return m_hasGeneralInfo; } /*! * \brief Returns whether all general information is available for the package. */ inline bool Package::hasAllGeneralInfo() const { return m_hasAllGeneralInfo; } /*! * \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 requiring this packages. */ inline QStringList &Package::requiredBy() { return m_requiredBy; } /*! * \brief Returns packages having this package as optional dependency. */ inline const QStringList &Package::optionalFor() const { return m_optionalFor; } /*! * \brief Returns packages having this package as optional dependency. */ inline QStringList &Package::optionalFor() { return m_optionalFor; } /*! * \brief Returns whether the package has an install script. */ inline UnknownTrueFalse Package::hasInstallScript() const { return m_hasInstallScript; } /*! * \brief Sets whether the package has an install script. */ inline void Package::setHasInstallScript(UnknownTrueFalse hasInstallScript) { m_hasInstallScript = 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 paths of the files of the binary package as JSON array. * \remarks For source files see \a sourceFiles(). */ inline const QJsonArray &Package::files() const { return m_files; } /*! * \brief Returns the build date of the package file. */ inline CppUtilities::DateTime Package::buildDate() const { return m_buildDate; } /*! * \brief Returns the packager of the package file. */ inline const QString &Package::packager() const { return m_packager; } /*! * \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 std::uint32_t Package::packageSize() const { return m_packageSize; } /*! * \brief Returns dependencies required to make the package. */ inline const QList &Package::makeDependencies() const { return m_makeDependencies; } /*! * \brief Returns dependencies required to run tests when making the package. */ inline const QList &Package::checkDependencies() const { return m_checkDependencies; } /*! * \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 CppUtilities::DateTime Package::installDate() const { return m_installDate; } /*! * \brief Returns the installed size. */ inline std::uint32_t 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 PackageValidation Package::validationMethods() const { return m_validationMethods; } /*! * \brief Returns whether the package has been installed explicitely or as a dependency. */ inline InstallStatus 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 std::int32_t Package::id() const { return m_id; } /*! * \brief Returns the category ID. */ inline std::int32_t Package::categoryId() const { return m_categoryId; } /*! * \brief Returns the votes of the package. */ inline std::int32_t Package::votes() const { return m_votes; } /*! * \brief Returns the flag date. */ inline CppUtilities::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 CppUtilities::DateTime Package::firstSubmitted() const { return m_firstSubmitted; } /*! * \brief Returns the last time when the package was modified. */ inline CppUtilities::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 available source files. * * Contains usually the PKGBUILD/.SRCINFO file and patches. */ inline const std::map &Package::sourceFiles() const { return m_sourceFiles; } /*! * \brief Returns all dependencies. */ inline QList *> Package::allDependencies() const { return {&dependencies(), &makeDependencies(), &checkDependencies()}; } /*! * \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)); } inline uint qHash(const Package &package, uint seed) { return static_cast(((reinterpret_cast(package.repository()) >> (8 * sizeof(uint) - 1)) ^ reinterpret_cast(package.repository())) & (~0U)) ^ seed ^ qHash(package.name(), seed); } } #endif // ALPM_PACKAGE_H