From 71467246079bd7545472bda161dcaf5549205d33 Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Wed, 19 Feb 2014 22:34:17 +0100 Subject: New, better, liteloader support --- logic/BaseInstaller.h | 1 - logic/LiteLoaderInstaller.cpp | 41 +++----- logic/LiteLoaderInstaller.h | 13 ++- logic/lists/LiteLoaderVersionList.cpp | 190 ++++++++++++++++++++++++++++++++++ logic/lists/LiteLoaderVersionList.h | 101 ++++++++++++++++++ logic/lists/MinecraftVersionList.cpp | 2 +- logic/net/URLConstants.h | 1 + 7 files changed, 316 insertions(+), 33 deletions(-) create mode 100644 logic/lists/LiteLoaderVersionList.cpp create mode 100644 logic/lists/LiteLoaderVersionList.h (limited to 'logic') diff --git a/logic/BaseInstaller.h b/logic/BaseInstaller.h index df7eab89..c572e004 100644 --- a/logic/BaseInstaller.h +++ b/logic/BaseInstaller.h @@ -26,7 +26,6 @@ class BaseInstaller public: BaseInstaller(); - virtual bool canApply(OneSixInstance *instance) const { return true; } bool isApplied(OneSixInstance *on); virtual bool add(OneSixInstance *to); diff --git a/logic/LiteLoaderInstaller.cpp b/logic/LiteLoaderInstaller.cpp index c363cad6..126027fb 100644 --- a/logic/LiteLoaderInstaller.cpp +++ b/logic/LiteLoaderInstaller.cpp @@ -24,23 +24,9 @@ #include "OneSixLibrary.h" #include "OneSixInstance.h" -QMap LiteLoaderInstaller::m_launcherWrapperVersionMapping; - -LiteLoaderInstaller::LiteLoaderInstaller() - : BaseInstaller() -{ - if (m_launcherWrapperVersionMapping.isEmpty()) - { - m_launcherWrapperVersionMapping["1.6.2"] = "1.3"; - m_launcherWrapperVersionMapping["1.6.4"] = "1.8"; - //m_launcherWrapperVersionMapping["1.7.2"] = "1.8"; - //m_launcherWrapperVersionMapping["1.7.4"] = "1.8"; - } -} - -bool LiteLoaderInstaller::canApply(OneSixInstance *instance) const +LiteLoaderInstaller::LiteLoaderInstaller(LiteLoaderVersionPtr version) + : BaseInstaller(), m_version(version) { - return m_launcherWrapperVersionMapping.contains(instance->intendedVersionId()); } bool LiteLoaderInstaller::add(OneSixInstance *to) @@ -53,24 +39,26 @@ bool LiteLoaderInstaller::add(OneSixInstance *to) QJsonObject obj; obj.insert("mainClass", QString("net.minecraft.launchwrapper.Launch")); - obj.insert("+tweakers", QJsonArray::fromStringList(QStringList() << "com.mumfrey.liteloader.launch.LiteLoaderTweaker")); + obj.insert("+tweakers", QJsonArray::fromStringList(QStringList() << m_version->tweakClass)); obj.insert("order", 10); QJsonArray libraries; - // launchwrapper + for (auto libStr : m_version->libraries) { - OneSixLibrary launchwrapperLib("net.minecraft:launchwrapper:" + m_launcherWrapperVersionMapping[to->intendedVersionId()]); - launchwrapperLib.finalize(); - QJsonObject lwLibObj = launchwrapperLib.toJson(); - lwLibObj.insert("insert", QString("prepend")); - libraries.append(lwLibObj); + OneSixLibrary lib(libStr); + lib.finalize(); + QJsonObject libObj = lib.toJson(); + libObj.insert("insert", QString("prepend")); + libraries.append(libObj); } // liteloader { - OneSixLibrary liteloaderLib("com.mumfrey:liteloader:" + to->intendedVersionId()); - liteloaderLib.setBaseUrl("http://dl.liteloader.com/versions/"); + OneSixLibrary liteloaderLib("com.mumfrey:liteloader:" + m_version->version); + liteloaderLib.setAbsoluteUrl( + QString("http://dl.liteloader.com/versions/com/mumfrey/liteloader/%1/%2") + .arg(m_version->mcVersion, m_version->file)); liteloaderLib.finalize(); QJsonObject llLibObj = liteloaderLib.toJson(); llLibObj.insert("insert", QString("prepend")); @@ -87,7 +75,8 @@ bool LiteLoaderInstaller::add(OneSixInstance *to) QFile file(filename(to->instanceRoot())); if (!file.open(QFile::WriteOnly)) { - QLOG_ERROR() << "Error opening" << file.fileName() << "for reading:" << file.errorString(); + QLOG_ERROR() << "Error opening" << file.fileName() + << "for reading:" << file.errorString(); return false; } file.write(QJsonDocument(obj).toJson()); diff --git a/logic/LiteLoaderInstaller.h b/logic/LiteLoaderInstaller.h index 5e01b16c..2e0de64a 100644 --- a/logic/LiteLoaderInstaller.h +++ b/logic/LiteLoaderInstaller.h @@ -20,16 +20,19 @@ #include #include +#include "logic/lists/LiteLoaderVersionList.h" + class LiteLoaderInstaller : public BaseInstaller { public: - LiteLoaderInstaller(); + LiteLoaderInstaller(LiteLoaderVersionPtr version); - bool canApply(OneSixInstance *instance) const override; bool add(OneSixInstance *to) override; private: - virtual QString id() const override { return "com.mumfrey.liteloader"; } - - static QMap m_launcherWrapperVersionMapping; + virtual QString id() const override + { + return "com.mumfrey.liteloader"; + } + LiteLoaderVersionPtr m_version; }; diff --git a/logic/lists/LiteLoaderVersionList.cpp b/logic/lists/LiteLoaderVersionList.cpp new file mode 100644 index 00000000..b8cea442 --- /dev/null +++ b/logic/lists/LiteLoaderVersionList.cpp @@ -0,0 +1,190 @@ +/* Copyright 2013 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 "LiteLoaderVersionList.h" +#include "MultiMC.h" +#include "logic/net/URLConstants.h" + +#include + +#include +#include +#include +#include +#include + +#include + +#include + +LiteLoaderVersionList::LiteLoaderVersionList(QObject *parent) : BaseVersionList(parent) +{ +} + +Task *LiteLoaderVersionList::getLoadTask() +{ + return new LLListLoadTask(this); +} + +bool LiteLoaderVersionList::isLoaded() +{ + return m_loaded; +} + +const BaseVersionPtr LiteLoaderVersionList::at(int i) const +{ + return m_vlist.at(i); +} + +int LiteLoaderVersionList::count() const +{ + return m_vlist.count(); +} + +static bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second) +{ + auto left = std::dynamic_pointer_cast(first); + auto right = std::dynamic_pointer_cast(second); + return left->timestamp > right->timestamp; +} + +void LiteLoaderVersionList::sort() +{ + beginResetModel(); + qSort(m_vlist.begin(), m_vlist.end(), cmpVersions); + endResetModel(); +} + +BaseVersionPtr LiteLoaderVersionList::getLatestStable() const +{ + for (int i = 0; i < m_vlist.length(); i++) + { + auto ver = std::dynamic_pointer_cast(m_vlist.at(i)); + if (ver->isLatest) + { + return m_vlist.at(i); + } + } + return BaseVersionPtr(); +} + +void LiteLoaderVersionList::updateListData(QList versions) +{ + beginResetModel(); + m_vlist = versions; + m_loaded = true; + qSort(m_vlist.begin(), m_vlist.end(), cmpVersions); + endResetModel(); +} + +LLListLoadTask::LLListLoadTask(LiteLoaderVersionList *vlist) +{ + m_list = vlist; + vlistReply = nullptr; +} + +LLListLoadTask::~LLListLoadTask() +{ +} + +void LLListLoadTask::executeTask() +{ + setStatus(tr("Loading LiteLoader version list...")); + auto worker = MMC->qnam(); + vlistReply = worker->get(QNetworkRequest(QUrl(URLConstants::LITELOADER_URL))); + connect(vlistReply, SIGNAL(finished()), this, SLOT(listDownloaded())); +} + +void LLListLoadTask::listDownloaded() +{ + if (vlistReply->error() != QNetworkReply::NoError) + { + vlistReply->deleteLater(); + emitFailed("Failed to load LiteLoader version list" + vlistReply->errorString()); + return; + } + + QJsonParseError jsonError; + QJsonDocument jsonDoc = QJsonDocument::fromJson(vlistReply->readAll(), &jsonError); + vlistReply->deleteLater(); + + if (jsonError.error != QJsonParseError::NoError) + { + emitFailed("Error parsing version list JSON:" + jsonError.errorString()); + return; + } + + if (!jsonDoc.isObject()) + { + emitFailed("Error parsing version list JSON: jsonDoc is not an object"); + return; + } + + const QJsonObject root = jsonDoc.object(); + + // Now, get the array of versions. + if (!root.value("versions").isObject()) + { + emitFailed("Error parsing version list JSON: missing 'versions' object"); + return; + } + const QJsonObject versions = root.value("versions").toObject(); + + QList tempList; + for (auto vIt = versions.begin(); vIt != versions.end(); ++vIt) + { + const QString mcVersion = vIt.key(); + QString latest; + const QJsonObject artefacts = vIt.value() + .toObject() + .value("artefacts") + .toObject() + .value("com.mumfrey:liteloader") + .toObject(); + QList perMcVersionList; + for (auto aIt = artefacts.begin(); aIt != artefacts.end(); ++aIt) + { + const QString identifier = aIt.key(); + const QJsonObject artefact = aIt.value().toObject(); + if (identifier == "latest") + { + latest = artefact.value("version").toString(); + continue; + } + LiteLoaderVersionPtr version(new LiteLoaderVersion()); + version->version = artefact.value("version").toString(); + version->file = artefact.value("file").toString(); + version->mcVersion = mcVersion; + version->md5 = artefact.value("md5").toString(); + version->timestamp = artefact.value("timestamp").toDouble(); + version->tweakClass = artefact.value("tweakClass").toString(); + const QJsonArray libs = artefact.value("libraries").toArray(); + for (auto lIt = libs.begin(); lIt != libs.end(); ++lIt) + { + version->libraries.append((*lIt).toObject().value("name").toString()); + } + perMcVersionList.append(version); + } + for (auto version : perMcVersionList) + { + auto v = std::dynamic_pointer_cast(version); + v->isLatest = v->version == latest; + } + tempList.append(perMcVersionList); + } + m_list->updateListData(tempList); + + emitSucceeded(); +} diff --git a/logic/lists/LiteLoaderVersionList.h b/logic/lists/LiteLoaderVersionList.h new file mode 100644 index 00000000..58927b8f --- /dev/null +++ b/logic/lists/LiteLoaderVersionList.h @@ -0,0 +1,101 @@ +/* Copyright 2013 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 + +#include "BaseVersionList.h" +#include "logic/tasks/Task.h" +#include "logic/BaseVersion.h" + +class LLListLoadTask; +class QNetworkReply; + +class LiteLoaderVersion : public BaseVersion +{ +public: + QString descriptor() override + { + if (isLatest) + { + return QObject::tr("Latest"); + } + return QString(); + } + QString typeString() const override + { + return mcVersion; + } + QString name() override + { + return version; + } + + QString version; + QString file; + QString mcVersion; + QString md5; + int timestamp; + bool isLatest; + QString tweakClass; + QStringList libraries; +}; +typedef std::shared_ptr LiteLoaderVersionPtr; + +class LiteLoaderVersionList : public BaseVersionList +{ + Q_OBJECT +public: + friend class LLListLoadTask; + + explicit LiteLoaderVersionList(QObject *parent = 0); + + virtual Task *getLoadTask(); + virtual bool isLoaded(); + virtual const BaseVersionPtr at(int i) const; + virtual int count() const; + virtual void sort(); + + virtual BaseVersionPtr getLatestStable() const; + +protected: + QList m_vlist; + + bool m_loaded = false; + +protected +slots: + virtual void updateListData(QList versions); +}; + +class LLListLoadTask : public Task +{ + Q_OBJECT + +public: + explicit LLListLoadTask(LiteLoaderVersionList *vlist); + ~LLListLoadTask(); + + virtual void executeTask(); + +protected +slots: + void listDownloaded(); + +protected: + QNetworkReply *vlistReply; + LiteLoaderVersionList *m_list; +}; diff --git a/logic/lists/MinecraftVersionList.cpp b/logic/lists/MinecraftVersionList.cpp index ece31e3d..b9d60c61 100644 --- a/logic/lists/MinecraftVersionList.cpp +++ b/logic/lists/MinecraftVersionList.cpp @@ -53,7 +53,7 @@ int MinecraftVersionList::count() const return m_vlist.count(); } -bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second) +static bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second) { auto left = std::dynamic_pointer_cast(first); auto right = std::dynamic_pointer_cast(second); diff --git a/logic/net/URLConstants.h b/logic/net/URLConstants.h index 8cb1f3fd..07b35c4f 100644 --- a/logic/net/URLConstants.h +++ b/logic/net/URLConstants.h @@ -33,4 +33,5 @@ const QString FORGE_LEGACY_URL("http://files.minecraftforge.net/minecraftforge/j const QString FORGE_GRADLE_URL("http://files.minecraftforge.net/maven/net/minecraftforge/forge/json"); const QString MOJANG_STATUS_URL("http://status.mojang.com/check"); const QString MOJANG_STATUS_NEWS_URL("http://status.mojang.com/news"); +const QString LITELOADER_URL("http://dl.liteloader.com/versions/versions.json"); } -- cgit v1.2.3