aboutsummaryrefslogtreecommitdiff
path: root/launcher
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2022-08-29 09:25:39 -0300
committerflow <flowlnlnln@gmail.com>2022-09-03 13:37:22 -0300
commit8a7e117f6b013972be8fc05480339e11b7325e3e (patch)
tree1e2ad02a5d08c08207351b34f8b696082c94e415 /launcher
parent9b984cedaca78153bc865a3eac5def4535b4d664 (diff)
downloadPrismLauncher-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')
-rw-r--r--launcher/minecraft/mod/ResourcePack.h1
-rw-r--r--launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp143
-rw-r--r--launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h35
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;