launcher/network-downloader.cpp

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();
}