#pragma once
#include
#include "ATLPackManifest.h"
#include "InstanceTask.h"
#include "multimc_logic_export.h"
#include "net/NetJob.h"
#include "settings/INISettingsObject.h"
#include "minecraft/MinecraftInstance.h"
#include "minecraft/PackProfile.h"
#include "meta/Version.h"
#include
namespace ATLauncher {
class MULTIMC_LOGIC_EXPORT UserInteractionSupport {
public:
/**
* Requests a user interaction to select which optional mods should be installed.
*/
virtual QVector chooseOptionalMods(QVector mods) = 0;
/**
* Requests a user interaction to select a component version from a given version list
* and constrained to a given Minecraft version.
*/
virtual QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) = 0;
};
class MULTIMC_LOGIC_EXPORT PackInstallTask : public InstanceTask
{
Q_OBJECT
public:
explicit PackInstallTask(UserInteractionSupport *support, QString pack, QString version);
virtual ~PackInstallTask(){}
bool abort() override;
protected:
virtual void executeTask() override;
private slots:
void onDownloadSucceeded();
void onDownloadFailed(QString reason);
void onModsDownloaded();
void onModsExtracted();
private:
QString getDirForModType(ModType type, QString raw);
QString getVersionForLoader(QString uid);
QString detectLibrary(VersionLibrary library);
bool createLibrariesComponent(QString instanceRoot, std::shared_ptr profile);
bool createPackComponent(QString instanceRoot, std::shared_ptr profile);
void installConfigs();
void extractConfigs();
void downloadMods();
bool extractMods(
const QMap &toExtract,
const QMap &toDecomp,
const QMap &toCopy
);
void install();
private:
UserInteractionSupport *m_support;
NetJobPtr jobPtr;
QByteArray response;
QString m_pack;
QString m_version_name;
PackVersion m_version;
QMap modsToExtract;
QMap modsToDecomp;
QMap modsToCopy;
QString archivePath;
QStringList jarmods;
Meta::VersionPtr minecraftVersion;
QMap componentsToInstall;
QFuture> m_extractFuture;
QFutureWatcher> m_extractFutureWatcher;
QFuture m_modExtractFuture;
QFutureWatcher m_modExtractFutureWatcher;
};
}