summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/ResourceDownloadTask.cpp
diff options
context:
space:
mode:
authorMehmet Samet Duman <yongdohyun@projecttick.org>2026-04-02 18:51:45 +0300
committerMehmet Samet Duman <yongdohyun@projecttick.org>2026-04-02 18:51:45 +0300
commitd3261e64152397db2dca4d691a990c6bc2a6f4dd (patch)
treefac2f7be638651181a72453d714f0f96675c2b8b /archived/projt-launcher/launcher/ResourceDownloadTask.cpp
parent31b9a8949ed0a288143e23bf739f2eb64fdc63be (diff)
downloadProject-Tick-d3261e64152397db2dca4d691a990c6bc2a6f4dd.tar.gz
Project-Tick-d3261e64152397db2dca4d691a990c6bc2a6f4dd.zip
NOISSUE add archived projects
Signed-off-by: Mehmet Samet Duman <yongdohyun@projecttick.org>
Diffstat (limited to 'archived/projt-launcher/launcher/ResourceDownloadTask.cpp')
-rw-r--r--archived/projt-launcher/launcher/ResourceDownloadTask.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/archived/projt-launcher/launcher/ResourceDownloadTask.cpp b/archived/projt-launcher/launcher/ResourceDownloadTask.cpp
new file mode 100644
index 0000000000..62b5e90ad8
--- /dev/null
+++ b/archived/projt-launcher/launcher/ResourceDownloadTask.cpp
@@ -0,0 +1,157 @@
+// SPDX-License-Identifier: GPL-3.0-only
+// SPDX-FileCopyrightText: 2026 Project Tick
+// SPDX-FileContributor: Project Tick Team
+/*
+ * ProjT Launcher - Minecraft Launcher
+ * Copyright (C) 2026 Project Tick
+ *
+ * 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, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * === Upstream License Block (Do Not Modify) ==============================
+ *
+ *
+ *
+ * Prism Launcher - Minecraft Launcher
+ * Copyright (c) 2022-2023 flowln <flowlnlnln@gmail.com>
+ * Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
+ *
+ * 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, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ======================================================================== */
+
+#include "ResourceDownloadTask.h"
+
+#include "Application.h"
+
+#include "minecraft/mod/ModFolderModel.hpp"
+#include "minecraft/mod/ResourceFolderModel.hpp"
+
+#include "modplatform/helpers/HashUtils.h"
+#include "net/ApiDownload.h"
+#include "net/ChecksumValidator.h"
+
+ResourceDownloadTask::ResourceDownloadTask(ModPlatform::IndexedPack::Ptr pack,
+ ModPlatform::IndexedVersion version,
+ const std::shared_ptr<ResourceFolderModel> packs,
+ bool is_indexed,
+ QString custom_target_folder)
+ : m_pack(std::move(pack)),
+ m_pack_version(std::move(version)),
+ m_pack_model(packs),
+ m_custom_target_folder(custom_target_folder)
+{
+ if (is_indexed)
+ {
+ m_update_task.reset(new LocalResourceUpdateTask(m_pack_model->indexDir(), *m_pack, m_pack_version));
+ connect(m_update_task.get(),
+ &LocalResourceUpdateTask::hasOldResource,
+ this,
+ &ResourceDownloadTask::hasOldResource);
+
+ addTask(m_update_task);
+ }
+
+ m_filesNetJob.reset(new NetJob(tr("Resource download"), APPLICATION->network()));
+ m_filesNetJob->setStatus(tr("Downloading resource:\n%1").arg(m_pack_version.downloadUrl));
+
+ QDir dir{ m_pack_model->dir() };
+ {
+ // Use relative path from metadata if available (Generic approach)
+ if (!m_pack_version.relativePath.isEmpty())
+ {
+ dir.cdUp(); // Go to base (minecraft directory assumption)
+ dir = QDir(dir.absoluteFilePath(m_pack_version.relativePath));
+ }
+ // Legacy/Manual override
+ else if (!m_custom_target_folder.isEmpty())
+ {
+ dir.cdUp();
+ dir.cd(m_custom_target_folder);
+ }
+ }
+
+ auto action = Net::ApiDownload::makeFile(m_pack_version.downloadUrl, dir.absoluteFilePath(getFilename()));
+ if (!m_pack_version.hash_type.isEmpty() && !m_pack_version.hash.isEmpty())
+ {
+ switch (Hashing::algorithmFromString(m_pack_version.hash_type))
+ {
+ case Hashing::Algorithm::Md4:
+ action->addValidator(
+ new Net::ChecksumValidator(QCryptographicHash::Algorithm::Md4, m_pack_version.hash));
+ break;
+ case Hashing::Algorithm::Md5:
+ action->addValidator(
+ new Net::ChecksumValidator(QCryptographicHash::Algorithm::Md5, m_pack_version.hash));
+ break;
+ case Hashing::Algorithm::Sha1:
+ action->addValidator(
+ new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha1, m_pack_version.hash));
+ break;
+ case Hashing::Algorithm::Sha256:
+ action->addValidator(
+ new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha256, m_pack_version.hash));
+ break;
+ case Hashing::Algorithm::Sha512:
+ action->addValidator(
+ new Net::ChecksumValidator(QCryptographicHash::Algorithm::Sha512, m_pack_version.hash));
+ break;
+ default: break;
+ }
+ }
+ m_filesNetJob->addNetAction(action);
+ connect(m_filesNetJob.get(), &NetJob::succeeded, this, &ResourceDownloadTask::downloadSucceeded);
+ connect(m_filesNetJob.get(), &NetJob::progress, this, &ResourceDownloadTask::downloadProgressChanged);
+ connect(m_filesNetJob.get(), &NetJob::stepProgress, this, &ResourceDownloadTask::propagateStepProgress);
+ connect(m_filesNetJob.get(), &NetJob::failed, this, &ResourceDownloadTask::downloadFailed);
+
+ addTask(m_filesNetJob);
+}
+
+void ResourceDownloadTask::downloadSucceeded()
+{
+ m_filesNetJob.reset();
+ auto name = std::get<0>(to_delete);
+ auto filename = std::get<1>(to_delete);
+ if (!name.isEmpty() && filename != m_pack_version.fileName)
+ m_pack_model->uninstallResource(filename, true);
+}
+
+void ResourceDownloadTask::downloadFailed(QString reason)
+{
+ emitFailed(reason);
+ m_filesNetJob.reset();
+}
+
+void ResourceDownloadTask::downloadProgressChanged(qint64 current, qint64 total)
+{
+ emit progress(current, total);
+}
+
+// This indirection is done so that we don't delete a mod before being sure it was
+// downloaded successfully!
+void ResourceDownloadTask::hasOldResource(QString name, QString filename)
+{
+ to_delete = { name, filename };
+}