From 010e07eb4552d805ad3dc08347531d9bad6b3c24 Mon Sep 17 00:00:00 2001
From: Petr Mrázek <peterix@gmail.com>
Date: Sun, 13 Mar 2016 19:45:34 +0100
Subject: NOISSUE clean up forge installer

---
 logic/minecraft/MinecraftProfile.cpp           |   2 +-
 logic/minecraft/NullProfileStrategy.h          |  32 ----
 logic/minecraft/forge/ForgeInstaller.cpp       | 203 +++++++++++++------------
 logic/minecraft/forge/ForgeInstaller.h         |   4 +-
 logic/minecraft/onesix/OneSixVersionFormat.cpp |  18 ---
 logic/minecraft/onesix/OneSixVersionFormat.h   |   3 -
 6 files changed, 111 insertions(+), 151 deletions(-)
 delete mode 100644 logic/minecraft/NullProfileStrategy.h

(limited to 'logic/minecraft')

diff --git a/logic/minecraft/MinecraftProfile.cpp b/logic/minecraft/MinecraftProfile.cpp
index 1429e7b2..80021672 100644
--- a/logic/minecraft/MinecraftProfile.cpp
+++ b/logic/minecraft/MinecraftProfile.cpp
@@ -22,7 +22,7 @@
 
 #include "minecraft/MinecraftProfile.h"
 #include "ProfileUtils.h"
-#include "NullProfileStrategy.h"
+#include "ProfileStrategy.h"
 #include "Exception.h"
 
 MinecraftProfile::MinecraftProfile(ProfileStrategy *strategy)
diff --git a/logic/minecraft/NullProfileStrategy.h b/logic/minecraft/NullProfileStrategy.h
deleted file mode 100644
index 44a46060..00000000
--- a/logic/minecraft/NullProfileStrategy.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#pragma once
-
-#include "ProfileStrategy.h"
-
-class NullProfileStrategy: public ProfileStrategy
-{
-	virtual bool installJarMods(QStringList filepaths)
-	{
-		return false;
-	}
-	virtual void load() {};
-	virtual bool removePatch(ProfilePatchPtr jarMod)
-	{
-		return false;
-	}
-    virtual bool customizePatch(ProfilePatchPtr patch)
-	{
-		return false;
-	}
-	virtual bool revertPatch(ProfilePatchPtr patch)
-	{
-		return false;
-	}
-	virtual bool resetOrder()
-	{
-		return false;
-	}
-	virtual bool saveOrder(ProfileUtils::PatchOrder order)
-	{
-		return false;
-	}
-};
diff --git a/logic/minecraft/forge/ForgeInstaller.cpp b/logic/minecraft/forge/ForgeInstaller.cpp
index c42a8e18..9ed040de 100644
--- a/logic/minecraft/forge/ForgeInstaller.cpp
+++ b/logic/minecraft/forge/ForgeInstaller.cpp
@@ -23,6 +23,7 @@
 #include "minecraft/onesix/OneSixInstance.h"
 #include <minecraft/onesix/OneSixVersionFormat.h>
 #include "minecraft/VersionFilterData.h"
+#include "minecraft/MinecraftVersion.h"
 #include "Env.h"
 #include "Exception.h"
 #include <FileSystem.h>
