// From Qt5 Examples/Docs #include"dl-man.h" DownloadManager::DownloadManager() { connect(&manager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); } void DownloadManager::doDownload(const QUrl &url) { QNetworkRequest request(url); QNetworkReply *reply = manager.get(request); connect(reply, SIGNAL(sslErrors(QList)), SLOT(sslErrors(QList))); currentDownloads.append(reply); } QString DownloadManager::saveFileName(const QUrl &url) { QString path = url.path(); QString basename = QFileInfo(path).fileName(); if (basename.isEmpty()) basename = "download"; return basename; } bool DownloadManager::saveToDisk(const QString &filename, QIODevice *data) { QFile file(filename); if (!file.open(QIODevice::WriteOnly)) { fprintf(stderr, "Could not open %s for writing: %s\n", qPrintable(filename), qPrintable(file.errorString())); return false; } file.write(data->readAll()); file.close(); return true; } bool DownloadManager::isHttpRedirect(QNetworkReply *reply) { int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); return statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 305 || statusCode == 307 || statusCode == 308; } void DownloadManager::execute() {} void DownloadManager::sslErrors(const QList &sslErrors) { for (const QSslError &error : sslErrors) fprintf(stderr, "SSL error: %s\n", qPrintable(error.errorString())); } void DownloadManager::downloadFinished(QNetworkReply *reply) { QUrl url = reply->url(); if (reply->error()) { fprintf(stderr, "Download of %s failed: %s\n", url.toEncoded().constData(), qPrintable(reply->errorString())); } else { if (isHttpRedirect(reply)) { fputs("Request was redirected.\n", stderr); } else { QString filename = saveFileName(url); if (saveToDisk(filename, reply)) { printf("Download of %s succeeded (saved to %s)\n", url.toEncoded().constData(), qPrintable(filename)); } } } reply->deleteLater(); }