From 992c0007516a098f0973bc8a7e78f6298aab07e2 Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 15 Feb 2016 01:27:50 +0100 Subject: [PATCH] use map to assign description fields --- alpm/manager.cpp | 9 -- alpm/manager.h | 2 - alpm/package.cpp | 288 ++++++++++++++++++++++++++++---------------- alpm/package.h | 31 ++++- alpm/repository.cpp | 31 ++--- alpm/utilities.cpp | 6 +- 6 files changed, 230 insertions(+), 137 deletions(-) diff --git a/alpm/manager.cpp b/alpm/manager.cpp index bd9b9e4..bf4c2b0 100644 --- a/alpm/manager.cpp +++ b/alpm/manager.cpp @@ -609,15 +609,6 @@ void Manager::maintainCache() writeCache(); } -/*! - * \brief Unregisters all registred sync databases. - * \remarks TODO - */ -void Manager::unregisterSyncDataBases() -{ - -} - /*! * \brief Returns a list of all sync databases. * \remarks Sync databases must be registered with parsePacmanConfig() before. diff --git a/alpm/manager.h b/alpm/manager.h index 4ca512b..40bc376 100644 --- a/alpm/manager.h +++ b/alpm/manager.h @@ -63,8 +63,6 @@ public: void wipeCache(); void maintainCache(); - void unregisterSyncDataBases(); - // package lookup AlpmPackage *packageFromDatabase(const QString &dbName, const QString &pkgName); const AlpmPackage *packageFromDatabase(const QString &dbName, const QString &pkgName) const; diff --git a/alpm/package.cpp b/alpm/package.cpp index 889c3ad..7969a23 100644 --- a/alpm/package.cpp +++ b/alpm/package.cpp @@ -13,8 +13,10 @@ #include #include +#include using namespace std; +using namespace std::placeholders; using namespace ChronoUtilities; namespace RepoIndex { @@ -585,34 +587,187 @@ void Package::putInfo(const QList > &baseInfo, const QLi * \cond */ -inline void put(QString &lhs, const QStringList &rhs) +#define PUT_DEPS(lhs, rhs) \ + lhs.reserve(rhs.size()); \ + for(const QString &dep : rhs) { \ + lhs << Dependency(dep); \ + } \ + +const map Package::m_descMap { + {QStringLiteral("NAME"), &Package::setName}, + {QStringLiteral("VERSION"), &Package::setVersion}, + {QStringLiteral("DESC"), &Package::setDescription}, + {QStringLiteral("URL"), &Package::setUrl}, + {QStringLiteral("ARCH"), &Package::setArch}, + {QStringLiteral("LICENSE"), &Package::setLicenses}, + {QStringLiteral("DEPENDS"), &Package::setDepends}, + {QStringLiteral("MAKEDEPENDS"), &Package::setMakeDepends}, + {QStringLiteral("CHECKDEPENDS"), &Package::setCheckDepends}, + {QStringLiteral("OPTDEPENDS"), &Package::setOptDepends}, + {QStringLiteral("CONFLICTS"), &Package::setConflicts}, + {QStringLiteral("PROVIDES"), &Package::setProvides}, + {QStringLiteral("REPLACES"), &Package::setReplaces}, + {QStringLiteral("BUILDDATE"), &Package::setBuildDate}, + {QStringLiteral("INSTALLDATE"), &Package::setInstallDate}, + {QStringLiteral("ISIZE"), &Package::setInstalledSize}, + {QStringLiteral("SIZE"), &Package::setInstalledSize}, + {QStringLiteral("CSIZE"), &Package::setPackageSize}, + {QStringLiteral("PACKAGER"), &Package::setPackager}, + {QStringLiteral("MD5SUM"), &Package::setMd5}, + {QStringLiteral("SHA256SUM"), &Package::setSha256}, + {QStringLiteral("FILES"), &Package::setFiles}, + {QStringLiteral("REASON"), &Package::setInstallReason}, + {QStringLiteral("VALIDATION"), &Package::setValidation}, + {QStringLiteral("GROUPS"), &Package::setGroups}, + {QStringLiteral("FILENAME"), &Package::setFileName} +}; + +void Package::setName(const QStringList &values) { - if(!rhs.isEmpty()) { - lhs = rhs.back(); + if(!values.isEmpty() && !values.back().isEmpty()) { + m_name = values.back(); } } -inline void put(QList &lhs, const QStringList &rhs) +void Package::setVersion(const QStringList &values) { - lhs.reserve(rhs.size()); - for(const QString &dep : rhs) { - lhs << Dependency(dep); + if(!values.isEmpty() && !values.back().isEmpty()) { + m_version = values.back(); } } - -inline void put(QJsonArray &lhs, const QStringList &rhs) +void Package::setDescription(const QStringList &values) { - for(const QString &value : rhs) { - lhs << value; + if(!values.isEmpty()) { + m_description = values.back(); } } - -inline void putFiles(QJsonArray &lhs, const QStringList &rhs) +void Package::setUrl(const QStringList &values) { - for(const QString &value : rhs) { + if(!values.isEmpty()) { + m_upstreamUrl = values.back(); + } +} +void Package::setArch(const QStringList &values) +{ + if(!values.isEmpty()) { + m_buildArchitecture = values.back(); + } +} +void Package::setLicenses(const QStringList &values) +{ + m_licenses = values; +} +void Package::setDepends(const QStringList &values) +{ + PUT_DEPS(m_dependencies, values); +} +void Package::setMakeDepends(const QStringList &values) +{ + PUT_DEPS(m_makeDependencies, values); +} +void Package::setCheckDepends(const QStringList &values) +{ + PUT_DEPS(m_checkDependencies, values); +} +void Package::setOptDepends(const QStringList &values) +{ + PUT_DEPS(m_optionalDependencies, values); +} +void Package::setConflicts(const QStringList &values) +{ + PUT_DEPS(m_conflicts, values); +} +void Package::setProvides(const QStringList &values) +{ + PUT_DEPS(m_provides, values); +} +void Package::setReplaces(const QStringList &values) +{ + PUT_DEPS(m_replaces, values); +} +void Package::setBuildDate(const QStringList &values) +{ + if(!values.isEmpty()) { + m_buildDate = DateTime::fromTimeStampGmt(values.back().toUInt()); + } +} +void Package::setInstallDate(const QStringList &values) +{ + if(!values.isEmpty()) { + m_installDate = DateTime::fromTimeStampGmt(values.back().toUInt()); + } +} +void Package::setInstalledSize(const QStringList &values) +{ + if(!values.empty()) { + m_installedSize = values.back().toUInt(); + m_hasInstallRelatedMetaData = true; + } +} +void Package::setPackageSize(const QStringList &values) +{ + if(!values.empty()) { + m_packageSize = values.back().toUInt(); + } +} +void Package::setPackager(const QStringList &values) +{ + if(!values.isEmpty()) { + m_packager = values.back(); + } +} +void Package::setMd5(const QStringList &values) +{ + if(!values.isEmpty()) { + m_md5 = values.back(); + } +} +void Package::setSha256(const QStringList &values) +{ + if(!values.isEmpty()) { + m_sha256 = values.back(); + } +} +void Package::setFiles(const QStringList &values) +{ + m_files = QJsonArray(); + for(const QString &value : values) { QJsonObject fileObj; fileObj.insert(QStringLiteral("name"), value); - lhs << fileObj; + m_files << fileObj; + } +} +void Package::setValidation(const QStringList &values) +{ + if(!values.isEmpty()) { + for(const QString &value : values) { + if(value == QLatin1String("md5")) { + m_validationMethods = m_validationMethods | PackageValidation::Md5Sum; + } else if(value == QLatin1String("sha256")) { + m_validationMethods = m_validationMethods | PackageValidation::Sha256Sum; + } else if(value == QLatin1String("pgp")) { + m_validationMethods = m_validationMethods | PackageValidation::Signature; + } else { + // TODO: error handling (imporant?) + } + } + } + m_hasInstallRelatedMetaData = true; +} +void Package::setGroups(const QStringList &values) +{ + m_groups = values; +} +void Package::setFileName(const QStringList &values) +{ + if(!values.isEmpty()) { + m_fileName = values.back(); + } +} +void Package::setInstallReason(const QStringList &values) +{ + if(!values.isEmpty()) { + m_installReason = values.back().toUInt() == 1 ? InstallStatus::AsDependency : InstallStatus::Explicit; } } @@ -628,8 +783,13 @@ inline void putFiles(QJsonArray &lhs, const QStringList &rhs) * - Actual parsing of desc/depends/files is done in Repository::addPackagesFromSrcInfo() because one info file * applies to multiple packages in case of split packages. */ -void Package::putDescription(QString name, const QList > &description, PackageOrigin origin) +void Package::putDescription(const QString &name, const QList > &description, PackageOrigin origin) { + // set name + if(!name.isEmpty()) { + m_name = name; + } + // clear current meta data m_origin = origin; m_hasInstallRelatedMetaData = origin == PackageOrigin::LocalDb; @@ -650,103 +810,17 @@ void Package::putDescription(QString name, const QList*m_descMap.at(pair.first))(pair.second); + } catch(const out_of_range &) { } } - // ensure crucial information is still present (use old values rather than no values) - if(!name.isEmpty()) { - m_name = name; - } - if(!version.version.isEmpty()) { - m_version = version.toString(); - } - // description provides source related meta data, too (except pkgbase, TODO: special flag required?) m_hasBuildRelatedMetaData = m_hasSourceRelatedMetaData = true; } diff --git a/alpm/package.h b/alpm/package.h index 6a339f6..5fa61d8 100644 --- a/alpm/package.h +++ b/alpm/package.h @@ -8,6 +8,7 @@ #include #include +#include QT_FORWARD_DECLARE_CLASS(QJsonObject) QT_FORWARD_DECLARE_CLASS(QJsonValue) @@ -288,7 +289,7 @@ public: // parsing .SRCINFO/.PKGINFO/desc/depends/files info void putInfo(const QList > &baseInfo, const QList > &pkgInfo, bool includesSourceRelatedMetaData = false, bool includesBuildRelatedMetaData = false); - void putDescription(QString name, const QList > &description, PackageOrigin origin); + void putDescription(const QString &name, const QList > &description, PackageOrigin origin); void putSourceFile(const QString &path, const QByteArray &data); protected: @@ -353,6 +354,34 @@ protected: ChronoUtilities::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 setFiles(const QStringList &values); + void setValidation(const QStringList &values); + void setGroups(const QStringList &values); + void setFileName(const QStringList &values); + void setInstallReason(const QStringList &values); }; /*! diff --git a/alpm/repository.cpp b/alpm/repository.cpp index d39f506..9165e49 100644 --- a/alpm/repository.cpp +++ b/alpm/repository.cpp @@ -363,17 +363,17 @@ QJsonObject Repository::packagesObjectSkeleton() const * \cond */ -inline void put(QJsonObject &obj, const QString &key, const QJsonValue &value) +inline void putString(QJsonObject &obj, const QString &key, const QJsonValue &value) { if(!value.isNull()) { obj.insert(key, value); } } -inline void put(QJsonObject &obj, const QString &key, const QStringList &values) +inline void putString(QJsonObject &obj, const QString &key, const QStringList &values) { if(!values.isEmpty()) { - put(obj, key, QJsonArray::fromStringList(values)); + putString(obj, key, QJsonArray::fromStringList(values)); } } @@ -388,22 +388,22 @@ QJsonObject Repository::basicInfo(bool includeName) const { QJsonObject info; if(includeName) { - put(info, QStringLiteral("name"), name()); + putString(info, QStringLiteral("name"), name()); } if(index() != invalidIndex) { info.insert(QStringLiteral("index"), static_cast(index())); } - put(info, QStringLiteral("desc"), description()); - put(info, QStringLiteral("servers"), serverUrls()); - put(info, QStringLiteral("usage"), Utilities::usageStrings(usage())); - put(info, QStringLiteral("sigLevel"), Utilities::sigLevelStrings(sigLevel())); - put(info, QStringLiteral("upgradeSources"), upgradeSourcesJsonArray()); - put(info, QStringLiteral("packages"), packagesObjectSkeleton()); + putString(info, QStringLiteral("desc"), description()); + putString(info, QStringLiteral("servers"), serverUrls()); + putString(info, QStringLiteral("usage"), Utilities::usageStrings(usage())); + putString(info, QStringLiteral("sigLevel"), Utilities::sigLevelStrings(sigLevel())); + putString(info, QStringLiteral("upgradeSources"), upgradeSourcesJsonArray()); + putString(info, QStringLiteral("packages"), packagesObjectSkeleton()); if(requestsRequired(PackageDetail::Basics) == PackageDetailAvailability::Immediately) { info.insert(QStringLiteral("packageCount"), static_cast(m_packages.size())); } - put(info, QStringLiteral("srcOnly"), isSourceOnly()); - put(info, QStringLiteral("pkgOnly"), isPackageOnly()); + putString(info, QStringLiteral("srcOnly"), isSourceOnly()); + putString(info, QStringLiteral("pkgOnly"), isPackageOnly()); return info; } @@ -413,16 +413,16 @@ QJsonObject Repository::basicInfo(bool includeName) const QJsonObject Repository::groupInfo() const { QJsonObject info; - put(info, QStringLiteral("repo"), name()); + putString(info, QStringLiteral("repo"), name()); QJsonArray groupsArray; for(const auto &groupEntry : groups()) { QJsonObject info; - put(info, QStringLiteral("name"), groupEntry.first); + putString(info, QStringLiteral("name"), groupEntry.first); QJsonArray pkgNames; for(const auto *pkg : groupEntry.second) { pkgNames << pkg->name(); } - put(info, QStringLiteral("pkgs"), pkgNames); + putString(info, QStringLiteral("pkgs"), pkgNames); groupsArray << info; } info.insert(QStringLiteral("groups"), groupsArray); @@ -664,6 +664,7 @@ void Repository::parsePkgInfo(const QByteArray &pkgInfo, QString &name, QList &descriptions, QString &name, QList > &fields) { // define variables to store parsing results + fields.reserve(32); QByteArray currentFieldName; currentFieldName.reserve(16); QByteArray currentFieldValue; diff --git a/alpm/utilities.cpp b/alpm/utilities.cpp index 0006fc4..2d9c1e4 100644 --- a/alpm/utilities.cpp +++ b/alpm/utilities.cpp @@ -115,9 +115,9 @@ QJsonArray validationMethodsStrings(PackageValidation validationMethods) if(validationMethods & PackageValidation::Signature) { jsonArray << QStringLiteral("signature"); } - if(jsonArray.empty()) { - jsonArray << QStringLiteral("unknown"); - } + //if(jsonArray.empty()) { + // jsonArray << QStringLiteral("unknown"); + //} return jsonArray; }