diff options
author | flow <flowlnlnln@gmail.com> | 2022-08-29 09:25:39 -0300 |
---|---|---|
committer | flow <flowlnlnln@gmail.com> | 2022-09-03 13:37:22 -0300 |
commit | 8a7e117f6b013972be8fc05480339e11b7325e3e (patch) | |
tree | 1e2ad02a5d08c08207351b34f8b696082c94e415 /launcher/minecraft/mod | |
parent | 9b984cedaca78153bc865a3eac5def4535b4d664 (diff) | |
download | PrismLauncher-8a7e117f6b013972be8fc05480339e11b7325e3e.tar.gz PrismLauncher-8a7e117f6b013972be8fc05480339e11b7325e3e.tar.bz2 PrismLauncher-8a7e117f6b013972be8fc05480339e11b7325e3e.zip |
refactor: move resource pack file parsing utilities to separate namespace
This makes it easier to use that logic in other contexts.
Signed-off-by: flow <flowlnlnln@gmail.com>
Diffstat (limited to 'launcher/minecraft/mod')
-rw-r--r-- | launcher/minecraft/mod/ResourcePack.h | 1 | ||||
-rw-r--r-- | launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp | 143 | ||||
-rw-r--r-- | launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h | 35 |
3 files changed, 114 insertions, 65 deletions
diff --git a/launcher/minecraft/mod/ResourcePack.h b/launcher/minecraft/mod/ResourcePack.h index 1a51d9ef..720fa3a0 100644 --- a/launcher/minecraft/mod/ResourcePack.h +++ b/launcher/minecraft/mod/ResourcePack.h @@ -10,7 +10,6 @@ class Version; /* TODO: * - * Store pack.png * Store localized descriptions * */ diff --git a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp index b13e5775..4634e08b 100644 --- a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp @@ -1,3 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (c) 2022 flowln <flowlnlnln@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + #include "LocalResourcePackParseTask.h" #include "FileSystem.h" @@ -6,67 +24,28 @@ #include <quazip/quazip.h> #include <quazip/quazipfile.h> -LocalResourcePackParseTask::LocalResourcePackParseTask(int token, ResourcePack& rp) - : Task(nullptr, false), m_token(token), m_resource_pack(rp) -{} - -bool LocalResourcePackParseTask::abort() -{ - m_aborted = true; - return true; -} +namespace ResourcePackUtils { -void LocalResourcePackParseTask::executeTask() +bool process(ResourcePack& pack) { - switch (m_resource_pack.type()) { + switch (pack.type()) { case ResourceType::FOLDER: - processAsFolder(); - break; + ResourcePackUtils::processFolder(pack); + return true; case ResourceType::ZIPFILE: - processAsZip(); - break; + ResourcePackUtils::processZIP(pack); + return true; default: qWarning() << "Invalid type for resource pack parse task!"; - emitFailed(tr("Invalid type.")); + return false; } - - if (isFinished()) - return; - - if (m_aborted) - emitAborted(); - else - emitSucceeded(); } -// https://minecraft.fandom.com/wiki/Tutorials/Creating_a_resource_pack#Formatting_pack.mcmeta -void LocalResourcePackParseTask::processMCMeta(QByteArray&& raw_data) +void processFolder(ResourcePack& pack) { - try { - auto json_doc = QJsonDocument::fromJson(raw_data); - auto pack_obj = Json::requireObject(json_doc.object(), "pack", {}); - - m_resource_pack.setPackFormat(Json::ensureInteger(pack_obj, "pack_format", 0)); - m_resource_pack.setDescription(Json::ensureString(pack_obj, "description", "")); - } catch (Json::JsonException& e) { - qWarning() << "JsonException: " << e.what() << e.cause(); - emitFailed(tr("Failed to process .mcmeta file.")); - } -} + Q_ASSERT(pack.type() == ResourceType::FOLDER); -void LocalResourcePackParseTask::processPackPNG(QByteArray&& raw_data) -{ - auto img = QImage::fromData(raw_data); - if (!img.isNull()) { - m_resource_pack.setImage(img); - } else { - qWarning() << "Failed to parse pack.png."; - } -} - -void LocalResourcePackParseTask::processAsFolder() -{ - QFileInfo mcmeta_file_info(FS::PathCombine(m_resource_pack.fileinfo().filePath(), "pack.mcmeta")); + QFileInfo mcmeta_file_info(FS::PathCombine(pack.fileinfo().filePath(), "pack.mcmeta")); if (mcmeta_file_info.isFile()) { QFile mcmeta_file(mcmeta_file_info.filePath()); if (!mcmeta_file.open(QIODevice::ReadOnly)) @@ -74,12 +53,12 @@ void LocalResourcePackParseTask::processAsFolder() auto data = mcmeta_file.readAll(); - processMCMeta(std::move(data)); + ResourcePackUtils::processMCMeta(pack, std::move(data)); mcmeta_file.close(); } - QFileInfo image_file_info(FS::PathCombine(m_resource_pack.fileinfo().filePath(), "pack.png")); + QFileInfo image_file_info(FS::PathCombine(pack.fileinfo().filePath(), "pack.png")); if (image_file_info.isFile()) { QFile mcmeta_file(image_file_info.filePath()); if (!mcmeta_file.open(QIODevice::ReadOnly)) @@ -87,15 +66,17 @@ void LocalResourcePackParseTask::processAsFolder() auto data = mcmeta_file.readAll(); - processPackPNG(std::move(data)); + ResourcePackUtils::processPackPNG(pack, std::move(data)); mcmeta_file.close(); } } -void LocalResourcePackParseTask::processAsZip() +void processZIP(ResourcePack& pack) { - QuaZip zip(m_resource_pack.fileinfo().filePath()); + Q_ASSERT(pack.type() == ResourceType::ZIPFILE); + + QuaZip zip(pack.fileinfo().filePath()); if (!zip.open(QuaZip::mdUnzip)) return; @@ -110,7 +91,7 @@ void LocalResourcePackParseTask::processAsZip() auto data = file.readAll(); - processMCMeta(std::move(data)); + ResourcePackUtils::processMCMeta(pack, std::move(data)); file.close(); } @@ -124,10 +105,58 @@ void LocalResourcePackParseTask::processAsZip() auto data = file.readAll(); - processPackPNG(std::move(data)); + ResourcePackUtils::processPackPNG(pack, std::move(data)); file.close(); } zip.close(); } + +// https://minecraft.fandom.com/wiki/Tutorials/Creating_a_resource_pack#Formatting_pack.mcmeta +void processMCMeta(ResourcePack& pack, QByteArray&& raw_data) +{ + try { + auto json_doc = QJsonDocument::fromJson(raw_data); + auto pack_obj = Json::requireObject(json_doc.object(), "pack", {}); + + pack.setPackFormat(Json::ensureInteger(pack_obj, "pack_format", 0)); + pack.setDescription(Json::ensureString(pack_obj, "description", "")); + } catch (Json::JsonException& e) { + qWarning() << "JsonException: " << e.what() << e.cause(); + } +} + +void processPackPNG(ResourcePack& pack, QByteArray&& raw_data) +{ + auto img = QImage::fromData(raw_data); + if (!img.isNull()) { + pack.setImage(img); + } else { + qWarning() << "Failed to parse pack.png."; + } +} +} // namespace ResourcePackUtils + +LocalResourcePackParseTask::LocalResourcePackParseTask(int token, ResourcePack& rp) + : Task(nullptr, false), m_token(token), m_resource_pack(rp) +{} + +bool LocalResourcePackParseTask::abort() +{ + m_aborted = true; + return true; +} + +void LocalResourcePackParseTask::executeTask() +{ + Q_ASSERT(m_resource_pack.valid()); + + if (!ResourcePackUtils::process(m_resource_pack)) + return; + + if (m_aborted) + emitAborted(); + else + emitSucceeded(); +} diff --git a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h index 86ea033d..d3c25464 100644 --- a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h +++ b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h @@ -1,3 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (c) 2022 flowln <flowlnlnln@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + #pragma once #include <QDebug> @@ -7,6 +25,16 @@ #include "tasks/Task.h" +namespace ResourcePackUtils { +bool process(ResourcePack& pack); + +void processZIP(ResourcePack& pack); +void processFolder(ResourcePack& pack); + +void processMCMeta(ResourcePack& pack, QByteArray&& raw_data); +void processPackPNG(ResourcePack& pack, QByteArray&& raw_data); +} // namespace ResourcePackUtils + class LocalResourcePackParseTask : public Task { Q_OBJECT public: @@ -20,13 +48,6 @@ class LocalResourcePackParseTask : public Task { [[nodiscard]] int token() const { return m_token; } private: - void processMCMeta(QByteArray&& raw_data); - void processPackPNG(QByteArray&& raw_data); - - void processAsFolder(); - void processAsZip(); - - private: int m_token; ResourcePack& m_resource_pack; |