diff options
author | Petr Mrázek <peterix@gmail.com> | 2013-09-22 14:03:05 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2013-09-22 14:03:05 +0200 |
commit | 1bed5e4023f503cb95a914c1e6886e045b7f34e2 (patch) | |
tree | 6c2a2eb34b93bdd24e7db1f9378b231084c0b27a /logic/lists | |
parent | 930b07afd4229e952d0cd47ca62cd94235499a0c (diff) | |
parent | 9d03a9c1e3b9c24a4146adedb2971591d23b037a (diff) | |
download | MultiMC-1bed5e4023f503cb95a914c1e6886e045b7f34e2.tar MultiMC-1bed5e4023f503cb95a914c1e6886e045b7f34e2.tar.gz MultiMC-1bed5e4023f503cb95a914c1e6886e045b7f34e2.tar.lz MultiMC-1bed5e4023f503cb95a914c1e6886e045b7f34e2.tar.xz MultiMC-1bed5e4023f503cb95a914c1e6886e045b7f34e2.zip |
Merge branch 'feature_onesix_forge' into develop
Diffstat (limited to 'logic/lists')
-rw-r--r-- | logic/lists/ForgeVersionList.cpp | 118 | ||||
-rw-r--r-- | logic/lists/ForgeVersionList.h | 52 |
2 files changed, 94 insertions, 76 deletions
diff --git a/logic/lists/ForgeVersionList.cpp b/logic/lists/ForgeVersionList.cpp index 412c04fe..721f2c0a 100644 --- a/logic/lists/ForgeVersionList.cpp +++ b/logic/lists/ForgeVersionList.cpp @@ -3,7 +3,7 @@ * 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 @@ -25,10 +25,8 @@ #define JSON_URL "http://files.minecraftforge.net/minecraftforge/json" - -ForgeVersionList::ForgeVersionList(QObject* parent): BaseVersionList(parent) +ForgeVersionList::ForgeVersionList(QObject *parent) : BaseVersionList(parent) { - } Task *ForgeVersionList::getLoadTask() @@ -51,19 +49,19 @@ int ForgeVersionList::count() const return m_vlist.count(); } -int ForgeVersionList::columnCount(const QModelIndex& parent) const +int ForgeVersionList::columnCount(const QModelIndex &parent) const { - return 3; + return 3; } QVariant ForgeVersionList::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); - + if (index.row() > count()) return QVariant(); - + auto version = m_vlist[index.row()].dynamicCast<ForgeVersion>(); switch (role) { @@ -72,22 +70,22 @@ QVariant ForgeVersionList::data(const QModelIndex &index, int role) const { case 0: return version->name(); - + case 1: return version->mcver; - + case 2: return version->typeString(); default: return QVariant(); } - + case Qt::ToolTipRole: return version->descriptor(); - + case VersionPointerRole: return qVariantFromValue(m_vlist[index.row()]); - + default: return QVariant(); } @@ -102,33 +100,33 @@ QVariant ForgeVersionList::headerData(int section, Qt::Orientation orientation, { case 0: return "Version"; - + case 1: return "Minecraft"; - + case 2: return "Type"; - + default: return QVariant(); } - + case Qt::ToolTipRole: switch (section) { case 0: return "The name of the version."; - + case 1: return "Minecraft version"; - + case 2: return "The version's type."; - + default: return QVariant(); } - + default: return QVariant(); } @@ -139,7 +137,7 @@ BaseVersionPtr ForgeVersionList::getLatestStable() const return BaseVersionPtr(); } -void ForgeVersionList::updateListData(QList<BaseVersionPtr > versions) +void ForgeVersionList::updateListData(QList<BaseVersionPtr> versions) { beginResetModel(); m_vlist = versions; @@ -154,101 +152,112 @@ void ForgeVersionList::sort() // NO-OP for now } - -ForgeListLoadTask::ForgeListLoadTask(ForgeVersionList* vlist): Task() +ForgeListLoadTask::ForgeListLoadTask(ForgeVersionList *vlist) : Task() { m_list = vlist; } - void ForgeListLoadTask::executeTask() { auto job = new DownloadJob("Version index"); - job->add(QUrl(JSON_URL)); + // we do not care if the version is stale or not. + auto forgeListEntry = MMC->metacache()->resolveEntry("minecraftforge", "list.json"); + job->add(QUrl(JSON_URL), forgeListEntry); 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)), SIGNAL(progress(qint64,qint64))); + connect(listJob.data(), SIGNAL(progress(qint64, qint64)), SIGNAL(progress(qint64, qint64))); listJob->start(); } void ForgeListLoadTask::list_downloaded() { - auto DlJob = listJob->first(); - auto data = DlJob.dynamicCast<ByteArrayDownload>()->m_data; - - + QByteArray data; + { + auto DlJob = listJob->first(); + auto filename = DlJob.dynamicCast<CacheDownload>()->m_target_path; + QFile listFile(filename); + if(!listFile.open(QIODevice::ReadOnly)) + return; + data = listFile.readAll(); + DlJob.reset(); + } + 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()) + 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()) + if (!root.value("builds").isArray()) { - emitFailed("Error parsing version list JSON: version list object is missing 'builds' array"); + emitFailed( + "Error parsing version list JSON: version list object is missing 'builds' array"); return; } QJsonArray builds = root.value("builds").toArray(); - - QList<BaseVersionPtr > tempList; + + QList<BaseVersionPtr> tempList; for (int i = 0; i < builds.count(); i++) { // Load the version info. - if(!builds[i].isObject()) + if (!builds[i].isObject()) { - //FIXME: log this somewhere + // FIXME: log this somewhere continue; } QJsonObject obj = builds[i].toObject(); int build_nr = obj.value("build").toDouble(0); - if(!build_nr) + if (!build_nr) continue; QJsonArray files = obj.value("files").toArray(); QString url, jobbuildver, mcver, buildtype, filename; QString changelog_url, installer_url; + QString installer_filename; bool valid = false; - for(int j = 0; j < files.count(); j++) + for (int j = 0; j < files.count(); j++) { - if(!files[j].isObject()) + if (!files[j].isObject()) continue; QJsonObject file = files[j].toObject(); buildtype = file.value("buildtype").toString(); - if((buildtype == "client" || buildtype == "universal") && !valid) + 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); + filename = url.mid(lastSlash + 1); valid = true; } - else if(buildtype == "changelog") + else if (buildtype == "changelog") { QString ext = file.value("ext").toString(); - if(ext.isEmpty()) + if (ext.isEmpty()) continue; changelog_url = file.value("url").toString(); } - else if(buildtype == "installer") + else if (buildtype == "installer") { installer_url = file.value("url").toString(); + int lastSlash = installer_url.lastIndexOf('/'); + installer_filename = installer_url.mid(lastSlash + 1); } } - if(valid) + if (valid) { // Now, we construct the version object and add it to the list. QSharedPointer<ForgeVersion> fVersion(new ForgeVersion()); @@ -257,13 +266,16 @@ void ForgeListLoadTask::list_downloaded() fVersion->installer_url = installer_url; fVersion->jobbuildver = jobbuildver; fVersion->mcver = mcver; - fVersion->filename = filename; + if (installer_filename.isEmpty()) + fVersion->filename = filename; + else + fVersion->filename = installer_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 index ca6b27bc..613de8a6 100644 --- a/logic/lists/ForgeVersionList.h +++ b/logic/lists/ForgeVersionList.h @@ -3,7 +3,7 @@ * 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 @@ -33,19 +33,22 @@ struct ForgeVersion : public BaseVersion virtual QString descriptor() { return filename; - }; + } + ; virtual QString name() { return "Forge " + jobbuildver; - }; + } + ; virtual QString typeString() const { - if(installer_url.isEmpty()) + if (installer_url.isEmpty()) return "Universal"; else return "Installer"; - }; - + } + ; + int m_buildnr = 0; QString universal_url; QString changelog_url; @@ -60,42 +63,45 @@ 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; - - virtual QVariant data(const QModelIndex& index, int role) const; - virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; - virtual int columnCount(const QModelIndex& parent) const; - + + virtual QVariant data(const QModelIndex &index, int role) const; + virtual QVariant headerData(int section, Qt::Orientation orientation, + int role) const; + virtual int columnCount(const QModelIndex &parent) const; + protected: QList<BaseVersionPtr> m_vlist; - + bool m_loaded; - -protected slots: - virtual void updateListData(QList<BaseVersionPtr > versions); + +protected +slots: + virtual void updateListData(QList<BaseVersionPtr> versions); }; class ForgeListLoadTask : public Task { Q_OBJECT - + public: explicit ForgeListLoadTask(ForgeVersionList *vlist); - + virtual void executeTask(); - -protected slots: + +protected +slots: void list_downloaded(); - + protected: DownloadJobPtr listJob; ForgeVersionList *m_list; |