From 6aa9bd0f77dcb5128167fae62e32aa5252fe85c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 2 Dec 2013 00:55:24 +0100 Subject: Renew the updater branch Now with some actual consensus on what the updater will do! --- logic/GoUpdate.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ logic/GoUpdate.h | 43 ++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 logic/GoUpdate.cpp create mode 100644 logic/GoUpdate.h (limited to 'logic') diff --git a/logic/GoUpdate.cpp b/logic/GoUpdate.cpp new file mode 100644 index 00000000..6ac53d19 --- /dev/null +++ b/logic/GoUpdate.cpp @@ -0,0 +1,99 @@ + +#include "GoUpdate.h" + +#include "config.h" +#include "logger/QsLog.h" + +GoUpdate::GoUpdate() +{ + currentBuildIndex = VERSION_BUILD; + builderName = VERSION_BUILD_TYPE; + repoUrlBase = VERSION_REPO; +} + +void GoUpdate::updateCheckFailed() +{ + // TODO: log errors better + QLOG_ERROR() << "Update check failed for reasons unknown."; +} + +void GoUpdate::updateCheckFinished() +{ + QJsonParseError jsonError; + QByteArray data; + { + ByteArrayDownloadPtr dl = + std::dynamic_pointer_cast(index_job->first()); + data = dl->m_data; + index_job.reset(); + } + + QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError); + if (jsonError.error != QJsonParseError::NoError || !jsonDoc.isObject()) + { + return; + } + + QVariant doc = jsonDoc.toVariant(); + auto stuff = doc.toMap(); + + // check api version (or later, branch?) + int ApiVersion = stuff["ApiVersion"].toInt(); + if (ApiVersion != 0) + return; + + // parse and store the channel list + auto parsedChannels = stuff["Channels"].toList(); + for (auto channel : parsedChannels) + { + auto chanMap = channel.toMap(); + channels.append({chanMap["Id"].toString(), chanMap["Name"].toString(), + chanMap["CurrentVersion"].toInt()}); + } + + // parse and store the version list + auto parsedVersions = stuff["Versions"].toList(); + for (auto version : parsedVersions) + { + auto verMap = version.toMap(); + int versionId = verMap["Id"].toInt(); + versions.append({versionId, verMap["Name"].toString()}); + if (currentBuildIndex < versionId) + { + newBuildIndex = versionId; + } + } + + if (newBuildIndex != -1) + { + QLOG_INFO() << "Update is available."; + emit updateAvailable(); + } + else + { + QLOG_INFO() << "Update check finished."; + } +} + +void GoUpdate::checkForUpdate() +{ + if (repoUrlBase == "invalid") + { + return; + } + + auto job = new NetJob("Assets index"); + job->addNetAction( + ByteArrayDownload::make(QUrl(repoUrlBase + "/" + VERSION_BRANCH + "/index.json"))); + connect(job, SIGNAL(succeeded()), SLOT(updateCheckFinished())); + connect(job, SIGNAL(failed()), SLOT(updateCheckFailed())); + index_job.reset(job); + job->start(); +} + +/* + files.multimc.org/lin64/ + Hi Forkkie + files.multimc.org/win32/ + files.multimc.org/lin32/ +*/ diff --git a/logic/GoUpdate.h b/logic/GoUpdate.h new file mode 100644 index 00000000..756a71cf --- /dev/null +++ b/logic/GoUpdate.h @@ -0,0 +1,43 @@ +#pragma once +#include "net/NetJob.h" + +class GoUpdate : public QObject +{ + Q_OBJECT + +public: + struct version_channel + { + QString id; + QString name; + int latestVersion; + }; + + struct version_summary + { + int id; + QString name; + }; + +signals: + void updateAvailable(); + +private slots: + void updateCheckFinished(); + void updateCheckFailed(); + +public: + GoUpdate(); + void checkForUpdate(); +private: + NetJobPtr index_job; + NetJobPtr fromto_job; + + QString repoUrlBase; + QString builderName; + int currentBuildIndex; + int newBuildIndex = -1; + + QList versions; + QList channels; +}; -- cgit v1.2.3