diff options
author | Petr Mrázek <peterix@gmail.com> | 2017-07-24 09:01:37 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2017-09-09 19:19:05 +0200 |
commit | 13628e7a8260b9407b0d44069f5bc1ecab585f35 (patch) | |
tree | 162a0d8b597154c1a00c649d44b3bf8fd1e10d2b /api/logic/minecraft/update/LibrariesTask.cpp | |
parent | b29382c748353856053f07b4756fa98f854244e1 (diff) | |
download | MultiMC-13628e7a8260b9407b0d44069f5bc1ecab585f35.tar MultiMC-13628e7a8260b9407b0d44069f5bc1ecab585f35.tar.gz MultiMC-13628e7a8260b9407b0d44069f5bc1ecab585f35.tar.lz MultiMC-13628e7a8260b9407b0d44069f5bc1ecab585f35.tar.xz MultiMC-13628e7a8260b9407b0d44069f5bc1ecab585f35.zip |
NOISSUE merging of strategy into profile, onesix into minecraft
Diffstat (limited to 'api/logic/minecraft/update/LibrariesTask.cpp')
-rw-r--r-- | api/logic/minecraft/update/LibrariesTask.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
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<MinecraftProfile> profile = inst->getMinecraftProfile(); + + auto job = new NetJob(tr("Libraries for instance %1").arg(inst->name())); + downloadJob.reset(job); + + auto metacache = ENV.metacache(); + QList<LibraryPtr> 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<LibraryPtr> & 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; +} |