aboutsummaryrefslogtreecommitdiff
path: root/api/logic
diff options
context:
space:
mode:
Diffstat (limited to 'api/logic')
-rw-r--r--api/logic/BaseInstance.cpp1
-rw-r--r--api/logic/CMakeLists.txt4
-rw-r--r--api/logic/InstanceCreationTask.cpp4
-rw-r--r--api/logic/minecraft/MinecraftInstance.cpp3
-rw-r--r--api/logic/minecraft/MinecraftVersion.cpp230
-rw-r--r--api/logic/minecraft/MinecraftVersion.h132
-rw-r--r--api/logic/minecraft/MinecraftVersionList.cpp614
-rw-r--r--api/logic/minecraft/MinecraftVersionList.h72
-rw-r--r--api/logic/minecraft/MojangVersionFormat.cpp1
-rw-r--r--api/logic/minecraft/forge/ForgeInstaller.cpp9
-rw-r--r--api/logic/minecraft/ftb/FTBInstanceProvider.cpp14
-rw-r--r--api/logic/minecraft/ftb/FTBPlugin.cpp2
-rw-r--r--api/logic/minecraft/ftb/FTBProfileStrategy.cpp1
-rw-r--r--api/logic/minecraft/ftb/FTBVersion.h32
-rw-r--r--api/logic/minecraft/legacy/LegacyUpdate.cpp1
-rw-r--r--api/logic/minecraft/onesix/OneSixProfileStrategy.cpp3
-rw-r--r--api/logic/minecraft/onesix/OneSixUpdate.cpp3
-rw-r--r--api/logic/minecraft/onesix/OneSixVersionFormat.cpp1
18 files changed, 18 insertions, 1109 deletions
diff --git a/api/logic/BaseInstance.cpp b/api/logic/BaseInstance.cpp
index 6d719c32..ee9e919d 100644
--- a/api/logic/BaseInstance.cpp
+++ b/api/logic/BaseInstance.cpp
@@ -23,7 +23,6 @@
#include "settings/Setting.h"
#include "settings/OverrideSetting.h"
-#include "minecraft/MinecraftVersionList.h"
#include "FileSystem.h"
#include "Commandline.h"
diff --git a/api/logic/CMakeLists.txt b/api/logic/CMakeLists.txt
index 1827b497..f14b8662 100644
--- a/api/logic/CMakeLists.txt
+++ b/api/logic/CMakeLists.txt
@@ -252,10 +252,6 @@ set(MINECRAFT_SOURCES
minecraft/JarMod.h
minecraft/MinecraftInstance.cpp
minecraft/MinecraftInstance.h
- minecraft/MinecraftVersion.cpp
- minecraft/MinecraftVersion.h
- minecraft/MinecraftVersionList.cpp
- minecraft/MinecraftVersionList.h
minecraft/Rule.cpp
minecraft/Rule.h
minecraft/OpSys.cpp
diff --git a/api/logic/InstanceCreationTask.cpp b/api/logic/InstanceCreationTask.cpp
index 00156701..e7b0de7c 100644
--- a/api/logic/InstanceCreationTask.cpp
+++ b/api/logic/InstanceCreationTask.cpp
@@ -4,7 +4,6 @@
#include "FileSystem.h"
//FIXME: remove this
-#include "minecraft/MinecraftVersion.h"
#include "minecraft/onesix/OneSixInstance.h"
InstanceCreationTask::InstanceCreationTask(SettingsObjectPtr settings, BaseInstanceProvider* target, BaseVersionPtr version,
@@ -21,12 +20,14 @@ InstanceCreationTask::InstanceCreationTask(SettingsObjectPtr settings, BaseInsta
void InstanceCreationTask::executeTask()
{
setStatus(tr("Creating instance from version %1").arg(m_version->name()));
+ /*
auto minecraftVersion = std::dynamic_pointer_cast<MinecraftVersion>(m_version);
if(!minecraftVersion)
{
emitFailed(tr("The supplied version is not a Minecraft version."));
return ;
}
+ */
QString stagingPath = m_target->getStagedInstancePath();
QDir rootDir(stagingPath);
@@ -34,7 +35,6 @@ void InstanceCreationTask::executeTask()
auto instanceSettings = std::make_shared<INISettingsObject>(FS::PathCombine(stagingPath, "instance.cfg"));
instanceSettings->registerSetting("InstanceType", "Legacy");
- auto mcVer = std::dynamic_pointer_cast<MinecraftVersion>(m_version);
instanceSettings->set("InstanceType", "OneSix");
InstancePtr inst(new OneSixInstance(m_globalSettings, instanceSettings, stagingPath));
inst->setIntendedVersionId(m_version->descriptor());
diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp
index 7b1aef1e..b88d0c2a 100644
--- a/api/logic/minecraft/MinecraftInstance.cpp
+++ b/api/logic/minecraft/MinecraftInstance.cpp
@@ -5,7 +5,6 @@
#include <settings/Setting.h>
#include "settings/SettingsObject.h"
#include "Env.h"
-#include "minecraft/MinecraftVersionList.h"
#include <MMCStrings.h>
#include <pathmatcher/RegexpMatcher.h>
#include <pathmatcher/MultiMatcher.h>
@@ -24,6 +23,8 @@
#include <icons/IIconList.h>
+#include <QCoreApplication>
+
#define IBUS "@im=ibus"
// all of this because keeping things compatible with deprecated old settings
diff --git a/api/logic/minecraft/MinecraftVersion.cpp b/api/logic/minecraft/MinecraftVersion.cpp
deleted file mode 100644
index 248c7eed..00000000
--- a/api/logic/minecraft/MinecraftVersion.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-#include "MinecraftVersion.h"
-#include "MinecraftProfile.h"
-#include "VersionBuildError.h"
-#include "ProfileUtils.h"
-#include "settings/SettingsObject.h"
-
-bool MinecraftVersion::usesLegacyLauncher()
-{
- return m_traits.contains("legacyLaunch") || m_traits.contains("aplhaLaunch");
-}
-
-QString MinecraftVersion::descriptor()
-{
- return m_descriptor;
-}
-
-QString MinecraftVersion::name()
-{
- return m_name;
-}
-
-QString MinecraftVersion::typeString() const
-{
- if(m_type == "snapshot")
- {
- return QObject::tr("Snapshot");
- }
- else if (m_type == "release")
- {
- return QObject::tr("Regular release");
- }
- else if (m_type == "old_alpha")
- {
- return QObject::tr("Alpha");
- }
- else if (m_type == "old_beta")
- {
- return QObject::tr("Beta");
- }
- else
- {
- return QString();
- }
-}
-
-VersionSource MinecraftVersion::getVersionSource()
-{
- return m_versionSource;
-}
-
-bool MinecraftVersion::hasJarMods()
-{
- return false;
-}
-
-bool MinecraftVersion::isMinecraftVersion()
-{
- return true;
-}
-
-void MinecraftVersion::applyFileTo(MinecraftProfile *profile)
-{
- if(m_versionSource == VersionSource::Local && getVersionFile())
- {
- getVersionFile()->applyTo(profile);
- }
- else
- {
- throw VersionIncomplete(QObject::tr("Can't apply incomplete/builtin Minecraft version %1").arg(m_name));
- }
-}
-
-QString MinecraftVersion::getUrl() const
-{
- // legacy fallback
- if(m_versionFileURL.isEmpty())
- {
- return QString("http://") + URLConstants::AWS_DOWNLOAD_VERSIONS + m_descriptor + "/" + m_descriptor + ".json";
- }
- // current
- return m_versionFileURL;
-}
-
-VersionFilePtr MinecraftVersion::getVersionFile()
-{
- QFileInfo versionFile(QString("versions/%1/%1.dat").arg(m_descriptor));
- m_problems.clear();
- m_problemSeverity = PROBLEM_NONE;
- if(!versionFile.exists())
- {
- if(m_loadedVersionFile)
- {
- m_loadedVersionFile.reset();
- }
- addProblem(PROBLEM_WARNING, QObject::tr("The patch file doesn't exist locally. It's possible it just needs to be downloaded."));
- }
- else
- {
- try
- {
- if(versionFile.lastModified() != m_loadedVersionFileTimestamp)
- {
- auto loadedVersionFile = ProfileUtils::parseBinaryJsonFile(versionFile);
- loadedVersionFile->name = "Minecraft";
- loadedVersionFile->setCustomizable(true);
- m_loadedVersionFileTimestamp = versionFile.lastModified();
- m_loadedVersionFile = loadedVersionFile;
- }
- }
- catch(Exception e)
- {
- m_loadedVersionFile.reset();
- addProblem(PROBLEM_ERROR, QObject::tr("The patch file couldn't be read:\n%1").arg(e.cause()));
- }
- }
- return m_loadedVersionFile;
-}
-
-bool MinecraftVersion::isCustomizable()
-{
- switch(m_versionSource)
- {
- case VersionSource::Local:
- case VersionSource::Remote:
- // locally cached file, or a remote file that we can acquire can be customized
- return true;
- case VersionSource::Builtin:
- // builtins do not follow the normal OneSix format. They are not customizable.
- default:
- // Everything else is undefined and therefore not customizable.
- return false;
- }
- return false;
-}
-
-const QList<PatchProblem> &MinecraftVersion::getProblems()
-{
- if(m_versionSource != VersionSource::Builtin && getVersionFile())
- {
- return getVersionFile()->getProblems();
- }
- return ProfilePatch::getProblems();
-}
-
-ProblemSeverity MinecraftVersion::getProblemSeverity()
-{
- if(m_versionSource != VersionSource::Builtin && getVersionFile())
- {
- return getVersionFile()->getProblemSeverity();
- }
- return ProfilePatch::getProblemSeverity();
-}
-
-void MinecraftVersion::applyTo(MinecraftProfile *profile)
-{
- // do we have this one cached?
- if (m_versionSource == VersionSource::Local)
- {
- applyFileTo(profile);
- return;
- }
- // if not builtin, do not proceed any further.
- if (m_versionSource != VersionSource::Builtin)
- {
- throw VersionIncomplete(QObject::tr(
- "Minecraft version %1 could not be applied: version files are missing.").arg(m_descriptor));
- }
- profile->applyMinecraftVersion(m_descriptor);
- profile->applyMainClass(m_mainClass);
- profile->applyAppletClass(m_appletClass);
- profile->applyMinecraftArguments(" ${auth_player_name} ${auth_session}"); // all builtin versions are legacy
- profile->applyMinecraftVersionType(m_type);
- profile->applyTraits(m_traits);
- profile->applyProblemSeverity(m_problemSeverity);
-}
-
-int MinecraftVersion::getOrder()
-{
- return order;
-}
-
-void MinecraftVersion::setOrder(int order)
-{
- this->order = order;
-}
-
-QList<JarmodPtr> MinecraftVersion::getJarMods()
-{
- return QList<JarmodPtr>();
-}
-
-QString MinecraftVersion::getName()
-{
- return "Minecraft";
-}
-QString MinecraftVersion::getVersion()
-{
- return m_descriptor;
-}
-QString MinecraftVersion::getID()
-{
- return "net.minecraft";
-}
-QString MinecraftVersion::getFilename()
-{
- return QString();
-}
-QDateTime MinecraftVersion::getReleaseDateTime()
-{
- return m_releaseTime;
-}
-
-
-bool MinecraftVersion::needsUpdate()
-{
- return m_versionSource == VersionSource::Remote || hasUpdate();
-}
-
-bool MinecraftVersion::hasUpdate()
-{
- return m_versionSource == VersionSource::Remote || (m_versionSource == VersionSource::Local && upstreamUpdate);
-}
-
-bool MinecraftVersion::isCustom()
-{
- // if we add any other source types, this will evaluate to false for them.
- return m_versionSource != VersionSource::Builtin
- && m_versionSource != VersionSource::Local
- && m_versionSource != VersionSource::Remote;
-}
diff --git a/api/logic/minecraft/MinecraftVersion.h b/api/logic/minecraft/MinecraftVersion.h
deleted file mode 100644
index 7ac9bcbb..00000000
--- a/api/logic/minecraft/MinecraftVersion.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Copyright 2013-2017 MultiMC Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <QStringList>
-#include <QSet>
-#include <QDateTime>
-
-#include "BaseVersion.h"
-#include "ProfilePatch.h"
-#include "VersionFile.h"
-
-#include "multimc_logic_export.h"
-
-class MinecraftProfile;
-class MinecraftVersion;
-typedef std::shared_ptr<MinecraftVersion> MinecraftVersionPtr;
-
-class MULTIMC_LOGIC_EXPORT MinecraftVersion : public BaseVersion, public ProfilePatch
-{
-friend class MinecraftVersionList;
-
-public: /* methods */
- bool usesLegacyLauncher();
- virtual QString descriptor() override;
- virtual QString name() override;
- virtual QString typeString() const override;
- virtual bool hasJarMods() override;
- virtual bool isMinecraftVersion() override;
- virtual void applyTo(MinecraftProfile *profile) override;
- virtual int getOrder() override;
- virtual void setOrder(int order) override;
- virtual QList<JarmodPtr> getJarMods() override;
- virtual QString getID() override;
- virtual QString getVersion() override;
- virtual QString getName() override;
- virtual QString getFilename() override;
- QDateTime getReleaseDateTime() override;
- VersionSource getVersionSource() override;
-
- bool needsUpdate();
- bool hasUpdate();
- virtual bool isCustom() override;
- virtual bool isMoveable() override
- {
- return false;
- }
- virtual bool isCustomizable() override;
- virtual bool isRemovable() override
- {
- return false;
- }
- virtual bool isRevertible() override
- {
- return false;
- }
- virtual bool isEditable() override
- {
- return false;
- }
- virtual bool isVersionChangeable() override
- {
- return true;
- }
-
- virtual VersionFilePtr getVersionFile() override;
-
- // virtual QJsonDocument toJson(bool saveOrder) override;
-
- QString getUrl() const;
-
- virtual const QList<PatchProblem> &getProblems() override;
- virtual ProblemSeverity getProblemSeverity() override;
-
-private: /* methods */
- void applyFileTo(MinecraftProfile *profile);
-
-protected: /* data */
- VersionSource m_versionSource = VersionSource::Builtin;
-
- /// The URL that this version will be downloaded from.
- QString m_versionFileURL;
-
- /// the human readable version name
- QString m_name;
-
- /// the version ID.
- QString m_descriptor;
-
- /// version traits. added by MultiMC
- QSet<QString> m_traits;
-
- /// The main class this version uses (if any, can be empty).
- QString m_mainClass;
-
- /// The applet class this version uses (if any, can be empty).
- QString m_appletClass;
-
- /// The type of this release
- QString m_type;
-
- /// the time this version was actually released by Mojang
- QDateTime m_releaseTime;
-
- /// the time this version was last updated by Mojang
- QDateTime m_updateTime;
-
- /// MD5 hash of the minecraft jar
- QString m_jarChecksum;
-
- /// order of this file... default = -2
- int order = -2;
-
- /// an update available from Mojang
- MinecraftVersionPtr upstreamUpdate;
-
- QDateTime m_loadedVersionFileTimestamp;
- mutable VersionFilePtr m_loadedVersionFile;
-};
diff --git a/api/logic/minecraft/MinecraftVersionList.cpp b/api/logic/minecraft/MinecraftVersionList.cpp
deleted file mode 100644
index 0dc46289..00000000
--- a/api/logic/minecraft/MinecraftVersionList.cpp
+++ /dev/null
@@ -1,614 +0,0 @@
-/* Copyright 2013-2017 MultiMC Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <QtXml>
-#include "Json.h"
-#include <QtAlgorithms>
-#include <QtNetwork>
-
-#include "Env.h"
-#include "Exception.h"
-
-#include "MinecraftVersionList.h"
-#include "net/URLConstants.h"
-
-#include "ParseUtils.h"
-#include "ProfileUtils.h"
-#include "onesix/OneSixVersionFormat.h"
-#include "MojangVersionFormat.h"
-#include <FileSystem.h>
-
-static const char * localVersionCache = "versions/versions.dat";
-
-class MCVListLoadTask : public Task
-{
- Q_OBJECT
-
-public:
- explicit MCVListLoadTask(MinecraftVersionList *vlist);
- virtual ~MCVListLoadTask() override{};
-
- virtual void executeTask() override;
-
-protected
-slots:
- void list_downloaded();
-
-protected:
- QNetworkReply *vlistReply;
- MinecraftVersionList *m_list;
- MinecraftVersion *m_currentStable;
-};
-
-class MCVListVersionUpdateTask : public Task
-{
- Q_OBJECT
-
-public:
- explicit MCVListVersionUpdateTask(MinecraftVersionList *vlist, std::shared_ptr<MinecraftVersion> updatedVersion);
- virtual ~MCVListVersionUpdateTask() override{};
- virtual void executeTask() override;
- bool canAbort() const override;
-
-public slots:
- bool abort() override;
-
-protected
-slots:
- void json_downloaded();
-
-protected:
- NetJobPtr specificVersionDownloadJob;
- QByteArray versionIndexData;
- std::shared_ptr<MinecraftVersion> updatedVersion;
- MinecraftVersionList *m_list;
- bool m_aborted = false;
-};
-
-class ListLoadError : public Exception
-{
-public:
- ListLoadError(QString cause) : Exception(cause) {};
- virtual ~ListLoadError() noexcept
- {
- }
-};
-
-MinecraftVersionList::MinecraftVersionList(QObject *parent) : BaseVersionList(parent)
-{
- loadCachedList();
-}
-
-Task *MinecraftVersionList::getLoadTask()
-{
- return new MCVListLoadTask(this);
-}
-
-bool MinecraftVersionList::isLoaded()
-{
- return m_loaded;
-}
-
-const BaseVersionPtr MinecraftVersionList::at(int i) const
-{
- return m_vlist.at(i);
-}
-
-int MinecraftVersionList::count() const
-{
- return m_vlist.count();
-}
-
-static bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second)
-{
- auto left = std::dynamic_pointer_cast<MinecraftVersion>(first);
- auto right = std::dynamic_pointer_cast<MinecraftVersion>(second);
- return left->getReleaseDateTime() > right->getReleaseDateTime();
-}
-
-void MinecraftVersionList::sortInternal()
-{
- qSort(m_vlist.begin(), m_vlist.end(), cmpVersions);
-}
-
-void MinecraftVersionList::loadCachedList()
-{
- QFile localIndex(localVersionCache);
- if (!localIndex.exists())
- {
- return;
- }
- if (!localIndex.open(QIODevice::ReadOnly))
- {
- // FIXME: this is actually a very bad thing! How do we deal with this?
- qCritical() << "The minecraft version cache can't be read.";
- return;
- }
- auto data = localIndex.readAll();
- try
- {
- localIndex.close();
- QJsonDocument jsonDoc = QJsonDocument::fromBinaryData(data);
- if (jsonDoc.isNull())
- {
- throw ListLoadError(tr("Error reading the version list."));
- }
- loadMojangList(jsonDoc, VersionSource::Local);
- }
- catch (Exception &e)
- {
- // the cache has gone bad for some reason... flush it.
- qCritical() << "The minecraft version cache is corrupted. Flushing cache.";
- localIndex.remove();
- return;
- }
- m_hasLocalIndex = true;
-}
-
-void MinecraftVersionList::loadMojangList(QJsonDocument jsonDoc, VersionSource source)
-{
- qDebug() << "Loading" << ((source == VersionSource::Remote) ? "remote" : "local") << "version list.";
-
- if (!jsonDoc.isObject())
- {
- throw ListLoadError(tr("Error parsing version list JSON: jsonDoc is not an object"));
- }
-
- QJsonObject root = jsonDoc.object();
-
- try
- {
- QJsonObject latest = Json::requireObject(root.value("latest"));
- m_latestReleaseID = Json::requireString(latest.value("release"));
- m_latestSnapshotID = Json::requireString(latest.value("snapshot"));
- }
- catch (Exception &err)
- {
- qCritical()
- << tr("Error parsing version list JSON: couldn't determine latest versions");
- }
-
- // Now, get the array of versions.
- if (!root.value("versions").isArray())
- {
- throw ListLoadError(tr("Error parsing version list JSON: version list object is "
- "missing 'versions' array"));
- }
- QJsonArray versions = root.value("versions").toArray();
-
- QList<BaseVersionPtr> tempList;
- for (auto version : versions)
- {
- // Load the version info.
- if (!version.isObject())
- {
- qCritical() << "Error while parsing version list : invalid JSON structure";
- continue;
- }
-
- QJsonObject versionObj = version.toObject();
- QString versionID = versionObj.value("id").toString("");
- if (versionID.isEmpty())
- {
- qCritical() << "Error while parsing version : version ID is missing";
- continue;
- }
-
- // Now, we construct the version object and add it to the list.
- std::shared_ptr<MinecraftVersion> mcVersion(new MinecraftVersion());
- mcVersion->m_name = mcVersion->m_descriptor = versionID;
-
- mcVersion->m_releaseTime = timeFromS3Time(versionObj.value("releaseTime").toString(""));
- mcVersion->m_updateTime = timeFromS3Time(versionObj.value("time").toString(""));
-
- // depends on where we load the version from -- network request or local file?
- mcVersion->m_versionSource = source;
- mcVersion->m_versionFileURL = versionObj.value("url").toString("");
- QString versionTypeStr = versionObj.value("type").toString("");
- if (versionTypeStr.isEmpty())
- {
- qCritical() << "Ignoring" << versionID
- << "because it doesn't have the version type set.";
- continue;
- }
- // OneSix or Legacy. use filter to determine type
- if (versionTypeStr == "release")
- {
- }
- else if (versionTypeStr == "snapshot") // It's a snapshot... yay
- {
- }
- else if (versionTypeStr == "old_alpha")
- {
- }
- else if (versionTypeStr == "old_beta")
- {
- }
- else
- {
- qCritical() << "Ignoring" << versionID
- << "because it has an invalid version type.";
- continue;
- }
- mcVersion->m_type = versionTypeStr;
- qDebug() << "Loaded version" << versionID << "from"
- << ((source == VersionSource::Remote) ? "remote" : "local") << "version list.";
- tempList.append(mcVersion);
- }
- updateListData(tempList);
- if(source == VersionSource::Remote)
- {
- m_loaded = true;
- }
-}
-
-void MinecraftVersionList::sortVersions()
-{
- beginResetModel();
- sortInternal();
- endResetModel();
-}
-
-QVariant MinecraftVersionList::data(const QModelIndex& index, int role) const
-{
- if (!index.isValid())
- return QVariant();
-
- if (index.row() > count())
- return QVariant();
-
- auto version = std::dynamic_pointer_cast<MinecraftVersion>(m_vlist[index.row()]);
- switch (role)
- {
- case VersionPointerRole:
- return qVariantFromValue(m_vlist[index.row()]);
-
- case VersionRole:
- return version->name();
-
- case VersionIdRole:
- return version->descriptor();
-
- case RecommendedRole:
- return version->descriptor() == m_latestReleaseID;
-
- case LatestRole:
- {
- if(version->descriptor() != m_latestSnapshotID)
- return false;
- MinecraftVersionPtr latestRelease = std::dynamic_pointer_cast<MinecraftVersion>(getLatestStable());
- /*
- if(latestRelease && latestRelease->m_releaseTime > version->m_releaseTime)
- {
- return false;
- }
- */
- return true;
- }
-
- case TypeRole:
- return version->typeString();
-
- default:
- return QVariant();
- }
-}
-
-BaseVersionList::RoleList MinecraftVersionList::providesRoles() const
-{
- return {VersionPointerRole, VersionRole, VersionIdRole, RecommendedRole, LatestRole, TypeRole};
-}
-
-BaseVersionPtr MinecraftVersionList::getLatestStable() const
-{
- if(m_lookup.contains(m_latestReleaseID))
- return m_lookup[m_latestReleaseID];
- return BaseVersionPtr();
-}
-
-BaseVersionPtr MinecraftVersionList::getRecommended() const
-{
- return getLatestStable();
-}
-
-void MinecraftVersionList::updateListData(QList<BaseVersionPtr> versions)
-{
- beginResetModel();
- for (auto version : versions)
- {
- auto descr = version->descriptor();
-
- if (!m_lookup.contains(descr))
- {
- m_lookup[version->descriptor()] = version;
- m_vlist.append(version);
- continue;
- }
- auto orig = std::dynamic_pointer_cast<MinecraftVersion>(m_lookup[descr]);
- auto added = std::dynamic_pointer_cast<MinecraftVersion>(version);
- // updateListData is called after Mojang list loads. those can be local or remote
- // remote comes always after local
- // any other options are ignored
- if (orig->m_versionSource != VersionSource::Local || added->m_versionSource != VersionSource::Remote)
- {
- continue;
- }
- // alright, it's an update. put it inside the original, for further processing.
- orig->upstreamUpdate = added;
- }
- sortInternal();
- endResetModel();
-}
-
-MCVListLoadTask::MCVListLoadTask(MinecraftVersionList *vlist)
-{
- m_list = vlist;
- m_currentStable = NULL;
- vlistReply = nullptr;
-}
-
-void MCVListLoadTask::executeTask()
-{
- setStatus(tr("Loading instance version list..."));
- vlistReply = ENV.qnam().get(QNetworkRequest(QUrl("https://launchermeta.mojang.com/mc/game/version_manifest.json")));
- connect(vlistReply, SIGNAL(finished()), this, SLOT(list_downloaded()));
-}
-
-void MCVListLoadTask::list_downloaded()
-{
- if (vlistReply->error() != QNetworkReply::NoError)
- {
- vlistReply->deleteLater();
- emitFailed("Failed to load Minecraft main version list" + vlistReply->errorString());
- return;
- }
-
- auto data = vlistReply->readAll();
- vlistReply->deleteLater();
- try
- {
- QJsonParseError jsonError;
- QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
- if (jsonError.error != QJsonParseError::NoError)
- {
- throw ListLoadError(
- tr("Error parsing version list JSON: %1").arg(jsonError.errorString()));
- }
- m_list->loadMojangList(jsonDoc, VersionSource::Remote);
- }
- catch (Exception &e)
- {
- emitFailed(e.cause());
- return;
- }
-
- emitSucceeded();
- return;
-}
-
-MCVListVersionUpdateTask::MCVListVersionUpdateTask(MinecraftVersionList *vlist, std::shared_ptr<MinecraftVersion> updatedVersion)
- : Task()
-{
- m_list = vlist;
- this->updatedVersion = updatedVersion;
-}
-
-void MCVListVersionUpdateTask::executeTask()
-{
- if(m_aborted)
- {
- emitFailed(tr("Task aborted."));
- return;
- }
- auto job = new NetJob("Version index");
- job->addNetAction(Net::Download::makeByteArray(QUrl(updatedVersion->getUrl()), &versionIndexData));
- specificVersionDownloadJob.reset(job);
- connect(specificVersionDownloadJob.get(), SIGNAL(succeeded()), SLOT(json_downloaded()));
- connect(specificVersionDownloadJob.get(), SIGNAL(failed(QString)), SIGNAL(failed(QString)));
- connect(specificVersionDownloadJob.get(), SIGNAL(progress(qint64, qint64)), SIGNAL(progress(qint64, qint64)));
- specificVersionDownloadJob->start();
-}
-
-bool MCVListVersionUpdateTask::canAbort() const
-{
- return true;
-}
-
-bool MCVListVersionUpdateTask::abort()
-{
- m_aborted = true;
- if(specificVersionDownloadJob)
- {
- return specificVersionDownloadJob->abort();
- }
- return true;
-}
-
-void MCVListVersionUpdateTask::json_downloaded()
-{
- specificVersionDownloadJob.reset();
-
- QJsonParseError jsonError;
- QJsonDocument jsonDoc = QJsonDocument::fromJson(versionIndexData, &jsonError);
- versionIndexData.clear();
-
- if (jsonError.error != QJsonParseError::NoError)
- {
- emitFailed(tr("The download version file is not valid."));
- return;
- }
- VersionFilePtr file;
- try
- {
- file = MojangVersionFormat::versionFileFromJson(jsonDoc, "net.minecraft.json");
- }
- catch (Exception &e)
- {
- emitFailed(tr("Couldn't process version file: %1").arg(e.cause()));
- return;
- }
-
- // Strip LWJGL from the version file. We use our own.
- ProfileUtils::removeLwjglFromPatch(file);
-
- // TODO: recognize and add LWJGL versions here.
-
- file->fileId = "net.minecraft";
-
- // now dump the file to disk
- auto doc = OneSixVersionFormat::versionFileToJson(file, false);
- auto newdata = doc.toBinaryData();
- auto id = updatedVersion->descriptor();
- QString targetPath = "versions/" + id + "/" + id + ".dat";
- FS::ensureFilePathExists(targetPath);
- QSaveFile vfile1(targetPath);
- if (!vfile1.open(QIODevice::Truncate | QIODevice::WriteOnly))
- {
- emitFailed(tr("Can't open %1 for writing.").arg(targetPath));
- return;
- }
- qint64 actual = 0;
- if ((actual = vfile1.write(newdata)) != newdata.size())
- {
- emitFailed(tr("Failed to write into %1. Written %2 out of %3.")
- .arg(targetPath)
- .arg(actual)
- .arg(newdata.size()));
- return;
- }
- if (!vfile1.commit())
- {
- emitFailed(tr("Can't commit changes to %1").arg(targetPath));
- return;
- }
-
- m_list->finalizeUpdate(id);
- emitSucceeded();
-}
-
-std::shared_ptr<Task> MinecraftVersionList::createUpdateTask(QString version)
-{
- auto iter = m_lookup.find(version);
- if(iter == m_lookup.end())
- return nullptr;
-
- auto mcversion = std::dynamic_pointer_cast<MinecraftVersion>(*iter);
- if(!mcversion)
- {
- return nullptr;
- }
-
- return std::shared_ptr<Task>(new MCVListVersionUpdateTask(this, mcversion));
-}
-
-void MinecraftVersionList::saveCachedList()
-{
- // FIXME: throw.
- if (!FS::ensureFilePathExists(localVersionCache))
- return;
- QSaveFile tfile(localVersionCache);
- if (!tfile.open(QIODevice::WriteOnly | QIODevice::Truncate))
- return;
- QJsonObject toplevel;
- QJsonArray entriesArr;
- for (auto version : m_vlist)
- {
- auto mcversion = std::dynamic_pointer_cast<MinecraftVersion>(version);
- // do not save the remote versions.
- if (mcversion->m_versionSource != VersionSource::Local)
- continue;
- QJsonObject entryObj;
-
- entryObj.insert("id", mcversion->descriptor());
- entryObj.insert("version", mcversion->descriptor());
- entryObj.insert("time", timeToS3Time(mcversion->m_updateTime));
- entryObj.insert("releaseTime", timeToS3Time(mcversion->m_releaseTime));
- entryObj.insert("url", mcversion->m_versionFileURL);
- entryObj.insert("type", mcversion->m_type);
- entriesArr.append(entryObj);
- }
- toplevel.insert("versions", entriesArr);
-
- {
- bool someLatest = false;
- QJsonObject latestObj;
- if(!m_latestReleaseID.isNull())
- {
- latestObj.insert("release", m_latestReleaseID);<