diff options
author | Petr Mrázek <peterix@gmail.com> | 2013-09-16 00:54:39 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2013-09-16 00:54:39 +0200 |
commit | d38b90530b3ba3a49c4eb072eb344ae2b0836913 (patch) | |
tree | 5dd07e59ae1bc8392a773ec8fec6b6a3aa7e4840 /logic/lists | |
parent | 7721c57e5e1093a3d8597b6b6f30c97d2aa3d8a5 (diff) | |
download | MultiMC-d38b90530b3ba3a49c4eb072eb344ae2b0836913.tar MultiMC-d38b90530b3ba3a49c4eb072eb344ae2b0836913.tar.gz MultiMC-d38b90530b3ba3a49c4eb072eb344ae2b0836913.tar.lz MultiMC-d38b90530b3ba3a49c4eb072eb344ae2b0836913.tar.xz MultiMC-d38b90530b3ba3a49c4eb072eb344ae2b0836913.zip |
Forge version list implementation. Needs integration and testing.
Diffstat (limited to 'logic/lists')
-rw-r--r-- | logic/lists/BaseVersionList.cpp (renamed from logic/lists/InstVersionList.cpp) | 36 | ||||
-rw-r--r-- | logic/lists/BaseVersionList.h (renamed from logic/lists/InstVersionList.h) | 14 | ||||
-rw-r--r-- | logic/lists/ForgeVersionList.cpp | 200 | ||||
-rw-r--r-- | logic/lists/ForgeVersionList.h | 98 | ||||
-rw-r--r-- | logic/lists/LwjglVersionList.cpp | 8 | ||||
-rw-r--r-- | logic/lists/LwjglVersionList.h | 2 | ||||
-rw-r--r-- | logic/lists/MinecraftVersionList.cpp | 34 | ||||
-rw-r--r-- | logic/lists/MinecraftVersionList.h | 21 |
8 files changed, 337 insertions, 76 deletions
diff --git a/logic/lists/InstVersionList.cpp b/logic/lists/BaseVersionList.cpp index 7dc67155..61da5eeb 100644 --- a/logic/lists/InstVersionList.cpp +++ b/logic/lists/BaseVersionList.cpp @@ -13,33 +13,33 @@ * limitations under the License. */ -#include "logic/lists/InstVersionList.h" -#include "logic/InstanceVersion.h" +#include "logic/lists/BaseVersionList.h" +#include "logic/BaseVersion.h" -InstVersionList::InstVersionList(QObject *parent) : +BaseVersionList::BaseVersionList(QObject *parent) : QAbstractListModel(parent) { } -InstVersionPtr InstVersionList::findVersion( const QString& descriptor ) +BaseVersionPtr BaseVersionList::findVersion( const QString& descriptor ) { for (int i = 0; i < count(); i++) { - if (at(i)->descriptor == descriptor) + if (at(i)->descriptor() == descriptor) return at(i); } - return InstVersionPtr(); + return BaseVersionPtr(); } -InstVersionPtr InstVersionList::getLatestStable() const +BaseVersionPtr BaseVersionList::getLatestStable() const { if (count() <= 0) - return InstVersionPtr(); + return BaseVersionPtr(); else return at(0); } -QVariant InstVersionList::data(const QModelIndex &index, int role) const +QVariant BaseVersionList::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); @@ -48,7 +48,7 @@ QVariant InstVersionList::data(const QModelIndex &index, int role) const return QVariant(); - InstVersionPtr version = at(index.row()); + BaseVersionPtr version = at(index.row()); switch (role) { @@ -56,20 +56,17 @@ QVariant InstVersionList::data(const QModelIndex &index, int role) const switch (index.column()) { case NameColumn: - return version->name; + return version->name(); case TypeColumn: return version->typeString(); - case TimeColumn: - return version->timestamp; - default: return QVariant(); } case Qt::ToolTipRole: - return version->descriptor; + return version->descriptor(); case VersionPointerRole: return qVariantFromValue(version); @@ -79,7 +76,7 @@ QVariant InstVersionList::data(const QModelIndex &index, int role) const } } -QVariant InstVersionList::headerData(int section, Qt::Orientation orientation, int role) const +QVariant BaseVersionList::headerData(int section, Qt::Orientation orientation, int role) const { switch (role) { @@ -91,9 +88,6 @@ QVariant InstVersionList::headerData(int section, Qt::Orientation orientation, i case TypeColumn: return "Type"; - - case TimeColumn: - return "Time"; default: return QVariant(); @@ -117,13 +111,13 @@ QVariant InstVersionList::headerData(int section, Qt::Orientation orientation, i } } -int InstVersionList::rowCount(const QModelIndex &parent) const +int BaseVersionList::rowCount(const QModelIndex &parent) const { // Return count return count(); } -int InstVersionList::columnCount(const QModelIndex &parent) const +int BaseVersionList::columnCount(const QModelIndex &parent) const { return 2; } diff --git a/logic/lists/InstVersionList.h b/logic/lists/BaseVersionList.h index bc6aa5d4..d37431ed 100644 --- a/logic/lists/InstVersionList.h +++ b/logic/lists/BaseVersionList.h @@ -20,7 +20,7 @@ #include <QAbstractListModel> #include <QSharedPointer> -#include "logic/InstanceVersion.h" +#include "logic/BaseVersion.h" class Task; @@ -36,7 +36,7 @@ class Task; * all have a default implementation, but they can be overridden by plugins to * change the behavior of the list. */ -class InstVersionList : public QAbstractListModel +class BaseVersionList : public QAbstractListModel { Q_OBJECT public: @@ -57,7 +57,7 @@ public: TimeColumn }; - explicit InstVersionList(QObject *parent = 0); + explicit BaseVersionList(QObject *parent = 0); /*! * \brief Gets a task that will reload the version list. @@ -71,7 +71,7 @@ public: virtual bool isLoaded() = 0; //! Gets the version at the given index. - virtual const InstVersionPtr at(int i) const = 0; + virtual const BaseVersionPtr at(int i) const = 0; //! Returns the number of versions in the list. virtual int count() const = 0; @@ -90,14 +90,14 @@ public: * \return A const pointer to the version with the given descriptor. NULL if * one doesn't exist. */ - virtual InstVersionPtr findVersion(const QString &descriptor); + virtual BaseVersionPtr findVersion(const QString &descriptor); /*! * \brief Gets the latest stable version of this instance type. * This is the version that will be selected by default. * By default, this is simply the first version in the list. */ - virtual InstVersionPtr getLatestStable() const; + virtual BaseVersionPtr getLatestStable() const; /*! * Sorts the version list. @@ -117,5 +117,5 @@ protected slots: * then copies the versions and sets their parents correctly. * \param versions List of versions whose parents should be set. */ - virtual void updateListData(QList<InstVersionPtr > versions) = 0; + virtual void updateListData(QList<BaseVersionPtr > versions) = 0; }; diff --git a/logic/lists/ForgeVersionList.cpp b/logic/lists/ForgeVersionList.cpp new file mode 100644 index 00000000..f45b8b6b --- /dev/null +++ b/logic/lists/ForgeVersionList.cpp @@ -0,0 +1,200 @@ +/* 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 "ForgeVersionList.h" +#include <logic/net/DownloadJob.h> +#include "MultiMC.h" + +#include <QtNetwork> + +#include <QtXml> + +#include <QRegExp> + +#define JSON_URL "http://files.minecraftforge.net/minecraftforge/json" + + +ForgeVersionList::ForgeVersionList(QObject* parent): BaseVersionList(parent) +{ + +} + +Task *ForgeVersionList::getLoadTask() +{ + return new ForgeListLoadTask(this); +} + +bool ForgeVersionList::isLoaded() +{ + return m_loaded; +} + +const BaseVersionPtr ForgeVersionList::at(int i) const +{ + return m_vlist.at(i); +} + +int ForgeVersionList::count() const +{ + return m_vlist.count(); +} +/* +bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second) +{ + const BaseVersion & left = *first; + const BaseVersion & right = *second; + return left > right; +} + +void MinecraftVersionList::sort() +{ + beginResetModel(); + qSort(m_vlist.begin(), m_vlist.end(), cmpVersions); + endResetModel(); +} +*/ +BaseVersionPtr ForgeVersionList::getLatestStable() const +{ + return BaseVersionPtr(); +} + +void ForgeVersionList::updateListData(QList<BaseVersionPtr > versions) +{ + beginResetModel(); + m_vlist = versions; + m_loaded = true; + endResetModel(); + // NOW SORT!! + // sort(); +} + +void ForgeVersionList::sort() +{ + // NO-OP for now +} + + +ForgeListLoadTask::ForgeListLoadTask(ForgeVersionList* vlist): Task() +{ + m_list = vlist; +} + + +void ForgeListLoadTask::executeTask() +{ + auto job = new DownloadJob("Version index"); + job->add(QUrl(JSON_URL)); + listJob.reset(job); + connect(listJob.data(), SIGNAL(succeeded()), SLOT(list_downloaded())); + connect(listJob.data(), SIGNAL(failed()), SLOT(versionFileFailed())); + connect(listJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64))); + listJob->start(); +} + +void ForgeListLoadTask::list_downloaded() +{ + auto DlJob = listJob->first(); + auto data = DlJob.dynamicCast<ByteArrayDownload>()->m_data; + + + QJsonParseError jsonError; + QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError); + DlJob.reset(); + + 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; + } + + QJsonObject root = jsonDoc.object(); + + // Now, get the array of versions. + if(!root.value("builds").isArray()) + { + emitFailed("Error parsing version list JSON: version list object is missing 'builds' array"); + return; + } + QJsonArray builds = root.value("builds").toArray(); + + QList<BaseVersionPtr > tempList; + for (int i = 0; i < builds.count(); i++) + { + // Load the version info. + if(!builds[i].isObject()) + { + //FIXME: log this somewhere + continue; + } + QJsonObject obj = builds[i].toObject(); + int build_nr = obj.value("build").toDouble(0); + if(!build_nr) + continue; + QJsonArray files = root.value("files").toArray(); + QString url, jobbuildver, mcver, buildtype, filename; + QString changelog_url, installer_url; + bool valid = false; + for(int j = 0; j < files.count(); j++) + { + if(!files[j].isObject()) + continue; + QJsonObject file = files[j].toObject(); + buildtype = file.value("buildtype").toString(); + if((buildtype == "client" || buildtype == "universal") && !valid) + { + mcver = file.value("mcver").toString(); + url = file.value("url").toString(); + jobbuildver = file.value("jobbuildver").toString(); + int lastSlash = url.lastIndexOf('/'); + filename = url.mid(lastSlash+1); + valid = true; + } + else if(buildtype == "changelog") + { + QString ext = file.value("ext").toString(); + if(ext.isEmpty()) + continue; + changelog_url = file.value("url").toString(); + } + else if(buildtype == "installer") + { + installer_url = file.value("url").toString(); + } + } + if(valid) + { + // Now, we construct the version object and add it to the list. + QSharedPointer<ForgeVersion> fVersion(new ForgeVersion()); + fVersion->universal_url = url; + fVersion->changelog_url = changelog_url; + fVersion->installer_url = installer_url; + fVersion->jobbuildver = jobbuildver; + fVersion->mcver = mcver; + fVersion->filename = filename; + fVersion->m_buildnr = build_nr; + tempList.append(fVersion); + } + } + m_list->updateListData(tempList); + + emitSucceeded(); + return; +} diff --git a/logic/lists/ForgeVersionList.h b/logic/lists/ForgeVersionList.h new file mode 100644 index 00000000..8d4a2d46 --- /dev/null +++ b/logic/lists/ForgeVersionList.h @@ -0,0 +1,98 @@ +/* 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 <QObject> +#include <QAbstractListModel> +#include <QSharedPointer> +#include <QUrl> + +#include <QNetworkReply> +#include "BaseVersionList.h" +#include "logic/tasks/Task.h" +#include "logic/net/DownloadJob.h" + +class ForgeVersion; +typedef QSharedPointer<ForgeVersion> PtrForgeVersion; + +struct ForgeVersion : public BaseVersion +{ + virtual QString descriptor() + { + return filename; + }; + virtual QString name() + { + return "Forge " + jobbuildver + " (" + mcver + ")"; + }; + virtual QString typeString() const + { + if(installer_url.isEmpty()) + return "Universal"; + else + return "Installer"; + }; + + int m_buildnr = 0; + QString universal_url; + QString changelog_url; + QString installer_url; + QString jobbuildver; + QString mcver; + QString filename; +}; + +class ForgeVersionList : public BaseVersionList +{ + Q_OBJECT +public: + friend class ForgeListLoadTask; + + explicit ForgeVersionList(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<BaseVersionPtr > m_vlist; + + bool m_loaded; + +protected slots: + virtual void updateListData(QList<BaseVersionPtr > versions); +}; + +class ForgeListLoadTask : public Task +{ + Q_OBJECT + +public: + explicit ForgeListLoadTask(ForgeVersionList *vlist); + + virtual void executeTask(); + +protected slots: + void list_downloaded(); + +protected: + DownloadJobPtr listJob; + ForgeVersionList *m_list; +}; diff --git a/logic/lists/LwjglVersionList.cpp b/logic/lists/LwjglVersionList.cpp index d7826a82..b3e2dab4 100644 --- a/logic/lists/LwjglVersionList.cpp +++ b/logic/lists/LwjglVersionList.cpp @@ -24,14 +24,6 @@ #define RSS_URL "http://sourceforge.net/api/file/index/project-id/58488/mtime/desc/rss" -LWJGLVersionList mainVersionList; - -LWJGLVersionList &LWJGLVersionList::get() -{ - return mainVersionList; -} - - LWJGLVersionList::LWJGLVersionList(QObject *parent) : QAbstractListModel(parent) { diff --git a/logic/lists/LwjglVersionList.h b/logic/lists/LwjglVersionList.h index 638a0b67..23e92a1a 100644 --- a/logic/lists/LwjglVersionList.h +++ b/logic/lists/LwjglVersionList.h @@ -53,8 +53,6 @@ class LWJGLVersionList : public QAbstractListModel public: explicit LWJGLVersionList(QObject *parent = 0); - static LWJGLVersionList &get(); - bool isLoaded() { return m_vlist.length() > 0; } const PtrLWJGLVersion getVersion(const QString &versionName); diff --git a/logic/lists/MinecraftVersionList.cpp b/logic/lists/MinecraftVersionList.cpp index 42fb1b50..86ba0792 100644 --- a/logic/lists/MinecraftVersionList.cpp +++ b/logic/lists/MinecraftVersionList.cpp @@ -34,10 +34,8 @@ #define ASSETS_URLBASE "http://assets.minecraft.net/" #define MCN_URLBASE "http://sonicrules.org/mcnweb.py" -MinecraftVersionList mcVList; - MinecraftVersionList::MinecraftVersionList(QObject *parent) : - InstVersionList(parent) + BaseVersionList(parent) { } @@ -52,7 +50,7 @@ bool MinecraftVersionList::isLoaded() return m_loaded; } -const InstVersionPtr MinecraftVersionList::at(int i) const +const BaseVersionPtr MinecraftVersionList::at(int i) const { return m_vlist.at(i); } @@ -62,11 +60,11 @@ int MinecraftVersionList::count() const return m_vlist.count(); } -bool cmpVersions(InstVersionPtr first, InstVersionPtr second) +bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second) { - const InstVersion & left = *first; - const InstVersion & right = *second; - return left > right; + auto left = first.dynamicCast<MinecraftVersion>(); + auto right = second.dynamicCast<MinecraftVersion>(); + return left->timestamp > right->timestamp; } void MinecraftVersionList::sort() @@ -76,7 +74,7 @@ void MinecraftVersionList::sort() endResetModel(); } -InstVersionPtr MinecraftVersionList::getLatestStable() const +BaseVersionPtr MinecraftVersionList::getLatestStable() const { for (int i = 0; i < m_vlist.length(); i++) { @@ -86,15 +84,10 @@ InstVersionPtr MinecraftVersionList::getLatestStable() const return m_vlist.at(i); } } - return InstVersionPtr(); -} - -MinecraftVersionList &MinecraftVersionList::getMainList() -{ - return mcVList; + return BaseVersionPtr(); } -void MinecraftVersionList::updateListData(QList<InstVersionPtr > versions) +void MinecraftVersionList::updateListData(QList<BaseVersionPtr > versions) { beginResetModel(); m_vlist = versions; @@ -214,7 +207,7 @@ void MCVListLoadTask::list_downloaded() } QJsonArray versions = root.value("versions").toArray(); - QList<InstVersionPtr > tempList; + QList<BaseVersionPtr > tempList; for (int i = 0; i < versions.count(); i++) { bool is_snapshot = false; @@ -280,7 +273,7 @@ void MCVListLoadTask::list_downloaded() // Now, we construct the version object and add it to the list. QSharedPointer<MinecraftVersion> mcVersion(new MinecraftVersion()); - mcVersion->name = mcVersion->descriptor = versionID; + mcVersion->m_name = mcVersion->m_descriptor = versionID; mcVersion->timestamp = versionTime.toMSecsSinceEpoch(); mcVersion->download_url = dlUrl; mcVersion->is_latest = is_latest; @@ -293,8 +286,3 @@ void MCVListLoadTask::list_downloaded() emitSucceeded(); return; } - -// FIXME: we should have a local cache of the version list and a local cache of version data -bool MCVListLoadTask::loadFromVList() -{ -} diff --git a/logic/lists/MinecraftVersionList.h b/logic/lists/MinecraftVersionList.h index 0477379f..8937ba7b 100644 --- a/logic/lists/MinecraftVersionList.h +++ b/logic/lists/MinecraftVersionList.h @@ -20,14 +20,14 @@ #include <QSet> #include <QSharedPointer> -#include "InstVersionList.h" +#include "BaseVersionList.h" #include "logic/tasks/Task.h" #include "logic/MinecraftVersion.h" class MCVListLoadTask; class QNetworkReply; -class MinecraftVersionList : public InstVersionList +class MinecraftVersionList : public BaseVersionList { Q_OBJECT public: @@ -37,25 +37,19 @@ public: virtual Task *getLoadTask(); virtual bool isLoaded(); - virtual const InstVersionPtr at(int i) const; + virtual const BaseVersionPtr at(int i) const; virtual int count() const; virtual void sort(); - virtual InstVersionPtr getLatestStable() const; - - /*! - * Gets the main version list instance. - */ - static MinecraftVersionList &getMainList(); - + virtual BaseVersionPtr getLatestStable() const; protected: - QList<InstVersionPtr > m_vlist; + QList<BaseVersionPtr> m_vlist; bool m_loaded; protected slots: - virtual void updateListData(QList<InstVersionPtr > versions); + virtual void updateListData(QList<BaseVersionPtr > versions); }; class MCVListLoadTask : public Task @@ -72,9 +66,6 @@ protected slots: void list_downloaded(); protected: - //! Loads versions from Mojang's official version list. - bool loadFromVList(); - QNetworkReply *vlistReply; MinecraftVersionList *m_list; MinecraftVersion *m_currentStable; |