Pull in BaseInstaller related changes from quickmod
This commit is contained in:
		@@ -221,45 +221,10 @@ void OneSixModEditDialog::on_forgeBtn_clicked()
 | 
			
		||||
						   m_inst->currentVersionId());
 | 
			
		||||
	if (vselect.exec() && vselect.selectedVersion())
 | 
			
		||||
	{
 | 
			
		||||
		ForgeVersionPtr forgeVersion =
 | 
			
		||||
			std::dynamic_pointer_cast<ForgeVersion>(vselect.selectedVersion());
 | 
			
		||||
		if (!forgeVersion)
 | 
			
		||||
			return;
 | 
			
		||||
		auto entry = MMC->metacache()->resolveEntry("minecraftforge", forgeVersion->filename);
 | 
			
		||||
		if (entry->stale)
 | 
			
		||||
		{
 | 
			
		||||
			NetJob *fjob = new NetJob("Forge download");
 | 
			
		||||
			fjob->addNetAction(CacheDownload::make(forgeVersion->installer_url, entry));
 | 
			
		||||
			ProgressDialog dlg(this);
 | 
			
		||||
			dlg.exec(fjob);
 | 
			
		||||
			if (dlg.result() == QDialog::Accepted)
 | 
			
		||||
			{
 | 
			
		||||
				// install
 | 
			
		||||
				QString forgePath = entry->getFullPath();
 | 
			
		||||
				ForgeInstaller forge(forgePath, forgeVersion->universal_url);
 | 
			
		||||
				if (!forge.add(m_inst))
 | 
			
		||||
				{
 | 
			
		||||
					QLOG_ERROR() << "Failure installing forge";
 | 
			
		||||
		ProgressDialog dialog(this);
 | 
			
		||||
		dialog.exec(ForgeInstaller().createInstallTask(m_inst, vselect.selectedVersion(), this));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				// failed to download forge :/
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			// install
 | 
			
		||||
			QString forgePath = entry->getFullPath();
 | 
			
		||||
			ForgeInstaller forge(forgePath, forgeVersion->universal_url);
 | 
			
		||||
			if (!forge.add(m_inst))
 | 
			
		||||
			{
 | 
			
		||||
				QLOG_ERROR() << "Failure installing forge";
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	reloadInstanceVersion();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OneSixModEditDialog::on_liteloaderBtn_clicked()
 | 
			
		||||
{
 | 
			
		||||
@@ -281,21 +246,8 @@ void OneSixModEditDialog::on_liteloaderBtn_clicked()
 | 
			
		||||
						   m_inst->currentVersionId());
 | 
			
		||||
	if (vselect.exec() && vselect.selectedVersion())
 | 
			
		||||
	{
 | 
			
		||||
		LiteLoaderVersionPtr liteloaderVersion =
 | 
			
		||||
			std::dynamic_pointer_cast<LiteLoaderVersion>(vselect.selectedVersion());
 | 
			
		||||
		if (!liteloaderVersion)
 | 
			
		||||
			return;
 | 
			
		||||
		LiteLoaderInstaller liteloader(liteloaderVersion);
 | 
			
		||||
		if (!liteloader.add(m_inst))
 | 
			
		||||
		{
 | 
			
		||||
			QMessageBox::critical(this, tr("LiteLoader"),
 | 
			
		||||
								  tr("For reasons unknown, the LiteLoader installation failed. "
 | 
			
		||||
									 "Check your MultiMC log files for details."));
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			reloadInstanceVersion();
 | 
			
		||||
		}
 | 
			
		||||
		ProgressDialog dialog(this);
 | 
			
		||||
		dialog.exec(LiteLoaderInstaller().createInstallTask(m_inst, vselect.selectedVersion(), this));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,10 @@
 | 
			
		||||
class OneSixInstance;
 | 
			
		||||
class QDir;
 | 
			
		||||
class QString;
 | 
			
		||||
class QObject;
 | 
			
		||||
class ProgressProvider;
 | 
			
		||||
class BaseVersion;
 | 
			
		||||
typedef std::shared_ptr<BaseVersion> BaseVersionPtr;
 | 
			
		||||
 | 
			
		||||
class BaseInstaller
 | 
			
		||||
{
 | 
			
		||||
@@ -31,6 +35,8 @@ public:
 | 
			
		||||
	virtual bool add(OneSixInstance *to);
 | 
			
		||||
	virtual bool remove(OneSixInstance *from);
 | 
			
		||||
 | 
			
		||||
	virtual ProgressProvider *createInstallTask(OneSixInstance *instance, BaseVersionPtr version, QObject *parent) = 0;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	virtual QString id() const = 0;
 | 
			
		||||
	QString filename(const QString &root) const;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,17 +24,24 @@
 | 
			
		||||
#include <QRegularExpression>
 | 
			
		||||
#include <QRegularExpressionMatch>
 | 
			
		||||
#include "MultiMC.h"
 | 
			
		||||
#include "tasks/Task.h"
 | 
			
		||||
#include "OneSixInstance.h"
 | 
			
		||||
#include "lists/ForgeVersionList.h"
 | 
			
		||||
#include "gui/dialogs/ProgressDialog.h"
 | 
			
		||||
 | 
			
		||||
#include <QJsonDocument>
 | 
			
		||||
#include <QJsonArray>
 | 
			
		||||
#include <QSaveFile>
 | 
			
		||||
#include <QCryptographicHash>
 | 
			
		||||
 | 
			
		||||
ForgeInstaller::ForgeInstaller(QString filename, QString universal_url)
 | 
			
		||||
ForgeInstaller::ForgeInstaller()
 | 
			
		||||
	: BaseInstaller()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
void ForgeInstaller::prepare(const QString &filename, const QString &universalUrl)
 | 
			
		||||
{
 | 
			
		||||
	std::shared_ptr<VersionFinal> newVersion;
 | 
			
		||||
	m_universal_url = universal_url;
 | 
			
		||||
	m_universal_url = universalUrl;
 | 
			
		||||
 | 
			
		||||
	QuaZip zip(filename);
 | 
			
		||||
	if (!zip.open(QuaZip::mdUnzip))
 | 
			
		||||
@@ -111,7 +118,6 @@ ForgeInstaller::ForgeInstaller(QString filename, QString universal_url)
 | 
			
		||||
	m_forge_version = newVersion;
 | 
			
		||||
	realVersionId = m_forge_version->id = installObj.value("minecraft").toString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ForgeInstaller::add(OneSixInstance *to)
 | 
			
		||||
{
 | 
			
		||||
	if (!BaseInstaller::add(to))
 | 
			
		||||
@@ -226,3 +232,96 @@ bool ForgeInstaller::add(OneSixInstance *to)
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ForgeInstallTask : public Task
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
	ForgeInstallTask(ForgeInstaller *installer, OneSixInstance *instance, BaseVersionPtr version, QObject *parent = 0)
 | 
			
		||||
		: Task(parent), m_installer(installer), m_instance(instance), m_version(version)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	void executeTask() override
 | 
			
		||||
	{
 | 
			
		||||
		{
 | 
			
		||||
			setStatus(tr("Installing forge..."));
 | 
			
		||||
			ForgeVersionPtr forgeVersion =
 | 
			
		||||
				std::dynamic_pointer_cast<ForgeVersion>(m_version);
 | 
			
		||||
			if (!forgeVersion)
 | 
			
		||||
			{
 | 
			
		||||
				emitFailed(tr("Unknown error occured"));
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			auto entry = MMC->metacache()->resolveEntry("minecraftforge", forgeVersion->filename);
 | 
			
		||||
			if (entry->stale)
 | 
			
		||||
			{
 | 
			
		||||
				NetJob *fjob = new NetJob("Forge download");
 | 
			
		||||
				fjob->addNetAction(CacheDownload::make(forgeVersion->installer_url, entry));
 | 
			
		||||
				connect(fjob, &NetJob::progress, [this](qint64 current, qint64 total){setProgress(100 * current / qMax((qint64)1, total));});
 | 
			
		||||
				connect(fjob, &NetJob::status, [this](const QString &msg){setStatus(msg);});
 | 
			
		||||
				connect(fjob, &NetJob::failed, [this](){emitFailed(tr("Failure to download forge"));});
 | 
			
		||||
				connect(fjob, &NetJob::succeeded, [this, entry, forgeVersion]()
 | 
			
		||||
				{
 | 
			
		||||
					if (!install(entry, forgeVersion))
 | 
			
		||||
					{
 | 
			
		||||
						QLOG_ERROR() << "Failure installing forge";
 | 
			
		||||
						emitFailed(tr("Failure to install forge"));
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						reload();
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if (!install(entry, forgeVersion))
 | 
			
		||||
				{
 | 
			
		||||
					QLOG_ERROR() << "Failure installing forge";
 | 
			
		||||
					emitFailed(tr("Failure to install forge"));
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					reload();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool install(const std::shared_ptr<MetaEntry> &entry, const ForgeVersionPtr &forgeVersion)
 | 
			
		||||
	{
 | 
			
		||||
		QString forgePath = entry->getFullPath();
 | 
			
		||||
		m_installer->prepare(forgePath, forgeVersion->universal_url);
 | 
			
		||||
		return m_installer->add(m_instance);
 | 
			
		||||
	}
 | 
			
		||||
	void reload()
 | 
			
		||||
	{
 | 
			
		||||
		try
 | 
			
		||||
		{
 | 
			
		||||
			m_instance->reloadVersion();
 | 
			
		||||
			emitSucceeded();
 | 
			
		||||
		}
 | 
			
		||||
		catch (MMCError &e)
 | 
			
		||||
		{
 | 
			
		||||
			emitFailed(e.cause());
 | 
			
		||||
		}
 | 
			
		||||
		catch (...)
 | 
			
		||||
		{
 | 
			
		||||
			emitFailed(tr("Failed to load the version description file for reasons unknown."));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	ForgeInstaller *m_installer;
 | 
			
		||||
	OneSixInstance *m_instance;
 | 
			
		||||
	BaseVersionPtr m_version;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
ProgressProvider *ForgeInstaller::createInstallTask(OneSixInstance *instance, BaseVersionPtr version, QObject *parent)
 | 
			
		||||
{
 | 
			
		||||
	return new ForgeInstallTask(this, instance, version, parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "ForgeInstaller.moc"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,12 +25,15 @@ class VersionFinal;
 | 
			
		||||
class ForgeInstaller : public BaseInstaller
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	ForgeInstaller(QString filename, QString universal_url);
 | 
			
		||||
	ForgeInstaller();
 | 
			
		||||
 | 
			
		||||
	void prepare(const QString &filename, const QString &universalUrl);
 | 
			
		||||
	bool add(OneSixInstance *to) override;
 | 
			
		||||
 | 
			
		||||
	QString id() const override { return "net.minecraftforge"; }
 | 
			
		||||
 | 
			
		||||
	ProgressProvider *createInstallTask(OneSixInstance *instance, BaseVersionPtr version, QObject *parent) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	// the version, read from the installer
 | 
			
		||||
	std::shared_ptr<VersionFinal> m_forge_version;
 | 
			
		||||
 
 | 
			
		||||
@@ -23,12 +23,17 @@
 | 
			
		||||
#include "VersionFinal.h"
 | 
			
		||||
#include "OneSixLibrary.h"
 | 
			
		||||
#include "OneSixInstance.h"
 | 
			
		||||
#include "MultiMC.h"
 | 
			
		||||
#include "lists/LiteLoaderVersionList.h"
 | 
			
		||||
 | 
			
		||||
LiteLoaderInstaller::LiteLoaderInstaller(LiteLoaderVersionPtr version)
 | 
			
		||||
	: BaseInstaller(), m_version(version)
 | 
			
		||||
LiteLoaderInstaller::LiteLoaderInstaller() : BaseInstaller()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void LiteLoaderInstaller::prepare(LiteLoaderVersionPtr version)
 | 
			
		||||
{
 | 
			
		||||
	m_version = version;
 | 
			
		||||
}
 | 
			
		||||
bool LiteLoaderInstaller::add(OneSixInstance *to)
 | 
			
		||||
{
 | 
			
		||||
	if (!BaseInstaller::add(to))
 | 
			
		||||
@@ -84,3 +89,62 @@ bool LiteLoaderInstaller::add(OneSixInstance *to)
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class LiteLoaderInstallTask : public Task
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
	LiteLoaderInstallTask(LiteLoaderInstaller *installer, OneSixInstance *instance,
 | 
			
		||||
						  BaseVersionPtr version, QObject *parent)
 | 
			
		||||
		: Task(parent), m_installer(installer), m_instance(instance), m_version(version)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	void executeTask() override
 | 
			
		||||
	{
 | 
			
		||||
		LiteLoaderVersionPtr liteloaderVersion =
 | 
			
		||||
			std::dynamic_pointer_cast<LiteLoaderVersion>(m_version);
 | 
			
		||||
		if (!liteloaderVersion)
 | 
			
		||||
		{
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		m_installer->prepare(liteloaderVersion);
 | 
			
		||||
		if (!m_installer->add(m_instance))
 | 
			
		||||
		{
 | 
			
		||||
			emitFailed(tr("For reasons unknown, the LiteLoader installation failed. Check your "
 | 
			
		||||
						  "MultiMC log files for details."));
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			try
 | 
			
		||||
			{
 | 
			
		||||
				m_instance->reloadVersion();
 | 
			
		||||
				emitSucceeded();
 | 
			
		||||
			}
 | 
			
		||||
			catch (MMCError &e)
 | 
			
		||||
			{
 | 
			
		||||
				emitFailed(e.cause());
 | 
			
		||||
			}
 | 
			
		||||
			catch (...)
 | 
			
		||||
			{
 | 
			
		||||
				emitFailed(
 | 
			
		||||
					tr("Failed to load the version description file for reasons unknown."));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	LiteLoaderInstaller *m_installer;
 | 
			
		||||
	OneSixInstance *m_instance;
 | 
			
		||||
	BaseVersionPtr m_version;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
ProgressProvider *LiteLoaderInstaller::createInstallTask(OneSixInstance *instance,
 | 
			
		||||
														 BaseVersionPtr version,
 | 
			
		||||
														 QObject *parent)
 | 
			
		||||
{
 | 
			
		||||
	return new LiteLoaderInstallTask(this, instance, version, parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "LiteLoaderInstaller.moc"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,10 +25,13 @@
 | 
			
		||||
class LiteLoaderInstaller : public BaseInstaller
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	LiteLoaderInstaller(LiteLoaderVersionPtr version);
 | 
			
		||||
	LiteLoaderInstaller();
 | 
			
		||||
 | 
			
		||||
	void prepare(LiteLoaderVersionPtr version);
 | 
			
		||||
	bool add(OneSixInstance *to) override;
 | 
			
		||||
 | 
			
		||||
	ProgressProvider *createInstallTask(OneSixInstance *instance, BaseVersionPtr version, QObject *parent) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	virtual QString id() const override
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user