From ba3cbb7330fd3435423eb3a77373ca82d65681d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 20 Sep 2017 23:38:31 +0200 Subject: NOISSUE more work on Legacy migration --- api/logic/minecraft/MinecraftInstance.h | 6 +++ api/logic/minecraft/legacy/LegacyInstance.cpp | 9 ++++ api/logic/minecraft/legacy/LegacyInstance.h | 11 +++++ api/logic/minecraft/legacy/LegacyMigrationTask.cpp | 51 ++++++++++++++++++++++ api/logic/minecraft/legacy/LegacyMigrationTask.h | 37 ++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 api/logic/minecraft/legacy/LegacyMigrationTask.cpp create mode 100644 api/logic/minecraft/legacy/LegacyMigrationTask.h (limited to 'api/logic/minecraft') diff --git a/api/logic/minecraft/MinecraftInstance.h b/api/logic/minecraft/MinecraftInstance.h index ebb22eb1..e172edb4 100644 --- a/api/logic/minecraft/MinecraftInstance.h +++ b/api/logic/minecraft/MinecraftInstance.h @@ -21,6 +21,12 @@ public: QString typeName() const override; QSet traits() override; + + bool canEdit() const override + { + return true; + } + bool canExport() const override { return true; diff --git a/api/logic/minecraft/legacy/LegacyInstance.cpp b/api/logic/minecraft/legacy/LegacyInstance.cpp index 532e8307..95cc4689 100644 --- a/api/logic/minecraft/legacy/LegacyInstance.cpp +++ b/api/logic/minecraft/legacy/LegacyInstance.cpp @@ -272,6 +272,15 @@ QString LegacyInstance::defaultCustomBaseJar() const return FS::PathCombine(binRoot(), "mcbackup.jar"); } +std::shared_ptr LegacyInstance::worldList() const +{ + if (!m_world_list) + { + m_world_list.reset(new WorldList(savesDir())); + } + return m_world_list; +} + QString LegacyInstance::typeName() const { return tr("Legacy"); diff --git a/api/logic/minecraft/legacy/LegacyInstance.h b/api/logic/minecraft/legacy/LegacyInstance.h index 9c5cedd3..5f67cddb 100644 --- a/api/logic/minecraft/legacy/LegacyInstance.h +++ b/api/logic/minecraft/legacy/LegacyInstance.h @@ -22,6 +22,7 @@ class ModList; class LegacyModList; +class WorldList; class Task; /* * WHY: Legacy instances - from MultiMC 3 and 4 - are here only to provide a way to upgrade them to the current format. @@ -74,6 +75,7 @@ public: std::shared_ptr jarModList() const; QList getJarMods() const; + std::shared_ptr worldList() const; /*! * Whether or not the instance's minecraft.jar needs to be rebuilt. @@ -95,6 +97,14 @@ public: virtual QString typeName() const override; + bool canLaunch() const override + { + return false; + } + bool canEdit() const override + { + return true; + } bool canExport() const override { return false; @@ -125,4 +135,5 @@ public: } protected: mutable std::shared_ptr jar_mod_list; + mutable std::shared_ptr m_world_list; }; diff --git a/api/logic/minecraft/legacy/LegacyMigrationTask.cpp b/api/logic/minecraft/legacy/LegacyMigrationTask.cpp new file mode 100644 index 00000000..0d3cef35 --- /dev/null +++ b/api/logic/minecraft/legacy/LegacyMigrationTask.cpp @@ -0,0 +1,51 @@ +#include "LegacyMigrationTask.h" +#include "BaseInstanceProvider.h" +#include "settings/INISettingsObject.h" +#include "FileSystem.h" +#include "NullInstance.h" +#include "pathmatcher/RegexpMatcher.h" +#include + +LegacyMigrationTask::LegacyMigrationTask(SettingsObjectPtr settings, const QString & stagingPath, InstancePtr origInstance) +{ + m_globalSettings = settings; + m_stagingPath = stagingPath; + m_origInstance = origInstance; +} + +void LegacyMigrationTask::executeTask() +{ + setStatus(tr("Copying instance %1").arg(m_origInstance->name())); + + FS::copy folderCopy(m_origInstance->instanceRoot(), m_stagingPath); + folderCopy.followSymlinks(true); + + m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), folderCopy); + connect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &LegacyMigrationTask::copyFinished); + connect(&m_copyFutureWatcher, &QFutureWatcher::canceled, this, &LegacyMigrationTask::copyAborted); + m_copyFutureWatcher.setFuture(m_copyFuture); +} + +void LegacyMigrationTask::copyFinished() +{ + auto successful = m_copyFuture.result(); + if(!successful) + { + emitFailed(tr("Instance folder copy failed.")); + return; + } + // FIXME: shouldn't this be able to report errors? + auto instanceSettings = std::make_shared(FS::PathCombine(m_stagingPath, "instance.cfg")); + instanceSettings->registerSetting("InstanceType", "Legacy"); + + InstancePtr inst(new NullInstance(m_globalSettings, instanceSettings, m_stagingPath)); + inst->setName(tr("%1 (Migrated)").arg(m_origInstance->name())); + emitSucceeded(); +} + +void LegacyMigrationTask::copyAborted() +{ + emitFailed(tr("Instance folder copy has been aborted.")); + return; +} + diff --git a/api/logic/minecraft/legacy/LegacyMigrationTask.h b/api/logic/minecraft/legacy/LegacyMigrationTask.h new file mode 100644 index 00000000..36cfa240 --- /dev/null +++ b/api/logic/minecraft/legacy/LegacyMigrationTask.h @@ -0,0 +1,37 @@ +#pragma once + +#include "tasks/Task.h" +#include "multimc_logic_export.h" +#include "net/NetJob.h" +#include +#include +#include +#include "settings/SettingsObject.h" +#include "BaseVersion.h" +#include "BaseInstance.h" + + +class BaseInstanceProvider; + +class MULTIMC_LOGIC_EXPORT LegacyMigrationTask : public Task +{ + Q_OBJECT +public: + explicit LegacyMigrationTask(SettingsObjectPtr settings, const QString & stagingPath, InstancePtr origInstance); + +protected: + //! Entry point for tasks. + virtual void executeTask() override; + void copyFinished(); + void copyAborted(); + +private: /* data */ + SettingsObjectPtr m_globalSettings; + InstancePtr m_origInstance; + QString m_stagingPath; + QFuture m_copyFuture; + QFutureWatcher m_copyFutureWatcher; +}; + + + -- cgit v1.2.3