diff options
| author | Petr Mrázek <peterix@gmail.com> | 2018-07-15 14:51:05 +0200 |
|---|---|---|
| committer | Petr Mrázek <peterix@gmail.com> | 2018-07-15 14:51:05 +0200 |
| commit | bbb3b3e6f6e3c0f95873f22e6d0a4aaf350f49d9 (patch) | |
| tree | e6497e304b7b9368367565fbc7c06efab1124b1c /api/logic/meta | |
| parent | 03280cc62e75f8073f8d3d9e9e3952acf21fa77d (diff) | |
| download | PrismLauncher-bbb3b3e6f6e3c0f95873f22e6d0a4aaf350f49d9.tar.gz PrismLauncher-bbb3b3e6f6e3c0f95873f22e6d0a4aaf350f49d9.tar.bz2 PrismLauncher-bbb3b3e6f6e3c0f95873f22e6d0a4aaf350f49d9.zip | |
NOISSUE tabs -> spaces
Diffstat (limited to 'api/logic/meta')
| -rw-r--r-- | api/logic/meta/BaseEntity.cpp | 200 | ||||
| -rw-r--r-- | api/logic/meta/BaseEntity.h | 52 | ||||
| -rw-r--r-- | api/logic/meta/Index.cpp | 162 | ||||
| -rw-r--r-- | api/logic/meta/Index.h | 48 | ||||
| -rw-r--r-- | api/logic/meta/Index_test.cpp | 52 | ||||
| -rw-r--r-- | api/logic/meta/JsonFormat.cpp | 258 | ||||
| -rw-r--r-- | api/logic/meta/JsonFormat.h | 42 | ||||
| -rw-r--r-- | api/logic/meta/Version.cpp | 104 | ||||
| -rw-r--r-- | api/logic/meta/Version.h | 136 | ||||
| -rw-r--r-- | api/logic/meta/VersionList.cpp | 276 | ||||
| -rw-r--r-- | api/logic/meta/VersionList.h | 116 |
11 files changed, 723 insertions, 723 deletions
diff --git a/api/logic/meta/BaseEntity.cpp b/api/logic/meta/BaseEntity.cpp index 342f676c..9ea712fa 100644 --- a/api/logic/meta/BaseEntity.cpp +++ b/api/logic/meta/BaseEntity.cpp @@ -27,45 +27,45 @@ class ParsingValidator : public Net::Validator { public: /* con/des */ - ParsingValidator(Meta::BaseEntity *entity) : m_entity(entity) - { - }; - virtual ~ParsingValidator() - { - }; + ParsingValidator(Meta::BaseEntity *entity) : m_entity(entity) + { + }; + virtual ~ParsingValidator() + { + }; public: /* methods */ - bool init(QNetworkRequest &) override - { - return true; - } - bool write(QByteArray & data) override - { - this->data.append(data); - return true; - } - bool abort() override - { - return true; - } - bool validate(QNetworkReply &) override - { - auto fname = m_entity->localFilename(); - try - { - m_entity->parse(Json::requireObject(Json::requireDocument(data, fname), fname)); - return true; - } - catch (const Exception &e) - { - qWarning() << "Unable to parse response:" << e.cause(); - return false; - } - } + bool init(QNetworkRequest &) override + { + return true; + } + bool write(QByteArray & data) override + { + this->data.append(data); + return true; + } + bool abort() override + { + return true; + } + bool validate(QNetworkReply &) override + { + auto fname = m_entity->localFilename(); + try + { + m_entity->parse(Json::requireObject(Json::requireDocument(data, fname), fname)); + return true; + } + catch (const Exception &e) + { + qWarning() << "Unable to parse response:" << e.cause(); + return false; + } + } private: /* data */ - QByteArray data; - Meta::BaseEntity *m_entity; + QByteArray data; + Meta::BaseEntity *m_entity; }; Meta::BaseEntity::~BaseEntity() @@ -74,89 +74,89 @@ Meta::BaseEntity::~BaseEntity() QUrl Meta::BaseEntity::url() const { - return QUrl("https://v1.meta.multimc.org").resolved(localFilename()); + return QUrl("https://v1.meta.multimc.org").resolved(localFilename()); } bool Meta::BaseEntity::loadLocalFile() { - const QString fname = QDir("meta").absoluteFilePath(localFilename()); - if (!QFile::exists(fname)) - { - return false; - } - // TODO: check if the file has the expected checksum - try - { - parse(Json::requireObject(Json::requireDocument(fname, fname), fname)); - return true; - } - catch (const Exception &e) - { - qDebug() << QString("Unable to parse file %1: %2").arg(fname, e.cause()); - // just make sure it's gone and we never consider it again. - QFile::remove(fname); - return false; - } + const QString fname = QDir("meta").absoluteFilePath(localFilename()); + if (!QFile::exists(fname)) + { + return false; + } + // TODO: check if the file has the expected checksum + try + { + parse(Json::requireObject(Json::requireDocument(fname, fname), fname)); + return true; + } + catch (const Exception &e) + { + qDebug() << QString("Unable to parse file %1: %2").arg(fname, e.cause()); + // just make sure it's gone and we never consider it again. + QFile::remove(fname); + return false; + } } void Meta::BaseEntity::load(Net::Mode loadType) { - // load local file if nothing is loaded yet - if(!isLoaded()) - { - if(loadLocalFile()) - { - m_loadStatus = LoadStatus::Local; - } - } - // if we need remote update, run the update task - if(loadType == Net::Mode::Offline || !shouldStartRemoteUpdate()) - { - return; - } - NetJob *job = new NetJob(QObject::tr("Download of meta file %1").arg(localFilename())); - auto url = this->url(); - auto entry = ENV.metacache()->resolveEntry("meta", localFilename()); - entry->setStale(true); - auto dl = Net::Download::makeCached(url, entry); - /* - * The validator parses the file and loads it into the object. - * If that fails, the file is not written to storage. - */ - dl->addValidator(new ParsingValidator(this)); - job->addNetAction(dl); - m_updateStatus = UpdateStatus::InProgress; - m_updateTask.reset(job); - QObject::connect(job, &NetJob::succeeded, [&]() - { - m_loadStatus = LoadStatus::Remote; - m_updateStatus = UpdateStatus::Succeeded; - m_updateTask.reset(); - }); - QObject::connect(job, &NetJob::failed, [&]() - { - m_updateStatus = UpdateStatus::Failed; - m_updateTask.reset(); - }); - m_updateTask->start(); + // load local file if nothing is loaded yet + if(!isLoaded()) + { + if(loadLocalFile()) + { + m_loadStatus = LoadStatus::Local; + } + } + // if we need remote update, run the update task + if(loadType == Net::Mode::Offline || !shouldStartRemoteUpdate()) + { + return; + } + NetJob *job = new NetJob(QObject::tr("Download of meta file %1").arg(localFilename())); + auto url = this->url(); + auto entry = ENV.metacache()->resolveEntry("meta", localFilename()); + entry->setStale(true); + auto dl = Net::Download::makeCached(url, entry); + /* + * The validator parses the file and loads it into the object. + * If that fails, the file is not written to storage. + */ + dl->addValidator(new ParsingValidator(this)); + job->addNetAction(dl); + m_updateStatus = UpdateStatus::InProgress; + m_updateTask.reset(job); + QObject::connect(job, &NetJob::succeeded, [&]() + { + m_loadStatus = LoadStatus::Remote; + m_updateStatus = UpdateStatus::Succeeded; + m_updateTask.reset(); + }); + QObject::connect(job, &NetJob::failed, [&]() + { + m_updateStatus = UpdateStatus::Failed; + m_updateTask.reset(); + }); + m_updateTask->start(); } bool Meta::BaseEntity::isLoaded() const { - return m_loadStatus > LoadStatus::NotLoaded; + return m_loadStatus > LoadStatus::NotLoaded; } bool Meta::BaseEntity::shouldStartRemoteUpdate() const { - // TODO: version-locks and offline mode? - return m_updateStatus != UpdateStatus::InProgress; + // TODO: version-locks and offline mode? + return m_updateStatus != UpdateStatus::InProgress; } shared_qobject_ptr<Task> Meta::BaseEntity::getCurrentTask() { - if(m_updateStatus == UpdateStatus::InProgress) - { - return m_updateTask; - } - return nullptr; + if(m_updateStatus == UpdateStatus::InProgress) + { + return m_updateTask; + } + return nullptr; } diff --git a/api/logic/meta/BaseEntity.h b/api/logic/meta/BaseEntity.h index 418c979f..19dd2c18 100644 --- a/api/logic/meta/BaseEntity.h +++ b/api/logic/meta/BaseEntity.h @@ -28,41 +28,41 @@ namespace Meta class MULTIMC_LOGIC_EXPORT BaseEntity { public: /* types */ - using Ptr = std::shared_ptr<BaseEntity>; - enum class LoadStatus - { - NotLoaded, - Local, - Remote - }; - enum class UpdateStatus - { - NotDone, - InProgress, - Failed, - Succeeded - }; + using Ptr = std::shared_ptr<BaseEntity>; + enum class LoadStatus + { + NotLoaded, + Local, + Remote + }; + enum class UpdateStatus + { + NotDone, + InProgress, + Failed, + Succeeded + }; public: - virtual ~BaseEntity(); + virtual ~BaseEntity(); - virtual void parse(const QJsonObject &obj) = 0; + virtual void parse(const QJsonObject &obj) = 0; - virtual QString localFilename() const = 0; - virtual QUrl url() const; + virtual QString localFilename() const = 0; + virtual QUrl url() const; - bool isLoaded() const; - bool shouldStartRemoteUpdate() const; + bool isLoaded() const; + bool shouldStartRemoteUpdate() const; - void load(Net::Mode loadType); - shared_qobject_ptr<Task> getCurrentTask(); + void load(Net::Mode loadType); + shared_qobject_ptr<Task> getCurrentTask(); protected: /* methods */ - bool loadLocalFile(); + bool loadLocalFile(); private: - LoadStatus m_loadStatus = LoadStatus::NotLoaded; - UpdateStatus m_updateStatus = UpdateStatus::NotDone; - shared_qobject_ptr<Task> m_updateTask; + LoadStatus m_loadStatus = LoadStatus::NotLoaded; + UpdateStatus m_updateStatus = UpdateStatus::NotDone; + shared_qobject_ptr<Task> m_updateTask; }; } diff --git a/api/logic/meta/Index.cpp b/api/logic/meta/Index.cpp index 6e1e34cd..4dbc0a86 100644 --- a/api/logic/meta/Index.cpp +++ b/api/logic/meta/Index.cpp @@ -21,128 +21,128 @@ namespace Meta { Index::Index(QObject *parent) - : QAbstractListModel(parent) + : QAbstractListModel(parent) { } Index::Index(const QVector<VersionListPtr> &lists, QObject *parent) - : QAbstractListModel(parent), m_lists(lists) + : QAbstractListModel(parent), m_lists(lists) { - for (int i = 0; i < m_lists.size(); ++i) - { - m_uids.insert(m_lists.at(i)->uid(), m_lists.at(i)); - connectVersionList(i, m_lists.at(i)); - } + for (int i = 0; i < m_lists.size(); ++i) + { + m_uids.insert(m_lists.at(i)->uid(), m_lists.at(i)); + connectVersionList(i, m_lists.at(i)); + } } QVariant Index::data(const QModelIndex &index, int role) const { - if (index.parent().isValid() || index.row() < 0 || index.row() >= m_lists.size()) - { - return QVariant(); - } + if (index.parent().isValid() || index.row() < 0 || index.row() >= m_lists.size()) + { + return QVariant(); + } - VersionListPtr list = m_lists.at(index.row()); - switch (role) - { - case Qt::DisplayRole: - switch (index.column()) - { - case 0: return list->humanReadable(); - default: break; - } - case UidRole: return list->uid(); - case NameRole: return list->name(); - case ListPtrRole: return QVariant::fromValue(list); - } - return QVariant(); + VersionListPtr list = m_lists.at(index.row()); + switch (role) + { + case Qt::DisplayRole: + switch (index.column()) + { + case 0: return list->humanReadable(); + default: break; + } + case UidRole: return list->uid(); + case NameRole: return list->name(); + case ListPtrRole: return QVariant::fromValue(list); + } + return QVariant(); } int Index::rowCount(const QModelIndex &parent) const { - return m_lists.size(); + return m_lists.size(); } int Index::columnCount(const QModelIndex &parent) const { - return 1; + return 1; } QVariant Index::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole && section == 0) - { - return tr("Name"); - } - else - { - return QVariant(); - } + if (orientation == Qt::Horizontal && role == Qt::DisplayRole && section == 0) + { + return tr("Name"); + } + else + { + return QVariant(); + } } bool Index::hasUid(const QString &uid) const { - return m_uids.contains(uid); + return m_uids.contains(uid); } VersionListPtr Index::get(const QString &uid) { - VersionListPtr out = m_uids.value(uid, nullptr); - if(!out) - { - out = std::make_shared<VersionList>(uid); - m_uids[uid] = out; - } - return out; + VersionListPtr out = m_uids.value(uid, nullptr); + if(!out) + { + out = std::make_shared<VersionList>(uid); + m_uids[uid] = out; + } + return out; } VersionPtr Index::get(const QString &uid, const QString &version) { - auto list = get(uid); - return list->getVersion(version); + auto list = get(uid); + return list->getVersion(version); } void Index::parse(const QJsonObject& obj) { - parseIndex(obj, this); + parseIndex(obj, this); } void Index::merge(const std::shared_ptr<Index> &other) { - const QVector<VersionListPtr> lists = std::dynamic_pointer_cast<Index>(other)->m_lists; - // initial load, no need to merge - if (m_lists.isEmpty()) - { - beginResetModel(); - m_lists = lists; - for (int i = 0; i < lists.size(); ++i) - { - m_uids.insert(lists.at(i)->uid(), lists.at(i)); - connectVersionList(i, lists.at(i)); - } - endResetModel(); - } - else - { - for (const VersionListPtr &list : lists) - { - if (m_uids.contains(list->uid())) - { - m_uids[list->uid()]->mergeFromIndex(list); - } - else - { - beginInsertRows(QModelIndex(), m_lists.size(), m_lists.size()); - connectVersionList(m_lists.size(), list); - m_lists.append(list); - m_uids.insert(list->uid(), list); - endInsertRows(); - } - } - } + const QVector<VersionListPtr> lists = std::dynamic_pointer_cast<Index>(other)->m_lists; + // initial load, no need to merge + if (m_lists.isEmpty()) + { + beginResetModel(); + m_lists = lists; + for (int i = 0; i < lists.size(); ++i) + { + m_uids.insert(lists.at(i)->uid(), lists.at(i)); + connectVersionList(i, lists.at(i)); + } + endResetModel(); + } + else + { + for (const VersionListPtr &list : lists) + { + if (m_uids.contains(list->uid())) + { + m_uids[list->uid()]->mergeFromIndex(list); + } + else + { + beginInsertRows(QModelIndex(), m_lists.size(), m_lists.size()); + connectVersionList(m_lists.size(), list); + m_lists.append(list); + m_uids.insert(list->uid(), list); + endInsertRows(); + } + } + } } void Index::connectVersionList(const int row, const VersionListPtr &list) { - connect(list.get(), &VersionList::nameChanged, this, [this, row]() - { - emit dataChanged(index(row), index(row), QVector<int>() << Qt::DisplayRole); - }); + connect(list.get(), &VersionList::nameChanged, this, [this, row]() + { + emit dataChanged(index(row), index(row), QVector<int>() << Qt::DisplayRole); + }); } } diff --git a/api/logic/meta/Index.h b/api/logic/meta/Index.h index 0ec43f96..c81b4c54 100644 --- a/api/logic/meta/Index.h +++ b/api/logic/meta/Index.h @@ -31,41 +31,41 @@ using VersionPtr = std::shared_ptr<class Version>; class MULTIMC_LOGIC_EXPORT Index : public QAbstractListModel, public BaseEntity { - Q_OBJECT + Q_OBJECT public: - explicit Index(QObject *parent = nullptr); - explicit Index(const QVector<VersionListPtr> &lists, QObject *parent = nullptr); + explicit Index(QObject *parent = nullptr); + explicit Index(const QVector<VersionListPtr> &lists, QObject *parent = nullptr); - enum - { - UidRole = Qt::UserRole, - NameRole, - ListPtrRole - }; + enum + { + UidRole = Qt::UserRole, + NameRole, + ListPtrRole + }; - QVariant data(const QModelIndex &index, int role) const override; - int rowCount(const QModelIndex &parent) const override; - int columnCount(const QModelIndex &parent) const override; - QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + QVariant data(const QModelIndex &index, int role) const override; + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - QString localFilename() const override { return "index.json"; } + QString localFilename() const override { return "index.json"; } - // queries - VersionListPtr get(const QString &uid); - VersionPtr get(const QString &uid, const QString &version); - bool hasUid(const QString &uid) const; + // queries + VersionListPtr get(const QString &uid); + VersionPtr get(const QString &uid, const QString &version); + bool hasUid(const QString &uid) const; - QVector<VersionListPtr> lists() const { return m_lists; } + QVector<VersionListPtr> lists() const { return m_lists; } public: // for usage by parsers only - void merge(const std::shared_ptr<Index> &other); - void parse(const QJsonObject &obj) override; + void merge(const std::shared_ptr<Index> &other); + void parse(const QJsonObject &obj) override; private: - QVector<VersionListPtr> m_lists; - QHash<QString, VersionListPtr> m_uids; + QVector<VersionListPtr> m_lists; + QHash<QString, VersionListPtr> m_uids; - void connectVersionList(const int row, const VersionListPtr &list); + void connectVersionList(const int row, const VersionListPtr &list); }; } diff --git a/api/logic/meta/Index_test.cpp b/api/logic/meta/Index_test.cpp index 1c5face2..b0892070 100644 --- a/api/logic/meta/Index_test.cpp +++ b/api/logic/meta/Index_test.cpp @@ -7,36 +7,36 @@ class IndexTest : public QObject { - Q_OBJECT + Q_OBJECT private slots: - void test_isProvidedByEnv() - { - QVERIFY(ENV.metadataIndex()); - QCOMPARE(ENV.metadataIndex(), ENV.metadataIndex()); - } + void test_isProvidedByEnv() + { + QVERIFY(ENV.metadataIndex()); + QCOMPARE(ENV.metadataIndex(), ENV.metadataIndex()); + } - void test_hasUid_and_getList() - { - Meta::Index windex({std::make_shared<Meta::VersionList>("list1"), std::make_shared<Meta::VersionList>("list2"), std::make_shared<Meta::VersionList>("list3")}); - QVERIFY(windex.hasUid("list1")); - QVERIFY(!windex.hasUid("asdf")); - QVERIFY(windex.get("list2") != nullptr); - QCOMPARE(windex.get("list2")->uid(), QString("list2")); - QVERIFY(windex.get("adsf") != nullptr); - } + void test_hasUid_and_getList() + { + Meta::Index windex({std::make_shared<Meta::VersionList>("list1"), std::make_shared<Meta::VersionList>("list2"), std::make_shared<Meta::VersionList>("list3")}); + QVERIFY(windex.hasUid("list1")); + QVERIFY(!windex.hasUid("asdf")); + QVERIFY(windex.get("list2") != nullptr); + QCOMPARE(windex.get("list2")->uid(), QString("list2")); + QVERIFY(windex.get("adsf") != nullptr); + } - void test_merge() - { - Meta::Index windex({std::make_shared<Meta::VersionList>("list1"), std::make_shared<Meta::VersionList>("list2"), std::make_shared<Meta::VersionList>("list3")}); - QCOMPARE(windex.lists().size(), 3); - windex.merge(std::shared_ptr<Meta::Index>(new Meta::Index({std::make_shared<Meta::VersionList>("list1"), std::make_shared<Meta::VersionList>("list2"), std::make_shared<Meta::VersionList>("list3")}))); - QCOMPARE(windex.lists().size(), 3); - windex.merge(std::shared_ptr<Meta::Index>(new Meta::Index({std::make_shared<Meta::VersionList>("list4"), std::make_shared<Meta::VersionList>("list2"), std::make_shared<Meta::VersionList>("list5")}))); - QCOMPARE(windex.lists().size(), 5); - windex.merge(std::shared_ptr<Meta::Index>(new Meta::Index({std::make_shared<Meta::VersionList>("list6")}))); - QCOMPARE(windex.lists().size(), 6); - } + void test_merge() + { + Meta::Index windex({std::make_shared<Meta::VersionList>("list1"), std::make_shared<Meta::VersionList>("list2"), std::make_shared<Meta::VersionList>("list3")}); + QCOMPARE(windex.lists().size(), 3); + windex.merge(std::shared_ptr<Meta::Index>(new Meta::Index({std::make_shared<Meta::VersionList>("list1"), std::make_shared<Meta::VersionList>("list2"), std::make_shared<Meta::VersionList>("list3")}))); + QCOMPARE(windex.lists().size(), 3); + windex.merge(std::shared_ptr<Meta::Index>(new Meta::Index({std::make_shared<Meta::VersionList>("list4"), std::make_shared<Meta::VersionList>("list2"), std::make_shared<Meta::VersionList>("list5")}))); + QCOMPARE(windex.lists().size(), 5); + windex.merge(std::shared_ptr<Meta::Index>(new Meta::Index({std::make_shared<Meta::VersionList>("list6")}))); + QCOMPARE(windex.lists().size(), 6); + } }; QTEST_GUILESS_MAIN(IndexTest) diff --git a/api/logic/meta/JsonFormat.cpp b/api/logic/meta/JsonFormat.cpp index 2183e579..12da266f 100644 --- a/api/logic/meta/JsonFormat.cpp +++ b/api/logic/meta/JsonFormat.cpp @@ -30,141 +30,141 @@ namespace Meta MetadataVersion currentFormatVersion() { - return MetadataVersion::InitialRelease; + return MetadataVersion::InitialRelease; } // Index static std::shared_ptr<Index> parseIndexInternal(const QJsonObject &obj) { - const QVector<QJsonObject> objects = requireIsArrayOf<QJsonObject>(obj, "packages"); - QVector<VersionListPtr> lists; - lists.reserve(objects.size()); - std::transform(objects.begin(), objects.end(), std::back_inserter(lists), [](const QJsonObject &obj) - { - VersionListPtr list = std::make_shared<VersionList>(requireString(obj, "uid")); - list->setName(ensureString(obj, "name", QString())); - return list; - }); - return std::make_shared<Index>(lists); + const QVector<QJsonObject> objects = requireIsArrayOf<QJsonObject>(obj, "packages"); + QVector<VersionListPtr> lists; + lists.reserve(objects.size()); + std::transform(objects.begin(), objects.end(), std::back_inserter(lists), [](const QJsonObject &obj) + { + VersionListPtr list = std::make_shared<VersionList>(requireString(obj, "uid")); + list->setName(ensureString(obj, "name", QString())); + return list; + }); + return std::make_shared<Index>(lists); } // Version static VersionPtr parseCommonVersion(const QString &uid, const QJsonObject &obj) { - VersionPtr version = std::make_shared<Version>(uid, requireString(obj, "version")); - version->setTime(QDateTime::fromString(requireString(obj, "releaseTime"), Qt::ISODate).toMSecsSinceEpoch() / 1000); - version->setType(ensureString(obj, "type", QString())); - version->setRecommended(ensureBoolean(obj, QString("recommended"), false)); - version->setVolatile(ensureBoolean(obj, QString("volatile"), false)); - RequireSet requires, conflicts; - parseRequires(obj, &requires, "requires"); - parseRequires(obj, &conflicts, "conflicts"); - version->setRequires(requires, conflicts); - return version; + VersionPtr version = std::make_shared<Version>(uid, requireString(obj, "version")); + version->setTime(QDateTime::fromString(requireString(obj, "releaseTime"), Qt::ISODate).toMSecsSinceEpoch() / 1000); + version->setType(ensureString(obj, "type", QString())); + version->setRecommended(ensureBoolean(obj, QString("recommended"), false)); + version->setVolatile(ensureBoolean(obj, QString("volatile"), false)); + RequireSet requires, conflicts; + parseRequires(obj, &requires, "requires"); + parseRequires(obj, &conflicts, "conflicts"); + version->setRequires(requires, conflicts); + return version; } static std::shared_ptr<Version> parseVersionInternal(const QJsonObject &obj) { - VersionPtr version = parseCommonVersion(requireString(obj, "uid"), obj); + VersionPtr version = parseCommonVersion(requireString(obj, "uid"), obj); - version->setData(OneSixVersionFormat::versionFileFromJson(QJsonDocument(obj), - QString("%1/%2.json").arg(version->uid(), version->version()), - obj.contains("order"))); - return version; + version->setData(OneSixVersionFormat::versionFileFromJson(QJsonDocument(obj), + QString("%1/%2.json").arg(version->uid(), version->version()), + obj.contains("order"))); + return version; } // Version list / package static std::shared_ptr<VersionList> parseVersionListInternal(const QJsonObject &obj) { - const QString uid = requireString(obj, "uid"); - - const QVector<QJsonObject> versionsRaw = requireIsArrayOf<QJsonObject>(obj, "versions"); - QVector<VersionPtr> versions; - versions.reserve(versionsRaw.size()); - std::transform(versionsRaw.begin(), versionsRaw.end(), std::back_inserter(versions), [uid](const QJsonObject &vObj) - { - auto version = parseCommonVersion(uid, vObj); - version->setProvidesRecommendations(); - return version; - }); - - VersionListPtr list = std::make_shared<VersionList>(uid); - list->setName(ensureString(obj, "name", QString())); - list->setVersions(versions); - return list; + const QString uid = requireString(obj, "uid"); + + const QVector<QJsonObject> versionsRaw = requireIsArrayOf<QJsonObject>(obj, "versions"); + QVector<VersionPtr> versions; + versions.reserve(versionsRaw.size()); + std::transform(versionsRaw.begin(), versionsRaw.end(), std::back_inserter(versions), [uid](const QJsonObject &vObj) + { + auto version = parseCommonVersion(uid, vObj); + version->setProvidesRecommendations(); + return version; + }); + + VersionListPtr list = std::make_shared<VersionList>(uid); + list->setName(ensureString(obj, "name", QString())); + list->setVersions(versions); + return list; } MetadataVersion parseFormatVersion(const QJsonObject &obj, bool required) { - if (!obj.contains("formatVersion")) - { - if(required) - { - return MetadataVersion::Invalid; - } - return MetadataVersion::InitialRelease; - } - if (!obj.value("formatVersion").isDouble()) - { - return MetadataVersion::Invalid; - } - switch(obj.value("formatVersion").toInt()) - { - case 0: - case 1: - return MetadataVersion::InitialRelease; - default: - return MetadataVersion::Invalid; - } + if (!obj.contains("formatVersion")) + { + if(required) + { + return MetadataVersion::Invalid; + } + return MetadataVersion::InitialRelease; + } + if (!obj.value("formatVersion").isDouble()) + { + return MetadataVersion::Invalid; + } + switch(obj.value("formatVersion").toInt()) + { + case 0: + case 1: + return MetadataVersion::InitialRelease; + default: + return MetadataVersion::Invalid; + } } void serializeFormatVersion(QJsonObject& obj, Meta::MetadataVersion version) { - if(version == MetadataVersion::Invalid) - { - return; - } - obj.insert("formatVersion", int(version)); + if(version == MetadataVersion::Invalid) + { + return; + } + obj.insert("formatVersion", int(version)); } void parseIndex(const QJsonObject &obj, Index *ptr) { - const MetadataVersion version = parseFormatVersion(obj); - switch (version) - { - case MetadataVersion::InitialRelease: - ptr->merge(parseIndexInternal(obj)); - break; - case MetadataVersion::Invalid: - throw ParseException(QObject::tr("Unknown format version!")); - } + const MetadataVersion version = parseFormatVersion(obj); + switch (version) + { + case MetadataVersion::InitialRelease: + ptr->merge(parseIndexInternal(obj)); + break; + case MetadataVersion::Invalid: + throw ParseException(QObject::tr("Unknown format version!")); + } } void parseVersionList(const QJsonObject &obj, VersionList *ptr) { - const MetadataVersion version = parseFormatVersion(obj); - switch (version) - { - case MetadataVersion::InitialRelease: - ptr->merge(parseVersionListInternal(obj)); - break; - case MetadataVersion::Invalid: - throw ParseException(QObject::tr("Unknown format version!")); - } + const MetadataVersion version = parseFormatVersion(obj); + switch (version) + { + case MetadataVersion::InitialRelease: + ptr->merge(parseVersionListInternal(obj)); + break; + case MetadataVersion::Invalid: + throw ParseException(QObject::tr("Unknown format version!")); + } } void parseVersion(const QJsonObject &obj, Version *ptr) { - const MetadataVersion version = parseFormatVersion(obj); - switch (version) - { - case MetadataVersion::InitialRelease: - ptr->merge(parseVersionInternal(obj)); - break; - case MetadataVersion::Invalid: - throw ParseException(QObject::tr("Unknown format version!")); - } + const MetadataVersion version = parseFormatVersion(obj); + switch (version) + { + case MetadataVersion::InitialRelease: + ptr->merge(parseVersionInternal(obj)); + break; + case MetadataVersion::Invalid: + throw ParseException(QObject::tr("Unknown format version!")); + } } /* @@ -174,44 +174,44 @@ void parseVersion(const QJsonObject &obj, Version *ptr) */ void parseRequires(const QJsonObject& obj, RequireSet* ptr, const char * keyName) { - if(obj.contains(keyName)) - { - QSet<QString> requires; - auto reqArray = requireArray(obj, keyName); - auto iter = reqArray.begin(); - while(iter != reqArray.end()) - { - auto reqObject = requireObject(*iter); - auto uid = requireString(reqObject, "uid"); - auto equals = ensureString(reqObject, "equals", QString()); - auto suggests = ensureString(reqObject, "suggests", QString()); - ptr->insert({uid, equals, suggests}); - iter++; - } - } + if(obj.contains(keyName)) + { + QSet<QString> requires; + auto reqArray = requireArray(obj, keyName); + auto iter = reqArray.begin(); + while(iter != reqArray.end()) + { + auto reqObject = requireObject(*iter); + auto uid = requireString(reqObject, "uid"); + auto equals = ensureString(reqObject, "equals", QString()); + auto suggests = ensureString(reqObject, "suggests", QString()); + ptr->insert({uid, equals, suggests}); + iter++; + } + } } void serializeRequires(QJsonObject& obj, RequireSet* ptr, const char * keyName) { - if(!ptr || ptr->empty()) - { - return; - } - QJsonArray arrOut; - for(auto &iter: *ptr) - { - QJsonObject reqOut; - reqOut.insert("uid", iter.uid); - if(!iter.equalsVersion.isEmpty()) - { - reqOut.insert("equals", iter.equalsVersion); - } - if(!iter.suggests.isEmpty()) - { - reqOut.insert("suggests", iter.suggests); - } - arrOut.append(reqOut); - } - obj.insert(keyName, arrOut); + if(!ptr || ptr->empty()) + { + return; + } + QJsonArray arrOut; + for(auto &iter: *ptr) + { + QJsonObject reqOut; + reqOut.insert("uid", iter.uid); + if(!iter.equalsVersion.isEmpty()) + { + reqOut.insert("equals", iter.equalsVersion); + } + if(!iter.suggests.isEmpty()) + { + reqOut.insert("suggests", iter.suggests); + } + arrOut.append(reqOut); + } + obj.insert(keyName, arrOut); } } diff --git a/api/logic/meta/JsonFormat.h b/api/logic/meta/JsonFormat.h index cc2c8f83..62351ad6 100644 --- a/api/logic/meta/JsonFormat.h +++ b/ |
