summaryrefslogtreecommitdiffstats
path: root/api/logic/net/Download.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'api/logic/net/Download.cpp')
-rw-r--r--api/logic/net/Download.cpp48
1 files changed, 45 insertions, 3 deletions
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;
+}