From 9d03a9c1e3b9c24a4146adedb2971591d23b037a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 22 Sep 2013 14:00:37 +0200 Subject: Cache forge version list (it's huge) --- logic/lists/ForgeVersionList.cpp | 119 ++++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 59 deletions(-) (limited to 'logic/lists') diff --git a/logic/lists/ForgeVersionList.cpp b/logic/lists/ForgeVersionList.cpp index 9205e70f..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(); 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 versions) +void ForgeVersionList::updateListData(QList versions) { beginResetModel(); m_vlist = versions; @@ -154,104 +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()->m_data; - - + QByteArray data; + { + auto DlJob = listJob->first(); + auto filename = DlJob.dynamicCast()->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 tempList; + + QList 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); + installer_filename = installer_url.mid(lastSlash + 1); } } - if(valid) + if (valid) { // Now, we construct the version object and add it to the list. QSharedPointer fVersion(new ForgeVersion()); @@ -260,7 +266,7 @@ void ForgeListLoadTask::list_downloaded() fVersion->installer_url = installer_url; fVersion->jobbuildver = jobbuildver; fVersion->mcver = mcver; - if(installer_filename.isEmpty()) + if (installer_filename.isEmpty()) fVersion->filename = filename; else fVersion->filename = installer_filename; @@ -269,12 +275,7 @@ void ForgeListLoadTask::list_downloaded() } } m_list->updateListData(tempList); - + emitSucceeded(); return; } - - - - - -- cgit v1.2.3