@@ -44,7 +45,7 @@ ForgeInstaller::ForgeInstaller() : BaseInstaller()
 
 void ForgeInstaller::prepare(const QString &filename, const QString &universalUrl)
 {
-	std::shared_ptr<MinecraftProfile> newVersion;
+	VersionFilePtr newVersion;
 	m_universal_url = universalUrl;
 
 	QuaZip zip(filename);
@@ -75,11 +76,13 @@ void ForgeInstaller::prepare(const QString &filename, const QString &universalUr
 	if (!installVal.isObject() || !versionInfoVal.isObject())
 		return;
 
-	// read the forge version info
+	try
 	{
-		newVersion = OneSixVersionFormat::profileFromSingleJson(versionInfoVal.toObject());
-		if (!newVersion)
-			return;
+		newVersion = OneSixVersionFormat::versionFileFromJson(QJsonDocument(versionInfoVal.toObject()), QString(), false);
+	}
+	catch(Exception &err)
+	{
+		return;
 	}
 
 	QJsonObject installObj = installVal.toObject();
@@ -119,7 +122,6 @@ void ForgeInstaller::prepare(const QString &filename, const QString &universalUr
 	file.close();
 
 	m_forge_json = newVersion;
-	//m_forge_json->id = installObj.value("minecraft").toString();
 }
 
 bool ForgeInstaller::add(OneSixInstance *to)
@@ -129,130 +131,141 @@ bool ForgeInstaller::add(OneSixInstance *to)
 		return false;
 	}
 
-	QJsonObject obj;
-	obj.insert("order", 5);
-
 	if (!m_forge_json)
-		return false;
 	{
-		QJsonArray libraries;
-		// A blacklist
-		QSet<QString> blacklist{"authlib", "realms"};
-		//
-		QList<QString> xzlist{"org.scala-lang", "com.typesafe"};
-		// for each library in the version we are adding (except for the blacklisted)
-		for (auto lib : m_forge_json->getLibraries())
-		{
-			QString libName = lib->artifactId();
-			QString rawName = lib->rawName();
+		return false;
+	}
 
-			// ignore lwjgl libraries.
-			if (g_VersionFilterData.lwjglWhitelist.contains(lib->artifactPrefix()))
-				continue;
-			// ignore other blacklisted (realms, authlib)
-			if (blacklist.contains(libName))
-				continue;
+	// A blacklist
+	QSet<QString> blacklist{"authlib", "realms"};
+	QList<QString> xzlist{"org.scala-lang", "com.typesafe"};
 
-			// WARNING: This could actually break.
-			// if this is the actual forge lib, set an absolute url for the download
-			if (m_forge_version->type == ForgeVersion::Gradle)
-			{
-				if (libName == "forge")
-				{
-					lib->setClassifier("universal");
-				}
-				else if (libName == "minecraftforge")
-				{
-					QString forgeCoord("net.minecraftforge:forge:%1:universal");
-					// using insane form of the MC version...
-					QString longVersion =
-						m_forge_version->mcver + "-" + m_forge_version->jobbuildver;
-					GradleSpecifier spec(forgeCoord.arg(longVersion));
-					lib->setRawName(spec);
-				}
-			}
-			else
+	// get the minecraft version from the instance
+	VersionFilePtr minecraft;
+	auto minecraftPatch = to->getMinecraftProfile()->versionPatch("net.minecraft");
+	if(minecraftPatch)
+	{
+		minecraft = std::dynamic_pointer_cast<VersionFile>(minecraftPatch);
+		if(!minecraft)
+		{
+			auto mcWrap = std::dynamic_pointer_cast<MinecraftVersion>(minecraftPatch);
+			if(mcWrap)
 			{
-				if (libName.contains("minecraftforge"))
-				{
-					lib->setAbsoluteUrl(m_universal_url);
-				}
+				minecraft = mcWrap->getVersionFile();
 			}
+		}
+	}
 
-			// WARNING: This could actually break.
-			// mark bad libraries based on the xzlist above
-			for (auto entry : xzlist)
+	// for each library in the version we are adding (except for the blacklisted)
+	QMutableListIterator<LibraryPtr> iter(m_forge_json->libraries);
+	while (iter.hasNext())
+	{
+		auto library = iter.next();
+		QString libName = library->artifactId();
+		QString libVersion = library->version();
+		QString rawName = library->rawName();
+
+		// ignore lwjgl libraries.
+		if (g_VersionFilterData.lwjglWhitelist.contains(library->artifactPrefix()))
+		{
+			iter.remove();
+			continue;
+		}
+		// ignore other blacklisted (realms, authlib)
+		if (blacklist.contains(libName))
+		{
+			iter.remove();
+			continue;
+		}
+		// if minecraft version was found, ignore everything that is already in the minecraft version
+		if(minecraft)
+		{
+			bool found = false;
+			for (auto & lib: minecraft->libraries)
 			{
-				qDebug() << "Testing " << rawName << " : " << entry;
-				if (rawName.startsWith(entry))
+				if(library->artifactPrefix() == lib->artifactPrefix() && library->version() == lib->version())
 				{
-					lib->setHint("forge-pack-xz");
+					found = true;
 					break;
 				}
 			}
+			if (found)
+				continue;
+		}
 
-			QJsonObject libObj = OneSixVersionFormat::libraryToJson(lib.get());
-
-			// FIXME: use upstream Minecraft version files instead, not the processed profile!
-			/*
-			bool equals = false;
-			// find an entry that matches this one
-			for (auto tolib : to->getMinecraftProfile()->getVanillaLibraries())
+		// if this is the actual forge lib, set an absolute url for the download
+		if (m_forge_version->type == ForgeVersion::Gradle)
+		{
+			if (libName == "forge")
 			{
-				if (tolib->artifactId() != libName)
-					continue;
-				if (OneSixVersionFormat::libraryToJson(tolib.get()) == libObj)
-				{
-					equals = true;
-				}
-				break;
+				library->setClassifier("universal");
 			}
-			if (equals)
+			else if (libName == "minecraftforge")
 			{
-				continue;
+				QString forgeCoord("net.minecraftforge:forge:%1:universal");
+				// using insane form of the MC version...
+				QString longVersion = m_forge_version->mcver + "-" + m_forge_version->jobbuildver;
+				GradleSpecifier spec(forgeCoord.arg(longVersion));
+				library->setRawName(spec);
 			}
-			*/
-			libraries.append(libObj);
 		}
-		obj.insert("libraries", libraries);
-		obj.insert("mainClass", m_forge_json->getMainClass());
-		QString args = m_forge_json->getMinecraftArguments();
-		QStringList tweakers;
+		else
 		{
-			QRegularExpression expression("--tweakClass ([a-zA-Z0-9\\.]*)");
-			QRegularExpressionMatch match = expression.match(args);
-			while (match.hasMatch())
+			if (libName.contains("minecraftforge"))
 			{
-				tweakers.append(match.captured(1));
-				args.remove(match.capturedStart(), match.capturedLength());
-				match = expression.match(args);
+				library->setAbsoluteUrl(m_universal_url);
 			}
 		}
-		// FIXME: use upstream Minecraft version files instead, not the processed profile!
-		if (!args.isEmpty() /* && args != to->getMinecraftProfile()->getVanillaMinecraftArguments() */)
+
+		// mark bad libraries based on the xzlist above
+		for (auto entry : xzlist)
 		{
-			obj.insert("minecraftArguments", args);
+			qDebug() << "Testing " << rawName << " : " << entry;
+			if (rawName.startsWith(entry))
+			{
+				library->setHint("forge-pack-xz");
+				break;
+			}
 		}
-		if (!tweakers.isEmpty())
+	}
+	QString &args = m_forge_json->minecraftArguments;
+	QStringList tweakers;
+	{
+		QRegularExpression expression("--tweakClass ([a-zA-Z0-9\\.]*)");
+		QRegularExpressionMatch match = expression.match(args);
+		while (match.hasMatch())
 		{
-			obj.insert("+tweakers", QJsonArray::fromStringList(tweakers));
+			tweakers.append(match.captured(1));
+			args.remove(match.capturedStart(), match.capturedLength());
+			match = expression.match(args);
 		}
+		if(tweakers.size())
+		{
+			args.operator=(args.trimmed());
+			m_forge_json->addTweakers = tweakers;
+		}
+	}
+	if(minecraft && args == minecraft->minecraftArguments)
+	{
+		args.clear();
 	}
 
-	obj.insert("name", QString("Forge"));
-	obj.insert("fileId", id());
-	obj.insert("version", m_forgeVersionString);
-	obj.insert("mcVersion", to->intendedVersionId());
+	m_forge_json->name = "Forge";
+	m_forge_json->fileId = id();
+	m_forge_json->version = m_forgeVersionString;
+	m_forge_json->mcVersion = to->intendedVersionId();
+	m_forge_json->id.clear();
+	m_forge_json->order = 5;
 
-	QFile file(filename(to->instanceRoot()));
+	QSaveFile file(filename(to->instanceRoot()));
 	if (!file.open(QFile::WriteOnly))
 	{
 		qCritical() << "Error opening" << file.fileName()
 					 << "for reading:" << file.errorString();
 		return false;
 	}
-	file.write(QJsonDocument(obj).toJson());
-	file.close();
+	file.write(OneSixVersionFormat::profilePatchToJson(m_forge_json, true).toJson());
+	file.commit();
 
 	return true;
 }
