summaryrefslogtreecommitdiffstats
path: root/api/logic/InstanceImportTask.cpp
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2017-04-20 05:22:04 +0200
committerPetr Mrázek <peterix@gmail.com>2017-04-20 05:22:04 +0200
commit6bd2605a79bec9267740f223c87d56d2263d98b8 (patch)
tree9ded863e6f84b52fd2c003e2dd1c22f19427658c /api/logic/InstanceImportTask.cpp
parente9a61995077eb15027cf3d044aa15a8cb67c13ae (diff)
downloadMultiMC-6bd2605a79bec9267740f223c87d56d2263d98b8.tar
MultiMC-6bd2605a79bec9267740f223c87d56d2263d98b8.tar.gz
MultiMC-6bd2605a79bec9267740f223c87d56d2263d98b8.tar.lz
MultiMC-6bd2605a79bec9267740f223c87d56d2263d98b8.tar.xz
MultiMC-6bd2605a79bec9267740f223c87d56d2263d98b8.zip
NOISSUE add import from curse zip packs
Does not actually grab mods, but resolves them and prints the results in logs.
Diffstat (limited to 'api/logic/InstanceImportTask.cpp')
-rw-r--r--api/logic/InstanceImportTask.cpp88
1 files changed, 77 insertions, 11 deletions
diff --git a/api/logic/InstanceImportTask.cpp b/api/logic/InstanceImportTask.cpp
index 23897778..1b44ec7a 100644
--- a/api/logic/InstanceImportTask.cpp
+++ b/api/logic/InstanceImportTask.cpp
@@ -1,3 +1,4 @@
+#include "minecraft/onesix/OneSixInstance.h"
#include "InstanceImportTask.h"
#include "BaseInstance.h"
@@ -9,6 +10,9 @@
#include "settings/INISettingsObject.h"
#include "icons/IIconList.h"
#include <QtConcurrentRun>
+#include "minecraft/curse/FileResolvingTask.h"
+#include "minecraft/curse/PackManifest.h"
+#include "Json.h"
InstanceImportTask::InstanceImportTask(SettingsObjectPtr settings, const QUrl sourceUrl, BaseInstanceProvider * target,
const QString &instName, const QString &instIcon, const QString &instGroup)
@@ -107,18 +111,87 @@ void InstanceImportTask::extractFinished()
}
QDir extractDir(m_stagingPath);
const QFileInfo instanceCfgFile = findRecursive(extractDir.absolutePath(), "instance.cfg");
- if (!instanceCfgFile.isFile() || !instanceCfgFile.exists())
+ const QFileInfo curseJson = findRecursive(extractDir.absolutePath(), "manifest.json");
+ if (instanceCfgFile.isFile())
+ {
+ processMultiMC(instanceCfgFile);
+ }
+ else if (curseJson.isFile())
+ {
+ processCurse(curseJson);
+ }
+ else
{
m_target->destroyStagingPath(m_stagingPath);
- emitFailed(tr("Archive does not contain instance.cfg"));
+ emitFailed(tr("Archive does not contain a recognized modpack type."));
+ }
+}
+
+void InstanceImportTask::extractAborted()
+{
+ m_target->destroyStagingPath(m_stagingPath);
+ emitFailed(tr("Instance import has been aborted."));
+ return;
+}
+
+void InstanceImportTask::processCurse(const QFileInfo & manifest)
+{
+ Curse::Manifest pack;
+ try
+ {
+ Curse::loadManifest(pack, manifest.absoluteFilePath());
+ }
+ catch (JSONValidationError & e)
+ {
+ emitFailed(tr("Could not understand curse manifest:\n") + e.cause());
return;
}
+ m_packRoot = manifest.absolutePath();
+ QString configPath = FS::PathCombine(m_packRoot, "instance.cfg");
+ auto instanceSettings = std::make_shared<INISettingsObject>(configPath);
+ instanceSettings->registerSetting("InstanceType", "Legacy");
+ instanceSettings->set("InstanceType", "OneSix");
+ OneSixInstance instance(m_globalSettings, instanceSettings, m_packRoot);
+ instance.setIntendedVersionId(pack.minecraft.version);
+ instance.setName(m_instName);
+ instance.setIconKey(m_instIcon);
+ m_curseResolver.reset(new Curse::FileResolvingTask(pack.files));
+ connect(m_curseResolver.get(), &Curse::FileResolvingTask::succeeded, this, &InstanceImportTask::curseResolvingSucceeded);
+ connect(m_curseResolver.get(), &Curse::FileResolvingTask::failed, this, &InstanceImportTask::curseResolvingFailed);
+ m_curseResolver->start();
+}
+void InstanceImportTask::curseResolvingFailed(QString reason)
+{
+ m_target->destroyStagingPath(m_stagingPath);
+ m_curseResolver.reset();
+ emitFailed(tr("Unable to resolve Curse mod IDs:\n") + reason);
+}
+
+void InstanceImportTask::curseResolvingSucceeded()
+{
+ auto results = m_curseResolver->getResults();
+ for(auto result: results)
+ {
+ qDebug() << result.fileName << " = " << result.url;
+ }
+ m_curseResolver.reset();
+ if (!m_target->commitStagedInstance(m_stagingPath, m_packRoot, m_instName, m_instGroup))
+ {
+ m_target->destroyStagingPath(m_stagingPath);
+ emitFailed(tr("Unable to commit instance"));
+ return;
+ }
+ emitSucceeded();
+}
+
+void InstanceImportTask::processMultiMC(const QFileInfo & config)
+{
// FIXME: copy from FolderInstanceProvider!!! FIX IT!!!
- auto instanceSettings = std::make_shared<INISettingsObject>(instanceCfgFile.absoluteFilePath());
+ auto instanceSettings = std::make_shared<INISettingsObject>(config.absoluteFilePath());
instanceSettings->registerSetting("InstanceType", "Legacy");
- QString actualDir = instanceCfgFile.absolutePath();
+ QString actualDir = config.absolutePath();
NullInstance instance(m_globalSettings, instanceSettings, actualDir);
// reset time played on import... because packs.
@@ -155,10 +228,3 @@ void InstanceImportTask::extractFinished()
}
emitSucceeded();
}
-
-void InstanceImportTask::extractAborted()
-{
- m_target->destroyStagingPath(m_stagingPath);
- emitFailed(tr("Instance import has been aborted."));
- return;
-}