NOISSUE less jumpy download progress bars and redirect URL fix

This commit is contained in:
Petr Mrázek 2017-04-30 02:54:37 +02:00
parent 1be99b075a
commit 794102b32c
4 changed files with 31 additions and 18 deletions

View File

@ -106,6 +106,17 @@ void Download::executeTask()
void Download::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) 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_progressTotal = bytesTotal;
m_progress = bytesReceived; m_progress = bytesReceived;
emit progress(bytesReceived, bytesTotal); 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); QVariant redirect = m_reply->header(QNetworkRequest::LocationHeader);
QString redirectURL; QString redirectURL;
@ -151,10 +162,15 @@ bool Download::handleRedirect()
redirectURL = m_reply->url().scheme() + ":" + data; redirectURL = m_reply->url().scheme() + ":" + data;
} }
} }
return redirectURL;
}
bool Download::handleRedirect()
{
auto redirectURL = getRedirect();
if (!redirectURL.isEmpty()) if (!redirectURL.isEmpty())
{ {
m_url = QUrl(redirect.toString()); m_url = QUrl(redirectURL);
qDebug() << "Following redirect to " << m_url.toString();
start(); start();
return true; return true;
} }

View File

@ -53,6 +53,7 @@ public: /* methods */
bool canAbort() const override; bool canAbort() const override;
private: /* methods */ private: /* methods */
QString getRedirect();
bool handleRedirect(); bool handleRedirect();
protected slots: protected slots:

View File

@ -69,14 +69,16 @@ void NetJob::partProgress(qint64 bytesReceived, qint64 bytesTotal)
void NetJob::setPartProgress(int index, qint64 bytesReceived, qint64 bytesTotal) void NetJob::setPartProgress(int index, qint64 bytesReceived, qint64 bytesTotal)
{ {
auto &slot = m_parts[index]; auto &slot = m_parts[index];
current_progress -= slot.current_progress;
slot.current_progress = bytesReceived; slot.current_progress = bytesReceived;
current_progress += slot.current_progress;
total_progress -= slot.total_progress;
slot.total_progress = bytesTotal; 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); setProgress(current_progress, total_progress);
} }
@ -196,14 +198,8 @@ void NetJob::addNetAction(NetActionPtr action)
} }
m_parts.append(pi); 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()) if (isRunning())
{ {
setProgress(current_progress, total_progress); m_todo.enqueue(m_parts.size() - 1);
connectAction(action.get());
action->start();
} }
} }

View File

@ -76,7 +76,7 @@ private:
QSet<int> m_doing; QSet<int> m_doing;
QSet<int> m_done; QSet<int> m_done;
QSet<int> m_failed; QSet<int> m_failed;
qint64 current_progress = 0; //qint64 current_progress = 0;
qint64 total_progress = 0; //qint64 total_progress = 0;
bool m_aborted = false; bool m_aborted = false;
}; };