diff --git a/logic/minecraft/forge/ForgeInstaller.h b/logic/minecraft/forge/ForgeInstaller.h
index 0de762b6..499a6fb3 100644
--- a/logic/minecraft/forge/ForgeInstaller.h
+++ b/logic/minecraft/forge/ForgeInstaller.h
@@ -22,7 +22,7 @@
 
 #include "multimc_logic_export.h"
 
-class MinecraftProfile;
+class VersionFile;
 class ForgeInstallTask;
 struct ForgeVersion;
 
@@ -42,7 +42,7 @@ protected:
 
 private:
 	// the parsed version json, read from the installer
-	std::shared_ptr<MinecraftProfile> m_forge_json;
+	std::shared_ptr<VersionFile> m_forge_json;
 	// the actual forge version
 	std::shared_ptr<ForgeVersion> m_forge_version;
 	QString internalPath;
diff --git a/logic/minecraft/onesix/OneSixVersionFormat.cpp b/logic/minecraft/onesix/OneSixVersionFormat.cpp
index d9aff535..e262cecd 100644
--- a/logic/minecraft/onesix/OneSixVersionFormat.cpp
+++ b/logic/minecraft/onesix/OneSixVersionFormat.cpp
@@ -1,5 +1,4 @@
 #include "OneSixVersionFormat.h"
