summaryrefslogtreecommitdiffstats
path: root/api/logic
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2017-03-19 02:13:49 +0100
committerPetr Mrázek <peterix@gmail.com>2017-04-07 00:20:02 +0200
commit2660418d58efb33cd3a0ab8ed9d48c359c076905 (patch)
tree0f947fea5c1dc59a2db83bab85e3fecbc19e4c5c /api/logic
parente46aba9da584338db8d8a1a8a487bdcc6cf84343 (diff)
downloadMultiMC-2660418d58efb33cd3a0ab8ed9d48c359c076905.tar
MultiMC-2660418d58efb33cd3a0ab8ed9d48c359c076905.tar.gz
MultiMC-2660418d58efb33cd3a0ab8ed9d48c359c076905.tar.lz
MultiMC-2660418d58efb33cd3a0ab8ed9d48c359c076905.tar.xz
MultiMC-2660418d58efb33cd3a0ab8ed9d48c359c076905.zip
NOISSUE hack it together enough to get launching back
Meta index will now always return valid objects. They just might never load if they don't exist on the server.
Diffstat (limited to 'api/logic')
-rw-r--r--api/logic/meta/BaseEntity.cpp9
-rw-r--r--api/logic/meta/BaseEntity.h1
-rw-r--r--api/logic/meta/Index.cpp14
-rw-r--r--api/logic/meta/Index.h1
-rw-r--r--api/logic/meta/Version.cpp35
-rw-r--r--api/logic/meta/Version.h84
-rw-r--r--api/logic/meta/VersionList.cpp14
-rw-r--r--api/logic/meta/VersionList.h3
-rw-r--r--api/logic/minecraft/ProfilePatch.h4
-rw-r--r--api/logic/minecraft/onesix/OneSixProfileStrategy.cpp6
-rw-r--r--api/logic/minecraft/onesix/OneSixUpdate.cpp48
11 files changed, 161 insertions, 58 deletions
diff --git a/api/logic/meta/BaseEntity.cpp b/api/logic/meta/BaseEntity.cpp
index 18b7f92f..809f88cb 100644
--- a/api/logic/meta/BaseEntity.cpp
+++ b/api/logic/meta/BaseEntity.cpp
@@ -137,4 +137,13 @@ void Meta::BaseEntity::load()
m_updateTask->start();
}
+shared_qobject_ptr<Task> Meta::BaseEntity::getCurrentTask()
+{
+ if(m_updateStatus == UpdateStatus::InProgress)
+ {
+ return m_updateTask;
+ }
+ return nullptr;
+}
+
#include "BaseEntity.moc"
diff --git a/api/logic/meta/BaseEntity.h b/api/logic/meta/BaseEntity.h
index 92a39272..85051d97 100644
--- a/api/logic/meta/BaseEntity.h
+++ b/api/logic/meta/BaseEntity.h
@@ -61,6 +61,7 @@ public:
}
void load();
+ shared_qobject_ptr<Task> getCurrentTask();
protected: /* methods */
bool loadLocalFile();
diff --git a/api/logic/meta/Index.cpp b/api/logic/meta/Index.cpp
index 35b9fb6f..0749651a 100644
--- a/api/logic/meta/Index.cpp
+++ b/api/logic/meta/Index.cpp
@@ -83,17 +83,19 @@ bool Index::hasUid(const QString &uid) const
VersionListPtr Index::get(const QString &uid)
{
- return m_uids.value(uid, nullptr);
+ VersionListPtr out = m_uids.value(uid, nullptr);
+ if(!out)
+ {
+ out = std::make_shared<VersionList>(uid);
+ m_uids[uid] = out;
+ }
+ return out;
}
VersionPtr Index::get(const QString &uid, const QString &version)
{
auto list = get(uid);
- if(list)
- {
- return list->getVersion(version);
- }
- return nullptr;
+ return list->getVersion(version);
}
void Index::parse(const QJsonObject& obj)
diff --git a/api/logic/meta/Index.h b/api/logic/meta/Index.h
index 544a8b96..9811e152 100644
--- a/api/logic/meta/Index.h
+++ b/api/logic/meta/Index.h
@@ -68,3 +68,4 @@ private:
void connectVersionList(const int row, const VersionListPtr &list);
};
}
+
diff --git a/api/logic/meta/Version.cpp b/api/logic/meta/Version.cpp
index f8c865e7..2790b2f3 100644
--- a/api/logic/meta/Version.cpp
+++ b/api/logic/meta/Version.cpp
@@ -18,38 +18,45 @@
#include <QDateTime>
#include "JsonFormat.h"
+#include "minecraft/MinecraftProfile.h"
-namespace Meta
+void Meta::Version::applyTo(MinecraftProfile* profile)
{
-Version::Version(const QString &uid, const QString &version)
+ if(m_data)
+ {
+ m_data->applyTo(profile);
+ }
+}
+
+Meta::Version::Version(const QString &uid, const QString &version)
: BaseVersion(), m_uid(uid), m_version(version)
{
}
-QString Version::descriptor()
+QString Meta::Version::descriptor()
{
return m_version;
}
-QString Version::name()
+QString Meta::Version::name()
{
return m_version;
}
-QString Version::typeString() const
+QString Meta::Version::typeString() const
{
return m_type;
}
-QDateTime Version::time() const
+QDateTime Meta::Version::time() const
{
return QDateTime::fromMSecsSinceEpoch(m_time * 1000, Qt::UTC);
}
-void Version::parse(const QJsonObject& obj)
+void Meta::Version::parse(const QJsonObject& obj)
{
parseVersion(obj, this);
}
-void Version::merge(const std::shared_ptr<BaseEntity> &other)
+void Meta::Version::merge(const std::shared_ptr<BaseEntity> &other)
{
VersionPtr version = std::dynamic_pointer_cast<Version>(other);
if (m_type != version->m_type)
@@ -68,28 +75,28 @@ void Version::merge(const std::shared_ptr<BaseEntity> &other)
setData(version->m_data);
}
-QString Version::localFilename() const
+QString Meta::Version::localFilename() const
{
return m_uid + '/' + m_version + ".json";
}
-void Version::setType(const QString &type)
+void Meta::Version::setType(const QString &type)
{
m_type = type;
emit typeChanged();
}
-void Version::setTime(const qint64 time)
+void Meta::Version::setTime(const qint64 time)
{
m_time = time;
emit timeChanged();
}
-void Version::setRequires(const QVector<Reference> &requires)
+void Meta::Version::setRequires(const QVector<Reference> &requires)
{
m_requires = requires;
emit requiresChanged();
}
-void Version::setData(const VersionFilePtr &data)
+void Meta::Version::setData(const VersionFilePtr &data)
{
m_data = data;
}
-}
+
diff --git a/api/logic/meta/Version.h b/api/logic/meta/Version.h
index 0be2d94a..b8ea7e44 100644
--- a/api/logic/meta/Version.h
+++ b/api/logic/meta/Version.h
@@ -33,7 +33,7 @@ namespace Meta
{
using VersionPtr = std::shared_ptr<class Version>;
-class MULTIMC_LOGIC_EXPORT Version : public QObject, public BaseVersion, public BaseEntity
+class MULTIMC_LOGIC_EXPORT Version : public QObject, public BaseVersion, public BaseEntity, public ProfilePatch
{
Q_OBJECT
Q_PROPERTY(QString uid READ uid CONSTANT)
@@ -41,9 +41,89 @@ class MULTIMC_LOGIC_EXPORT Version : public QObject, public BaseVersion, public
Q_PROPERTY(QString type READ type NOTIFY typeChanged)
Q_PROPERTY(QDateTime time READ time NOTIFY timeChanged)
Q_PROPERTY(QVector<Reference> requires READ requires NOTIFY requiresChanged)
-public:
+
+public: /* con/des */
explicit Version(const QString &uid, const QString &version);
+// FIXME: none of this belongs here...
+public: /* ProfilePatch overrides */
+ QString getFilename() override
+ {
+ return QString();
+ }
+ QString getID() override
+ {
+ return m_uid;
+ }
+ QList<JarmodPtr> getJarMods() override
+ {
+ return {};
+ }
+ QString getName() override
+ {
+ return name();
+ }
+ QDateTime getReleaseDateTime() override
+ {
+ return time();
+ }
+ QString getVersion() override
+ {
+ return m_version;
+ }
+ std::shared_ptr<class VersionFile> getVersionFile() override
+ {
+ return m_data;
+ }
+ int getOrder() override
+ {
+ return 0;
+ }
+ VersionSource getVersionSource() override
+ {
+ return VersionSource::Local;
+ }
+ bool isVersionChangeable() override
+ {
+ return true;
+ }
+ bool isRevertible() override
+ {
+ return false;
+ }
+ bool isRemovable() override
+ {
+ return true;
+ }
+ bool isCustom() override
+ {
+ return false;
+ }
+ bool isCustomizable() override
+ {
+ return true;
+ }
+ bool isMoveable() override
+ {
+ return true;
+ }
+ bool isEditable() override
+ {
+ return false;
+ }
+ void setOrder(int) override
+ {
+ }
+ bool hasJarMods() override
+ {
+ return false;
+ }
+ bool isMinecraftVersion() override
+ {
+ return m_uid == "net.minecraft";
+ }
+ void applyTo(MinecraftProfile * profile) override;
+
QString descriptor() override;
QString name() override;
QString typeString() const override;
diff --git a/api/logic/meta/VersionList.cpp b/api/logic/meta/VersionList.cpp
index a12f5418..d6bbf70f 100644
--- a/api/logic/meta/VersionList.cpp
+++ b/api/logic/meta/VersionList.cpp
@@ -125,13 +125,15 @@ QString VersionList::humanReadable() const
return m_name.isEmpty() ? m_uid : m_name;
}
-bool VersionList::hasVersion(const QString &version) const
+VersionPtr VersionList::getVersion(const QString &version)
{
- return m_lookup.contains(version);
-}
-VersionPtr VersionList::getVersion(const QString &version) const
-{
- return m_lookup.value(version);
+ VersionPtr out = m_lookup.value(version, nullptr);
+ if(!out)
+ {
+ out = std::make_shared<Version>(m_uid, version);
+ m_lookup[version] = out;
+ }
+ return out;
}
void VersionList::setName(const QString &name)
diff --git a/api/logic/meta/VersionList.h b/api/logic/meta/VersionList.h
index e958475e..26fa6c5a 100644
--- a/api/logic/meta/VersionList.h
+++ b/api/logic/meta/VersionList.h
@@ -60,8 +60,7 @@ public:
QString name() const { return m_name; }
QString humanReadable() const;
- bool hasVersion(const QString &version) const;
- VersionPtr getVersion(const QString &version) const;
+ VersionPtr getVersion(const QString &version);
QVector<VersionPtr> versions() const { return m_versions; }
diff --git a/api/logic/minecraft/ProfilePatch.h b/api/logic/minecraft/ProfilePatch.h
index 26230092..b61fb8b3 100644
--- a/api/logic/minecraft/ProfilePatch.h
+++ b/api/logic/minecraft/ProfilePatch.h
@@ -92,10 +92,6 @@ public:
{
return m_problemSeverity;
}
- virtual bool hasFailed()
- {
- return getProblemSeverity() == PROBLEM_ERROR;
- }
protected:
QList<PatchProblem> m_problems;
diff --git a/api/logic/minecraft/onesix/OneSixProfileStrategy.cpp b/api/logic/minecraft/onesix/OneSixProfileStrategy.cpp
index e3d3f674..b19a2dea 100644
--- a/api/logic/minecraft/onesix/OneSixProfileStrategy.cpp
+++ b/api/logic/minecraft/onesix/OneSixProfileStrategy.cpp
@@ -12,6 +12,8 @@
#include <QJsonArray>
#include <QSaveFile>
#include <QResource>
+#include <meta/Index.h>
+#include <meta/Version.h>
OneSixProfileStrategy::OneSixProfileStrategy(OneSixInstance* instance)
{
@@ -98,7 +100,7 @@ void OneSixProfileStrategy::loadDefaultBuiltinPatches()
}
else
{
- auto mcversion = ENV.getVersion("net.minecraft", m_instance->intendedVersionId());
+ auto mcversion = ENV.metadataIndex()->get("net.minecraft", m_instance->intendedVersionId());
minecraftPatch = std::dynamic_pointer_cast<ProfilePatch>(mcversion);
}
if (!minecraftPatch)
@@ -121,7 +123,7 @@ void OneSixProfileStrategy::loadDefaultBuiltinPatches()
}
else
{
- auto lwjglversion = ENV.getVersion("org.lwjgl", "2.9.1" /*m_instance->intendedVersionId()*/);
+ auto lwjglversion = ENV.metadataIndex()->get("org.lwjgl", "2.9.1");
lwjglPatch = std::dynamic_pointer_cast<ProfilePatch>(lwjglversion);
}
if (!lwjglPatch)
diff --git a/api/logic/minecraft/onesix/OneSixUpdate.cpp b/api/logic/minecraft/onesix/OneSixUpdate.cpp
index ec40e086..5bc76b01 100644
--- a/api/logic/minecraft/onesix/OneSixUpdate.cpp
+++ b/api/logic/minecraft/onesix/OneSixUpdate.cpp
@@ -34,6 +34,9 @@
#include "update/FMLLibrariesTask.h"
#include "update/AssetUpdateTask.h"
+#include <meta/Index.h>
+#include <meta/Version.h>
+
OneSixUpdate::OneSixUpdate(OneSixInstance *inst, QObject *parent) : Task(parent), m_inst(inst)
{
// create folders
@@ -44,30 +47,22 @@ OneSixUpdate::OneSixUpdate(OneSixInstance *inst, QObject *parent) : Task(parent)
// add a version update task, if necessary
{
/*
- auto list = std::dynamic_pointer_cast<MinecraftVersionList>(ENV.getVersionList("net.minecraft"));
- auto version = std::dynamic_pointer_cast<MinecraftVersion>(list->findVersion(m_inst->intendedVersionId()));
- if (version == nullptr)
- {
- // don't do anything if it was invalid
- m_preFailure = tr("The specified Minecraft version is invalid. Choose a different one.");
- }
- else if (m_inst->providesVersionFile() || !version->needsUpdate())
+ * FIXME: there are some corner cases here that remain unhandled:
+ * what if local load succeeds but remote fails? The version is still usable...
+ */
+ // FIXME: derive this from the actual list of version patches...
+ auto loadVersion = [&](const QString & uid, const QString & version)
{
- qDebug() << "Instance either provides a version file or doesn't need an update.";
- }
- else
- {
- auto versionUpdateTask = list->createUpdateTask(m_inst->intendedVersionId());
- if (!versionUpdateTask)
- {
- qDebug() << "Didn't spawn an update task.";
- }
- else
+ auto obj = ENV.metadataIndex()->get(uid, version);
+ obj->load();
+ auto task = obj->getCurrentTask();
+ if(task)
{
- m_tasks.append(versionUpdateTask);
+ m_tasks.append(task.unwrap());
}
- }
- */
+ };
+ loadVersion("org.lwjgl", "2.9.1");
+ loadVersion("net.minecraft", m_inst->intendedVersionId());
}
// libraries download
@@ -118,11 +113,20 @@ void OneSixUpdate::next()
return;
}
auto task = m_tasks[m_currentTask];
+ // if the task is already finished by the time we look at it, skip it
+ if(task->isFinished())
+ {
+ next();
+ }
connect(task.get(), &Task::succeeded, this, &OneSixUpdate::subtaskSucceeded);
connect(task.get(), &Task::failed, this, &OneSixUpdate::subtaskFailed);
connect(task.get(), &Task::progress, this, &OneSixUpdate::progress);
connect(task.get(), &Task::status, this, &OneSixUpdate::setStatus);
- task->start();
+ // if the task is already running, do not start it again
+ if(!task->isRunning())
+ {
+ task->start();
+ }
}
void OneSixUpdate::subtaskSucceeded()