From 8a7e117f6b013972be8fc05480339e11b7325e3e Mon Sep 17 00:00:00 2001
From: flow <flowlnlnln@gmail.com>
Date: Mon, 29 Aug 2022 09:25:39 -0300
Subject: 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>
---
 launcher/minecraft/mod/ResourcePack.h              |   1 -
 .../mod/tasks/LocalResourcePackParseTask.cpp       | 143 +++++++++++++--------
 .../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:
@@ -19,13 +47,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;
 
-- 
cgit