-#include <minecraft/NullProfileStrategy.h>
 #include <Json.h>
 #include "minecraft/ParseUtils.h"
 #include <minecraft/MinecraftVersion.h>
@@ -283,23 +282,6 @@ QJsonDocument OneSixVersionFormat::profilePatchToJson(const ProfilePatchPtr &pat
 	throw VersionIncomplete(QObject::tr("Unhandled object type while processing %1").arg(patch->getName()));
 }
 
-std::shared_ptr<MinecraftProfile> OneSixVersionFormat::profileFromSingleJson(const QJsonObject &obj)
-{
-	std::shared_ptr<MinecraftProfile> version(new MinecraftProfile(new NullProfileStrategy()));
-	try
-	{
-		version->clear();
-		auto file = versionFileFromJson(QJsonDocument(obj), QString(), false);
-		file->applyTo(version.get());
-		version->appendPatch(file);
-	}
-	catch(Exception &err)
-	{
-		return nullptr;
-	}
-	return version;
-}
-
 JarmodPtr OneSixVersionFormat::jarModFromJson(const QJsonObject &libObj, const QString &filename, const QString &originalName)
 {
 	JarmodPtr out(new Jarmod());
diff --git a/logic/minecraft/onesix/OneSixVersionFormat.h b/logic/minecraft/onesix/OneSixVersionFormat.h
index 45a961e4..3011688c 100644
--- a/logic/minecraft/onesix/OneSixVersionFormat.h
+++ b/logic/minecraft/onesix/OneSixVersionFormat.h
@@ -8,9 +8,6 @@
 class OneSixVersionFormat
 {
 public:
-	// whole profiles from single file
-	static std::shared_ptr<MinecraftProfile> profileFromSingleJson(const QJsonObject &obj);
-
 	// version files / profile patches
 	static VersionFilePtr versionFileFromJson(const QJsonDocument &doc, const QString &filename, const bool requireOrder);
 	static QJsonDocument profilePatchToJson(const ProfilePatchPtr &patch, bool saveOrder);
-- 
cgit