From 042f3ef55c0b469f438542152c4eb02b0789ea3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 14 Aug 2016 02:33:31 +0200 Subject: GH-352 Make OneSix instance update downloads cancellable --- api/logic/net/Download.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) (limited to 'api/logic/net/Download.cpp') diff --git a/api/logic/net/Download.cpp b/api/logic/net/Download.cpp index 70fe7608..7610cae3 100644 --- a/api/logic/net/Download.cpp +++ b/api/logic/net/Download.cpp @@ -65,6 +65,12 @@ void Download::addValidator(Validator * v) void Download::start() { + if(m_status == Job_Aborted) + { + qWarning() << "Attempt to start an aborted Download:" << m_url.toString(); + emit aborted(m_index_within_job); + return; + } QNetworkRequest request(m_url); m_status = m_sink->init(request); switch(m_status) @@ -80,6 +86,8 @@ void Download::start() case Job_Failed: emit failed(m_index_within_job); return; + case Job_Aborted: + return; } request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0"); @@ -103,9 +111,17 @@ void Download::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) void Download::downloadError(QNetworkReply::NetworkError error) { - // error happened during download. - qCritical() << "Failed " << m_url.toString() << " with reason " << error; - m_status = Job_Failed; + if(error == QNetworkReply::OperationCanceledError) + { + qCritical() << "Aborted " << m_url.toString(); + m_status = Job_Aborted; + } + else + { + // error happened during download. + qCritical() << "Failed " << m_url.toString() << " with reason " << error; + m_status = Job_Failed; + } } bool Download::handleRedirect() @@ -154,6 +170,14 @@ void Download::downloadFinished() emit failed(m_index_within_job); return; } + else if(m_status == Job_Aborted) + { + qDebug() << "Download aborted in previous step:" << m_url.toString(); + m_sink->abort(); + m_reply.reset(); + emit aborted(m_index_within_job); + return; + } // make sure we got all the remaining data, if any auto data = m_reply->readAll(); @@ -197,3 +221,21 @@ void Download::downloadReadyRead() } } + +bool Net::Download::abort() +{ + if(m_reply) + { + m_reply->abort(); + } + else + { + m_status = Job_Aborted; + } + return true; +} + +bool Net::Download::canAbort() +{ + return true; +} -- cgit v1.2.3