diff options
Diffstat (limited to 'logic/minecraft/MojangVersionFormat.cpp')
-rw-r--r-- | logic/minecraft/MojangVersionFormat.cpp | 181 |
1 files changed, 93 insertions, 88 deletions
diff --git a/logic/minecraft/MojangVersionFormat.cpp b/logic/minecraft/MojangVersionFormat.cpp index a832e8c7..78447aa8 100644 --- a/logic/minecraft/MojangVersionFormat.cpp +++ b/logic/minecraft/MojangVersionFormat.cpp @@ -128,43 +128,47 @@ QJsonObject assetIndexToJson(MojangAssetIndexInfo::Ptr info) return out; } -VersionFilePtr MojangVersionFormat::versionFileFromJson(const QJsonDocument &doc, const QString &filename) +void MojangVersionFormat::readVersionProperties(const QJsonObject &in, VersionFile *out) { - VersionFilePtr out(new VersionFile()); - if (doc.isEmpty() || doc.isNull()) - { - throw JSONValidationError(filename + " is empty or null"); - } - if (!doc.isObject()) + Bits::readString(in, "id", out->id); + Bits::readString(in, "mainClass", out->mainClass); + Bits::readString(in, "minecraftArguments", out->minecraftArguments); + if(out->minecraftArguments.isEmpty()) { - throw JSONValidationError(filename + " is not an object"); + QString processArguments; + Bits::readString(in, "processArguments", processArguments); + QString toCompare = processArguments.toLower(); + if (toCompare == "legacy") + { + out->minecraftArguments = " ${auth_player_name} ${auth_session}"; + } + else if (toCompare == "username_session") + { + out->minecraftArguments = "--username ${auth_player_name} --session ${auth_session}"; + } + else if (toCompare == "username_session_version") + { + out->minecraftArguments = "--username ${auth_player_name} --session ${auth_session} --version ${profile_name}"; + } + else if (!toCompare.isEmpty()) + { + out->addProblem(PROBLEM_ERROR, QObject::tr("processArguments is set to unknown value '%1'").arg(processArguments)); + } } + Bits::readString(in, "type", out->type); - QJsonObject root = doc.object(); - - out->name = "Minecraft"; - out->fileId = "net.minecraft"; - out->version = root.value("version").toString(); - out->filename = filename; - - Bits::readString(root, "id", out->id); - - Bits::readString(root, "mainClass", out->mainClass); - Bits::readString(root, "minecraftArguments", out->minecraftArguments); - Bits::readString(root, "type", out->type); - - if(root.contains("assetIndex")) + if(in.contains("assetIndex")) { - out->mojangAssetIndex = assetIndexFromJson(requireObject(root, "assetIndex")); + out->mojangAssetIndex = assetIndexFromJson(requireObject(in, "assetIndex")); } - Bits::readString(root, "assets", out->assets); + Bits::readString(in, "assets", out->assets); - out->m_releaseTime = timeFromS3Time(root.value("releaseTime").toString("")); - out->m_updateTime = timeFromS3Time(root.value("time").toString("")); + out->m_releaseTime = timeFromS3Time(in.value("releaseTime").toString("")); + out->m_updateTime = timeFromS3Time(in.value("time").toString("")); - if (root.contains("minimumLauncherVersion")) + if (in.contains("minimumLauncherVersion")) { - out->minimumLauncherVersion = requireInteger(root.value("minimumLauncherVersion")); + out->minimumLauncherVersion = requireInteger(in.value("minimumLauncherVersion")); if (out->minimumLauncherVersion > CURRENT_MINIMUM_LAUNCHER_VERSION) { out->addProblem( @@ -174,20 +178,9 @@ VersionFilePtr MojangVersionFormat::versionFileFromJson(const QJsonDocument &doc .arg(CURRENT_MINIMUM_LAUNCHER_VERSION)); } } - - if (root.contains("libraries")) - { - for (auto libVal : requireArray(root.value("libraries"))) - { - auto libObj = requireObject(libVal); - - auto lib = MojangVersionFormat::libraryFromJson(libObj, filename); - out->libraries.append(lib); - } - } - if(root.contains("downloads")) + if(in.contains("downloads")) { - auto downloadsObj = requireObject(root, "downloads"); + auto downloadsObj = requireObject(in, "downloads"); for(auto iter = downloadsObj.begin(); iter != downloadsObj.end(); iter++) { auto classifier = iter.key(); @@ -195,79 +188,91 @@ VersionFilePtr MojangVersionFormat::versionFileFromJson(const QJsonDocument &doc out->mojangDownloads[classifier] = downloadInfoFromJson(classifierObj); } } - return out; } -QJsonDocument versionFileToJson(VersionFilePtr patch) +VersionFilePtr MojangVersionFormat::versionFileFromJson(const QJsonDocument &doc, const QString &filename) { - QJsonObject root; - writeString(root, "id", patch->id); - writeString(root, "mainClass", patch->mainClass); - writeString(root, "minecraftArguments", patch->minecraftArguments); - writeString(root, "type", patch->type); - writeString(root, "assets", patch->assets); - writeString(root, "releaseTime", timeToS3Time(patch->m_releaseTime)); - writeString(root, "time", timeToS3Time(patch->m_updateTime)); - if(patch->minimumLauncherVersion != -1) + VersionFilePtr out(new VersionFile()); + if (doc.isEmpty() || doc.isNull()) { - root.insert("minimumLauncherVersion", patch->minimumLauncherVersion); + throw JSONValidationError(filename + " is empty or null"); + } + if (!doc.isObject()) + { + throw JSONValidationError(filename + " is not an object"); } - if (!patch->libraries.isEmpty()) + QJsonObject root = doc.object(); + + readVersionProperties(root, out.get()); + + out->name = "Minecraft"; + out->fileId = "net.minecraft"; + out->version = out->id; + out->filename = filename; + + + if (root.contains("libraries")) { - QJsonArray array; - for (auto value: patch->libraries) + for (auto libVal : requireArray(root.value("libraries"))) { - array.append(MojangVersionFormat::libraryToJson(value.get())); + auto libObj = requireObject(libVal); + + auto lib = MojangVersionFormat::libraryFromJson(libObj, filename); + out->libraries.append(lib); } - root.insert("libraries", array); } - if(patch->mojangAssetIndex && patch->mojangAssetIndex->known) + return out; +} + +void MojangVersionFormat::writeVersionProperties(const VersionFile* in, QJsonObject& out) +{ + writeString(out, "id", in->id); + writeString(out, "mainClass", in->mainClass); + writeString(out, "minecraftArguments", in->minecraftArguments); + writeString(out, "type", in->type); + writeString(out, "assets", in->assets); + writeString(out, "releaseTime", timeToS3Time(in->m_releaseTime)); + writeString(out, "time", timeToS3Time(in->m_updateTime)); + if(in->minimumLauncherVersion != -1) + { + out.insert("minimumLauncherVersion", in->minimumLauncherVersion); + } + if(in->mojangAssetIndex && in->mojangAssetIndex->known) { - root.insert("assetIndex", assetIndexToJson(patch->mojangAssetIndex)); + out.insert("assetIndex", assetIndexToJson(in->mojangAssetIndex)); } - if(patch->mojangDownloads.size()) + if(in->mojangDownloads.size()) { QJsonObject downloadsOut; - for(auto iter = patch->mojangDownloads.begin(); iter != patch->mojangDownloads.end(); iter++) + for(auto iter = in->mojangDownloads.begin(); iter != in->mojangDownloads.end(); iter++) { downloadsOut.insert(iter.key(), downloadInfoToJson(iter.value())); } - root.insert("downloads", downloadsOut); - } - // write the contents to a json document. - { - QJsonDocument out; - out.setObject(root); - return out; + out.insert("downloads", downloadsOut); } } -static QJsonDocument minecraftVersionToJson(MinecraftVersionPtr patch) +QJsonDocument MojangVersionFormat::versionFileToJson(const VersionFilePtr &patch) { - if(patch->getVersionSource() == Local && patch->getVersionFile()) - { - return MojangVersionFormat::profilePatchToJson(patch->getVersionFile()); - } - else + QJsonObject root; + writeVersionProperties(patch.get(), root); + if (!patch->libraries.isEmpty()) { - throw VersionIncomplete(QObject::tr("Can't write incomplete/builtin Minecraft version %1").arg(patch->name())); + QJsonArray array; + for (auto value: patch->libraries) + { + array.append(MojangVersionFormat::libraryToJson(value.get())); + } + root.insert("libraries", array); } -} -QJsonDocument MojangVersionFormat::profilePatchToJson(const ProfilePatchPtr &patch) -{ - auto vfile = std::dynamic_pointer_cast<VersionFile>(patch); - if(vfile) - { - return versionFileToJson(vfile); - } - auto mversion = std::dynamic_pointer_cast<MinecraftVersion>(patch); - if(mversion) + // write the contents to a json document. { - return minecraftVersionToJson(mversion); + QJsonDocument out; + out.setObject(root); + return out; } - throw VersionIncomplete(QObject::tr("Unhandled object type while processing %1").arg(patch->getName())); } LibraryPtr MojangVersionFormat::libraryFromJson(const QJsonObject &libObj, const QString &filename) |