diff options
Diffstat (limited to 'api/logic/meta/JsonFormat.cpp')
-rw-r--r-- | api/logic/meta/JsonFormat.cpp | 150 |
1 files changed, 110 insertions, 40 deletions
diff --git a/api/logic/meta/JsonFormat.cpp b/api/logic/meta/JsonFormat.cpp index fb78941f..2183e579 100644 --- a/api/logic/meta/JsonFormat.cpp +++ b/api/logic/meta/JsonFormat.cpp @@ -1,4 +1,4 @@ -/* Copyright 2015-2017 MultiMC Contributors +/* Copyright 2015-2018 MultiMC Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ #include "JsonFormat.h" // FIXME: remove this from here... somehow -#include "minecraft/onesix/OneSixVersionFormat.h" +#include "minecraft/OneSixVersionFormat.h" #include "Json.h" #include "Index.h" @@ -28,8 +28,13 @@ using namespace Json; namespace Meta { +MetadataVersion currentFormatVersion() +{ + return MetadataVersion::InitialRelease; +} + // Index -static BaseEntity::Ptr parseIndexInternal(const QJsonObject &obj) +static std::shared_ptr<Index> parseIndexInternal(const QJsonObject &obj) { const QVector<QJsonObject> objects = requireIsArrayOf<QJsonObject>(obj, "packages"); QVector<VersionListPtr> lists; @@ -49,24 +54,16 @@ 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->setParentUid(ensureString(obj, "parentUid", QString())); version->setRecommended(ensureBoolean(obj, QString("recommended"), false)); - if(obj.contains("requires")) - { - QHash<QString, QString> requires; - auto reqobj = requireObject(obj, "requires"); - auto iter = reqobj.begin(); - while(iter != reqobj.end()) - { - requires[iter.key()] = requireString(iter.value()); - iter++; - } - version->setRequires(requires); - } + 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 BaseEntity::Ptr parseVersionInternal(const QJsonObject &obj) +static std::shared_ptr<Version> parseVersionInternal(const QJsonObject &obj) { VersionPtr version = parseCommonVersion(requireString(obj, "uid"), obj); @@ -77,7 +74,7 @@ static BaseEntity::Ptr parseVersionInternal(const QJsonObject &obj) } // Version list / package -static BaseEntity::Ptr parseVersionListInternal(const QJsonObject &obj) +static std::shared_ptr<VersionList> parseVersionListInternal(const QJsonObject &obj) { const QString uid = requireString(obj, "uid"); @@ -93,56 +90,129 @@ static BaseEntity::Ptr parseVersionListInternal(const QJsonObject &obj) VersionListPtr list = std::make_shared<VersionList>(uid); list->setName(ensureString(obj, "name", QString())); - list->setParentUid(ensureString(obj, "parentUid", QString())); list->setVersions(versions); return list; } -static int formatVersion(const QJsonObject &obj) +MetadataVersion parseFormatVersion(const QJsonObject &obj, bool required) { - if (!obj.contains("formatVersion")) { - throw ParseException(QObject::tr("Missing required field: 'formatVersion'")); + if (!obj.contains("formatVersion")) + { + if(required) + { + return MetadataVersion::Invalid; + } + return MetadataVersion::InitialRelease; } - if (!obj.value("formatVersion").isDouble()) { - throw ParseException(QObject::tr("Required field has invalid type: 'formatVersion'")); + 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; } - return obj.value("formatVersion").toInt(); + obj.insert("formatVersion", int(version)); } void parseIndex(const QJsonObject &obj, Index *ptr) { - const int version = formatVersion(obj); - switch (version) { - case 0: + const MetadataVersion version = parseFormatVersion(obj); + switch (version) + { + case MetadataVersion::InitialRelease: ptr->merge(parseIndexInternal(obj)); break; - default: - throw ParseException(QObject::tr("Unknown formatVersion: %1").arg(version)); + case MetadataVersion::Invalid: + throw ParseException(QObject::tr("Unknown format version!")); } } void parseVersionList(const QJsonObject &obj, VersionList *ptr) { - const int version = formatVersion(obj); - switch (version) { - case 0: + const MetadataVersion version = parseFormatVersion(obj); + switch (version) + { + case MetadataVersion::InitialRelease: ptr->merge(parseVersionListInternal(obj)); break; - default: - throw ParseException(QObject::tr("Unknown formatVersion: %1").arg(version)); + case MetadataVersion::Invalid: + throw ParseException(QObject::tr("Unknown format version!")); } } void parseVersion(const QJsonObject &obj, Version *ptr) { - const int version = formatVersion(obj); - switch (version) { - case 0: + const MetadataVersion version = parseFormatVersion(obj); + switch (version) + { + case MetadataVersion::InitialRelease: ptr->merge(parseVersionInternal(obj)); break; - default: - throw ParseException(QObject::tr("Unknown formatVersion: %1").arg(version)); + case MetadataVersion::Invalid: + throw ParseException(QObject::tr("Unknown format version!")); } } + +/* +[ +{"uid":"foo", "equals":"version"} +] +*/ +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++; + } + } } +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); +} + +} + |