mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-12-28 06:34:27 +00:00
Trim unexpected info from pack.mcmeta (#4522)
Some checks are pending
CodeQL Code Scanning / CodeQL (push) Waiting to run
Flatpak / Build (${{ matrix.arch }}) (aarch64, ubuntu-22.04-arm) (push) Waiting to run
Flatpak / Build (${{ matrix.arch }}) (x86_64, ubuntu-22.04) (push) Waiting to run
Nix / Build (${{ matrix.system }}) (macos-14, aarch64-darwin) (push) Waiting to run
Nix / Build (${{ matrix.system }}) (macos-15-intel, x86_64-darwin) (push) Waiting to run
Nix / Build (${{ matrix.system }}) (ubuntu-22.04, x86_64-linux) (push) Waiting to run
Nix / Build (${{ matrix.system }}) (ubuntu-22.04-arm, aarch64-linux) (push) Waiting to run
Some checks are pending
CodeQL Code Scanning / CodeQL (push) Waiting to run
Flatpak / Build (${{ matrix.arch }}) (aarch64, ubuntu-22.04-arm) (push) Waiting to run
Flatpak / Build (${{ matrix.arch }}) (x86_64, ubuntu-22.04) (push) Waiting to run
Nix / Build (${{ matrix.system }}) (macos-14, aarch64-darwin) (push) Waiting to run
Nix / Build (${{ matrix.system }}) (macos-15-intel, x86_64-darwin) (push) Waiting to run
Nix / Build (${{ matrix.system }}) (ubuntu-22.04, x86_64-linux) (push) Waiting to run
Nix / Build (${{ matrix.system }}) (ubuntu-22.04-arm, aarch64-linux) (push) Waiting to run
This commit is contained in:
commit
53e090f035
@ -101,6 +101,21 @@ QJsonArray requireArray(const QJsonDocument& doc, const QString& what)
|
||||
return doc.array();
|
||||
}
|
||||
|
||||
QJsonDocument parseUntilGarbage(const QByteArray& json, QJsonParseError* error, QString* garbage)
|
||||
{
|
||||
auto doc = QJsonDocument::fromJson(json, error);
|
||||
if (error->error == QJsonParseError::GarbageAtEnd) {
|
||||
qsizetype offset = error->offset;
|
||||
QByteArray validJson = json.left(offset);
|
||||
doc = QJsonDocument::fromJson(validJson, error);
|
||||
|
||||
if (garbage)
|
||||
*garbage = json.right(json.size() - offset);
|
||||
}
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
void writeString(QJsonObject& to, const QString& key, const QString& value)
|
||||
{
|
||||
if (!value.isEmpty()) {
|
||||
|
||||
@ -107,6 +107,9 @@ QJsonArray toJsonArray(const QList<T>& container)
|
||||
|
||||
////////////////// READING ////////////////////
|
||||
|
||||
// Attempt to parse JSON up until garbage is encountered
|
||||
QJsonDocument parseUntilGarbage(const QByteArray& json, QJsonParseError* error = nullptr, QString* garbage = nullptr);
|
||||
|
||||
/// @throw JsonException
|
||||
template <typename T>
|
||||
T requireIsType(const QJsonValue& value, const QString& what = "Value");
|
||||
|
||||
@ -168,10 +168,15 @@ bool processZIP(DataPack* pack, ProcessingLevel level)
|
||||
// https://minecraft.wiki/w/Tutorials/Creating_a_resource_pack#Formatting_pack.mcmeta
|
||||
bool processMCMeta(DataPack* pack, QByteArray&& raw_data)
|
||||
{
|
||||
try {
|
||||
auto json_doc = QJsonDocument::fromJson(raw_data);
|
||||
auto pack_obj = Json::requireObject(json_doc.object(), "pack", {});
|
||||
QJsonParseError parse_error;
|
||||
auto json_doc = Json::parseUntilGarbage(raw_data, &parse_error);
|
||||
if (parse_error.error != QJsonParseError::NoError) {
|
||||
qWarning() << "Failed to parse JSON:" << parse_error.errorString();
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
auto pack_obj = Json::requireObject(json_doc.object(), "pack", {});
|
||||
pack->setPackFormat(pack_obj["pack_format"].toInt());
|
||||
pack->setDescription(DataPackUtils::processComponent(pack_obj.value("description")));
|
||||
} catch (Json::JsonException& e) {
|
||||
|
||||
@ -81,16 +81,11 @@ void McClient::parseResponse()
|
||||
|
||||
// 'resp' should now be the JSON string
|
||||
QJsonParseError parseError;
|
||||
QJsonDocument doc = QJsonDocument::fromJson(m_resp, &parseError);
|
||||
QJsonDocument doc = Json::parseUntilGarbage(m_resp, &parseError);
|
||||
if (parseError.error != QJsonParseError::NoError) {
|
||||
QByteArray validJson = m_resp.left(parseError.offset);
|
||||
doc = QJsonDocument::fromJson(validJson, &parseError);
|
||||
|
||||
if (parseError.error != QJsonParseError::NoError) {
|
||||
qDebug() << "Failed to parse JSON:" << parseError.errorString();
|
||||
emitFail(parseError.errorString());
|
||||
return;
|
||||
}
|
||||
qDebug() << "Failed to parse JSON:" << parseError.errorString();
|
||||
emitFail(parseError.errorString());
|
||||
return;
|
||||
}
|
||||
emitSucceed(doc.object());
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user