Write downloads to disk and enable download resume

This enables the download method in Fetcher to resume in case a partial
download is already saved to disk.
For full implementation of download resumes, more changes are required,
because the current application will automatically clean up files that
don't match the expected size at startup.
This commit is contained in:
Bart De Vries 2021-06-04 21:34:50 +02:00
parent cb714eb2b1
commit d24b7ed7d0
2 changed files with 34 additions and 6 deletions

View File

@ -360,17 +360,44 @@ QNetworkReply *Fetcher::download(const QString &url, const QString &filePath) co
{
QNetworkRequest request((QUrl(url)));
request.setTransferTimeout();
QFile *file = new QFile(filePath);
if (file->exists() && file->size() > 0) {
// try to resume download
qDebug() << "Resuming download at" << file->size() << "bytes";
QByteArray rangeHeaderValue = QByteArray("bytes=") + QByteArray::number(file->size()) + QByteArray("-");
request.setRawHeader(QByteArray("Range"), rangeHeaderValue);
file->open(QIODevice::WriteOnly | QIODevice::Append);
} else {
qDebug() << "Starting new download";
file->open(QIODevice::WriteOnly);
}
QNetworkReply *reply = get(request);
connect(reply, &QNetworkReply::finished, this, [=]() {
if (reply->isOpen()) {
connect(reply, &QNetworkReply::readyRead, this, [=]() {
if (reply->isOpen() && file) {
QByteArray data = reply->readAll();
QFile file(filePath);
file.open(QIODevice::WriteOnly);
file.write(data);
file.close();
file->write(data);
}
});
connect(reply, &QNetworkReply::finished, this, [=]() {
if (reply->isOpen() && file) {
QByteArray data = reply->readAll();
file->write(data);
file->close();
Q_EMIT downloadFinished(url);
}
// clean up; close file if still open in case something has gone wrong
if (file) {
if (file->isOpen()) {
file->close();
}
delete file;
}
reply->deleteLater();
});

View File

@ -7,6 +7,7 @@
#pragma once
#include <QFile>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QObject>