From 794102b32cb9b9c0ddb0c8268c572acb256dd6ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 30 Apr 2017 02:54:37 +0200 Subject: [PATCH] NOISSUE less jumpy download progress bars and redirect URL fix --- api/logic/net/Download.cpp | 22 +++++++++++++++++++--- api/logic/net/Download.h | 1 + api/logic/net/NetJob.cpp | 22 +++++++++------------- api/logic/net/NetJob.h | 4 ++-- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/api/logic/net/Download.cpp b/api/logic/net/Download.cpp index b346d5e0..97b03ac2 100644 --- a/api/logic/net/Download.cpp +++ b/api/logic/net/Download.cpp @@ -106,6 +106,17 @@ void Download::executeTask() void Download::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { + // FIXME: ignore unknown size. for now. + if(bytesTotal == -1) + { + return; + } + // FIXME: ignore redirects... for now. + auto redirectURL = getRedirect(); + if(!redirectURL.isEmpty()) + { + return; + } m_progressTotal = bytesTotal; m_progress = bytesReceived; emit progress(bytesReceived, bytesTotal); @@ -134,7 +145,7 @@ void Download::downloadError(QNetworkReply::NetworkError error) } } -bool Download::handleRedirect() +QString Download::getRedirect() { QVariant redirect = m_reply->header(QNetworkRequest::LocationHeader); QString redirectURL; @@ -151,10 +162,15 @@ bool Download::handleRedirect() redirectURL = m_reply->url().scheme() + ":" + data; } } + return redirectURL; +} + +bool Download::handleRedirect() +{ + auto redirectURL = getRedirect(); if (!redirectURL.isEmpty()) { - m_url = QUrl(redirect.toString()); - qDebug() << "Following redirect to " << m_url.toString(); + m_url = QUrl(redirectURL); start(); return true; } diff --git a/api/logic/net/Download.h b/api/logic/net/Download.h index 31e51792..0188a8ae 100644 --- a/api/logic/net/Download.h +++ b/api/logic/net/Download.h @@ -53,6 +53,7 @@ public: /* methods */ bool canAbort() const override; private: /* methods */ + QString getRedirect(); bool handleRedirect(); protected slots: diff --git a/api/logic/net/NetJob.cpp b/api/logic/net/NetJob.cpp index cf04998f..ff2c711b 100644 --- a/api/logic/net/NetJob.cpp +++ b/api/logic/net/NetJob.cpp @@ -69,14 +69,16 @@ void NetJob::partProgress(qint64 bytesReceived, qint64 bytesTotal) void NetJob::setPartProgress(int index, qint64 bytesReceived, qint64 bytesTotal) { auto &slot = m_parts[index]; - - current_progress -= slot.current_progress; slot.current_progress = bytesReceived; - current_progress += slot.current_progress; - - total_progress -= slot.total_progress; slot.total_progress = bytesTotal; - total_progress += slot.total_progress; + qint64 current_progress = m_done.count() * 100; + qint64 total_progress = m_parts.count() * 100; + for(auto iter = m_doing.begin(); iter != m_doing.end(); iter++) + { + auto &part = m_parts[*iter]; + float percentage = (float(part.current_progress) / float(part.total_progress)) * 100.0f; + current_progress += (qint64) percentage; + } setProgress(current_progress, total_progress); } @@ -196,14 +198,8 @@ void NetJob::addNetAction(NetActionPtr action) } m_parts.append(pi); - total_progress += pi.total_progress; - current_progress += pi.current_progress; - - // if this is already running, the action needs to be started right away! if (isRunning()) { - setProgress(current_progress, total_progress); - connectAction(action.get()); - action->start(); + m_todo.enqueue(m_parts.size() - 1); } } diff --git a/api/logic/net/NetJob.h b/api/logic/net/NetJob.h index 637c4af5..5503cd24 100644 --- a/api/logic/net/NetJob.h +++ b/api/logic/net/NetJob.h @@ -76,7 +76,7 @@ private: QSet m_doing; QSet m_done; QSet m_failed; - qint64 current_progress = 0; - qint64 total_progress = 0; + //qint64 current_progress = 0; + //qint64 total_progress = 0; bool m_aborted = false; };