57 lines
2.0 KiB
C++
57 lines
2.0 KiB
C++
#include "network-downloader.h"
|
|
void downloadFromUrl(const QString &url, const QString &installPath, std::function<void(QString)> logCallback = nullptr) {
|
|
if (QFile::exists(installPath)) {
|
|
if (logCallback) logCallback("File already exists: " + installPath);
|
|
return;
|
|
}
|
|
|
|
if (logCallback) logCallback("Downloading from url...");
|
|
QNetworkAccessManager manager;
|
|
QNetworkRequest request((QUrl(url)));
|
|
QEventLoop loop;
|
|
QNetworkReply *reply = manager.get(request);
|
|
|
|
QObject::connect(reply, &QNetworkReply::downloadProgress, [&](qint64 received, qint64 total){
|
|
if (logCallback) logCallback(QString("Download progress: %1/%2 bytes").arg(received).arg(total));
|
|
});
|
|
|
|
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
|
|
loop.exec();
|
|
|
|
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
|
|
|
|
if (!statusCode.isValid()) {
|
|
if (logCallback) logCallback("Download failed: Invalid Status code");
|
|
reply->deleteLater();
|
|
return;
|
|
}
|
|
|
|
if (reply->error() != QNetworkReply::NoError) {
|
|
if (logCallback) logCallback("Download failed: " + reply->errorString());
|
|
reply->deleteLater();
|
|
return;
|
|
}
|
|
|
|
if (statusCode.toInt() == 302 || statusCode.toInt() == 301) {
|
|
QVariant redir = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
|
|
if (!redir.isValid()) {
|
|
if (logCallback) logCallback("Download failed: Invalid redirect");
|
|
reply->deleteLater();
|
|
return;
|
|
}
|
|
QUrl newUrl = redir.toUrl();
|
|
downloadFromUrl(newUrl.toString(), installPath, logCallback);
|
|
return;
|
|
}
|
|
|
|
QFile file(installPath);
|
|
if (file.open(QIODevice::WriteOnly)) {
|
|
file.write(reply->readAll());
|
|
file.close();
|
|
if (logCallback) logCallback("Download complete: " + installPath);
|
|
} else {
|
|
if (logCallback) logCallback("Cannot write file: " + installPath);
|
|
}
|
|
reply->deleteLater();
|
|
}
|