#include "network-downloader.h" void downloadFromUrl(const QString &url, const QString &installPath, std::function 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(); }