From 13628e7a8260b9407b0d44069f5bc1ecab585f35 Mon Sep 17 00:00:00 2001 From: Petr Mrázek Date: Mon, 24 Jul 2017 09:01:37 +0200 Subject: NOISSUE merging of strategy into profile, onesix into minecraft --- api/logic/minecraft/update/LibrariesTask.cpp | 95 ++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 api/logic/minecraft/update/LibrariesTask.cpp (limited to 'api/logic/minecraft/update/LibrariesTask.cpp') diff --git a/api/logic/minecraft/update/LibrariesTask.cpp b/api/logic/minecraft/update/LibrariesTask.cpp new file mode 100644 index 00000000..c408f432 --- /dev/null +++ b/api/logic/minecraft/update/LibrariesTask.cpp @@ -0,0 +1,95 @@ +#include "Env.h" +#include "LibrariesTask.h" +#include "minecraft/MinecraftInstance.h" +#include "minecraft/MinecraftProfile.h" + +LibrariesTask::LibrariesTask(MinecraftInstance * inst) +{ + m_inst = inst; +} + +void LibrariesTask::executeTask() +{ + setStatus(tr("Getting the library files from Mojang...")); + qDebug() << m_inst->name() << ": downloading libraries"; + MinecraftInstance *inst = (MinecraftInstance *)m_inst; + inst->reloadProfile(); + if(inst->hasVersionBroken()) + { + emitFailed(tr("Failed to load the version description files - check the instance for errors.")); + return; + } + + // Build a list of URLs that will need to be downloaded. + std::shared_ptr profile = inst->getMinecraftProfile(); + + auto job = new NetJob(tr("Libraries for instance %1").arg(inst->name())); + downloadJob.reset(job); + + auto metacache = ENV.metacache(); + QList brokenLocalLibs; + QStringList failedFiles; + auto createJob = [&](const LibraryPtr & lib) + { + if(!lib) + { + emitFailed(tr("Null jar is specified in the metadata, aborting.")); + return; + } + auto dls = lib->getDownloads(currentSystem, metacache.get(), failedFiles, inst->getLocalLibraryPath()); + for(auto dl : dls) + { + downloadJob->addNetAction(dl); + } + }; + auto createJobs = [&](const QList & libs) + { + for (auto lib : libs) + { + createJob(lib); + } + }; + createJobs(profile->getLibraries()); + createJobs(profile->getNativeLibraries()); + createJobs(profile->getJarMods()); + createJob(profile->getMainJar()); + + // FIXME: this is never filled!!!! + if (!brokenLocalLibs.empty()) + { + downloadJob.reset(); + QString failed_all = failedFiles.join("\n"); + emitFailed(tr("Some libraries marked as 'local' are missing their jar " + "files:\n%1\n\nYou'll have to correct this problem manually. If this is " + "an externally tracked instance, make sure to run it at least once " + "outside of MultiMC.").arg(failed_all)); + return; + } + connect(downloadJob.get(), &NetJob::succeeded, this, &LibrariesTask::emitSucceeded); + connect(downloadJob.get(), &NetJob::failed, this, &LibrariesTask::jarlibFailed); + connect(downloadJob.get(), &NetJob::progress, this, &LibrariesTask::progress); + downloadJob->start(); +} + +bool LibrariesTask::canAbort() const +{ + return true; +} + +void LibrariesTask::jarlibFailed(QString reason) +{ + emitFailed(tr("Game update failed: it was impossible to fetch the required libraries.\nReason:\n%1").arg(reason)); +} + +bool LibrariesTask::abort() +{ + if(downloadJob) + { + return downloadJob->abort(); + } + else + { + qWarning() << "Prematurely aborted LibrariesTask"; + } + return true; +} -- cgit