summaryrefslogtreecommitdiffstats
path: root/api/logic/updater
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2016-05-28 19:54:17 +0200
committerPetr Mrázek <peterix@gmail.com>2016-06-05 23:55:39 +0200
commita1abbd9e05c80584d831b1d12c27c5f7d731cece (patch)
tree3324eaf37efa228e07a0e3136952673f0bc3405a /api/logic/updater
parenta750f6e63c783730380c19788deff2acfb3f4836 (diff)
downloadMultiMC-a1abbd9e05c80584d831b1d12c27c5f7d731cece.tar
MultiMC-a1abbd9e05c80584d831b1d12c27c5f7d731cece.tar.gz
MultiMC-a1abbd9e05c80584d831b1d12c27c5f7d731cece.tar.lz
MultiMC-a1abbd9e05c80584d831b1d12c27c5f7d731cece.tar.xz
MultiMC-a1abbd9e05c80584d831b1d12c27c5f7d731cece.zip
NOISSUE refactor *Download into more, smaller pieces
* Download is now Download. * Download uses Sink subclasses to process various events. * Validators can be used to further customize the Sink behaviour.
Diffstat (limited to 'api/logic/updater')
-rw-r--r--api/logic/updater/DownloadTask.cpp11
-rw-r--r--api/logic/updater/DownloadTask.h6
-rw-r--r--api/logic/updater/GoUpdate.cpp8
-rw-r--r--api/logic/updater/UpdateChecker.cpp51
-rw-r--r--api/logic/updater/UpdateChecker.h12
5 files changed, 41 insertions, 47 deletions
diff --git a/api/logic/updater/DownloadTask.cpp b/api/logic/updater/DownloadTask.cpp
index 6947e8bf..9bb31695 100644
--- a/api/logic/updater/DownloadTask.cpp
+++ b/api/logic/updater/DownloadTask.cpp
@@ -43,22 +43,19 @@ void DownloadTask::loadVersionInfo()
{
setStatus(tr("Loading version information..."));
- m_currentVersionFileListDownload.reset();
- m_newVersionFileListDownload.reset();
-
NetJob *netJob = new NetJob("Version Info");
// Find the index URL.
QUrl newIndexUrl = QUrl(m_status.newRepoUrl).resolved(QString::number(m_status.newVersionId) + ".json");
qDebug() << m_status.newRepoUrl << " turns into " << newIndexUrl;
- netJob->addNetAction(m_newVersionFileListDownload = ByteArrayDownload::make(newIndexUrl));
+ netJob->addNetAction(m_newVersionFileListDownload = Net::Download::makeByteArray(newIndexUrl, &newVersionFileListData));
// If we have a current version URL, get that one too.
if (!m_status.currentRepoUrl.isEmpty())
{
QUrl cIndexUrl = QUrl(m_status.currentRepoUrl).resolved(QString::number(m_status.currentVersionId) + ".json");
- netJob->addNetAction(m_currentVersionFileListDownload = ByteArrayDownload::make(cIndexUrl));
+ netJob->addNetAction(m_currentVersionFileListDownload = Net::Download::makeByteArray(cIndexUrl, &currentVersionFileListData));
qDebug() << m_status.currentRepoUrl << " turns into " << cIndexUrl;
}
@@ -92,7 +89,7 @@ void DownloadTask::processDownloadedVersionInfo()
setStatus(tr("Reading file list for new version..."));
qDebug() << "Reading file list for new version...";
QString error;
- if (!parseVersionInfo(m_newVersionFileListDownload->m_data, m_newVersionFileList, error))
+ if (!parseVersionInfo(newVersionFileListData, m_newVersionFileList, error))
{
qCritical() << error;
emitFailed(error);
@@ -106,7 +103,7 @@ void DownloadTask::processDownloadedVersionInfo()
qDebug() << "Reading file list for current version...";
// if this fails, it's not a complete loss.
QString error;
- if(!parseVersionInfo( m_currentVersionFileListDownload->m_data, m_currentVersionFileList, error))
+ if(!parseVersionInfo( currentVersionFileListData, m_currentVersionFileList, error))
{
qDebug() << error << "This is not a fatal error.";
}
diff --git a/api/logic/updater/DownloadTask.h b/api/logic/updater/DownloadTask.h
index 83b4a142..f6e1288e 100644
--- a/api/logic/updater/DownloadTask.h
+++ b/api/logic/updater/DownloadTask.h
@@ -64,8 +64,10 @@ protected:
void loadVersionInfo();
NetJobPtr m_vinfoNetJob;
- ByteArrayDownloadPtr m_currentVersionFileListDownload;
- ByteArrayDownloadPtr m_newVersionFileListDownload;
+ QByteArray currentVersionFileListData;
+ QByteArray newVersionFileListData;
+ Net::Download::Ptr m_currentVersionFileListDownload;
+ Net::Download::Ptr m_newVersionFileListDownload;
NetJobPtr m_filesNetJob;
diff --git a/api/logic/updater/GoUpdate.cpp b/api/logic/updater/GoUpdate.cpp
index 4e465d5c..716048a0 100644
--- a/api/logic/updater/GoUpdate.cpp
+++ b/api/logic/updater/GoUpdate.cpp
@@ -4,6 +4,9 @@
#include <QFile>
#include <FileSystem.h>
+#include "net/Download.h"
+#include "net/ChecksumValidator.h"
+
namespace GoUpdate
{
@@ -189,8 +192,9 @@ bool processFileLists
// We need to download the file to the updatefiles folder and add a task
// to copy it to its install path.
- auto download = MD5EtagDownload::make(source.url, dlPath);
- download->m_expected_md5 = entry.md5;
+ auto download = Net::Download::makeFile(source.url, dlPath);
+ auto rawMd5 = QByteArray::fromHex(entry.md5.toLatin1());
+ download->addValidator(new Net::ChecksumValidator(QCryptographicHash::Md5, rawMd5));
job->addNetAction(download);
ops.append(Operation::CopyOp(dlPath, entry.path, entry.mode));
}
diff --git a/api/logic/updater/UpdateChecker.cpp b/api/logic/updater/UpdateChecker.cpp
index 1cdac916..7dc5823e 100644
--- a/api/logic/updater/UpdateChecker.cpp
+++ b/api/logic/updater/UpdateChecker.cpp
@@ -28,11 +28,6 @@ UpdateChecker::UpdateChecker(QString channelListUrl, QString currentChannel, int
m_channelListUrl = channelListUrl;
m_currentChannel = currentChannel;
m_currentBuild = currentBuild;
-
- m_updateChecking = false;
- m_chanListLoading = false;
- m_checkUpdateWaiting = false;
- m_chanListLoaded = false;
}
QList<UpdateChecker::ChannelListEntry> UpdateChecker::getChannelList() const
@@ -93,9 +88,8 @@ void UpdateChecker::checkForUpdate(QString updateChannel, bool notifyNoUpdate)
QUrl indexUrl = QUrl(m_newRepoUrl).resolved(QUrl("index.json"));
auto job = new NetJob("GoUpdate Repository Index");
- job->addNetAction(ByteArrayDownload::make(indexUrl));
- connect(job, &NetJob::succeeded, [this, notifyNoUpdate]()
- { updateCheckFinished(notifyNoUpdate); });
+ job->addNetAction(Net::Download::makeByteArray(indexUrl, &indexData));
+ connect(job, &NetJob::succeeded, [this, notifyNoUpdate](){ updateCheckFinished(notifyNoUpdate); });
connect(job, &NetJob::failed, this, &UpdateChecker::updateCheckFailed);
indexJob.reset(job);
job->start();
@@ -106,19 +100,15 @@ void UpdateChecker::updateCheckFinished(bool notifyNoUpdate)
qDebug() << "Finished downloading repo index. Checking for new versions.";
QJsonParseError jsonError;
- QByteArray data;
- {
- ByteArrayDownloadPtr dl =
- std::dynamic_pointer_cast<ByteArrayDownload>(indexJob->first());
- data = dl->m_data;
- indexJob.reset();
- }
+ indexJob.reset();
- QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
+ QJsonDocument jsonDoc = QJsonDocument::fromJson(indexData, &jsonError);
+ indexData.clear();
if (jsonError.error != QJsonParseError::NoError || !jsonDoc.isObject())
{
qCritical() << "Failed to parse GoUpdate repository index. JSON error"
<< jsonError.errorString() << "at offset" << jsonError.offset;
+ m_updateChecking = false;
return;
}
@@ -130,6 +120,7 @@ void UpdateChecker::updateCheckFinished(bool notifyNoUpdate)
{
qCritical() << "Failed to check for updates. API version mismatch. We're using"
<< API_VERSION << "server has" << apiVersion;
+ m_updateChecking = false;
return;
}
@@ -165,7 +156,6 @@ void UpdateChecker::updateCheckFinished(bool notifyNoUpdate)
{
emit noUpdateFound();
}
-
m_updateChecking = false;
}
@@ -178,6 +168,12 @@ void UpdateChecker::updateChanList(bool notifyNoUpdate)
{
qDebug() << "Loading the channel list.";
+ if (m_chanListLoading)
+ {
+ qDebug() << "Ignoring channel list update request. Already grabbing channel list.";
+ return;
+ }
+
if (m_channelListUrl.isEmpty())
{
qCritical() << "Failed to update channel list. No channel list URL set."
@@ -188,9 +184,8 @@ void UpdateChecker::updateChanList(bool notifyNoUpdate)
m_chanListLoading = true;
NetJob *job = new NetJob("Update System Channel List");
- job->addNetAction(ByteArrayDownload::make(QUrl(m_channelListUrl)));
- connect(job, &NetJob::succeeded, [this, notifyNoUpdate]()
- { chanListDownloadFinished(notifyNoUpdate); });
+ job->addNetAction(Net::Download::makeByteArray(QUrl(m_channelListUrl), &chanlistData));
+ connect(job, &NetJob::succeeded, [this, notifyNoUpdate]() { chanListDownloadFinished(notifyNoUpdate); });
QObject::connect(job, &NetJob::failed, this, &UpdateChecker::chanListDownloadFailed);
chanListJob.reset(job);
job->start();
@@ -198,21 +193,16 @@ void UpdateChecker::updateChanList(bool notifyNoUpdate)
void UpdateChecker::chanListDownloadFinished(bool notifyNoUpdate)
{
- QByteArray data;
- {
- ByteArrayDownloadPtr dl =
- std::dynamic_pointer_cast<ByteArrayDownload>(chanListJob->first());
- data = dl->m_data;
- chanListJob.reset();
- }
+ chanListJob.reset();
QJsonParseError jsonError;
- QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
+ QJsonDocument jsonDoc = QJsonDocument::fromJson(chanlistData, &jsonError);
+ chanlistData.clear();
if (jsonError.error != QJsonParseError::NoError)
{
// TODO: Report errors to the user.
- qCritical() << "Failed to parse channel list JSON:" << jsonError.errorString() << "at"
- << jsonError.offset;
+ qCritical() << "Failed to parse channel list JSON:" << jsonError.errorString() << "at" << jsonError.offset;
+ m_chanListLoading = false;
return;
}
@@ -225,6 +215,7 @@ void UpdateChecker::chanListDownloadFinished(bool notifyNoUpdate)
qCritical()
<< "Failed to check for updates. Channel list format version mismatch. We're using"
<< CHANLIST_FORMAT << "server has" << formatVersion;
+ m_chanListLoading = false;
return;
}
diff --git a/api/logic/updater/UpdateChecker.h b/api/logic/updater/UpdateChecker.h
index c7fad10e..39026b62 100644
--- a/api/logic/updater/UpdateChecker.h
+++ b/api/logic/updater/UpdateChecker.h
@@ -18,8 +18,6 @@
#include "net/NetJob.h"
#include "GoUpdate.h"
-#include <QUrl>
-
#include "multimc_logic_export.h"
class MULTIMC_LOGIC_EXPORT UpdateChecker : public QObject
@@ -78,7 +76,9 @@ private:
friend class UpdateCheckerTest;
NetJobPtr indexJob;
+ QByteArray indexData;
NetJobPtr chanListJob;
+ QByteArray chanlistData;
QString m_channelListUrl;
@@ -88,24 +88,24 @@ private:
* True while the system is checking for updates.
* If checkForUpdate is called while this is true, it will be ignored.
*/
- bool m_updateChecking;
+ bool m_updateChecking = false;
/*!
* True if the channel list has loaded.
* If this is false, trying to check for updates will call updateChanList first.
*/
- bool m_chanListLoaded;
+ bool m_chanListLoaded = false;
/*!
* Set to true while the channel list is currently loading.
*/
- bool m_chanListLoading;
+ bool m_chanListLoading = false;
/*!
* Set to true when checkForUpdate is called while the channel list isn't loaded.
* When the channel list finishes loading, if this is true, the update checker will check for updates.
*/
- bool m_checkUpdateWaiting;
+ bool m_checkUpdateWaiting = false;
/*!
* if m_checkUpdateWaiting, this is the last used update channel