/* SPDX-FileCopyrightText: 2026 Project Tick * SPDX-FileContributor: Project Tick * SPDX-License-Identifier: GPL-3.0-or-later * * MeshMC - A Custom Launcher for Minecraft * 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, either version 3 of the License, or * (at your option) any later version. * * 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 . */ #include "FileResolvingTask.h" #include "Json.h" Flame::FileResolvingTask::FileResolvingTask( shared_qobject_ptr network, Flame::Manifest& toProcess) : m_network(network), m_toProcess(toProcess) { } void Flame::FileResolvingTask::executeTask() { setStatus(tr("Resolving mod IDs...")); setProgress(0, m_toProcess.files.size()); m_dljob = new NetJob("Mod id resolver", m_network); results.resize(m_toProcess.files.size()); int index = 0; for (auto& file : m_toProcess.files) { auto projectIdStr = QString::number(file.projectId); auto fileIdStr = QString::number(file.fileId); QString metaurl = QString("https://api.curseforge.com/v1/mods/%1/files/%2") .arg(projectIdStr, fileIdStr); auto dl = Net::Download::makeByteArray(QUrl(metaurl), &results[index]); m_dljob->addNetAction(dl); index++; } connect(m_dljob.get(), &NetJob::finished, this, &Flame::FileResolvingTask::netJobFinished); m_dljob->start(); } void Flame::FileResolvingTask::netJobFinished() { int index = 0; int unresolved = 0; for (auto& bytes : results) { auto& out = m_toProcess.files[index]; try { if (!out.parseFromBytes(bytes)) { unresolved++; qWarning() << "Resolving of" << out.projectId << out.fileId << "failed: mod may have restricted downloads"; } } catch (const JSONValidationError& e) { unresolved++; qCritical() << "Resolving of" << out.projectId << out.fileId << "failed because of a parsing error:"; qCritical() << e.cause(); qCritical() << "JSON:"; qCritical() << bytes; } index++; } if (unresolved > 0) { qWarning() << unresolved << "mod(s) could not be resolved (restricted downloads). " "They will be skipped."; } emitSucceeded(); }