Mega Code Archive

 
Categories / C++ / Qt
 

Download from URL

/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights.  These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include <QCoreApplication> #include <QFile> #include <QFileInfo> #include <QList> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QStringList> #include <QTimer> #include <QUrl> #include <stdio.h> class DownloadManager: public QObject {     Q_OBJECT     QNetworkAccessManager manager;     QList<QNetworkReply *> currentDownloads; public:     DownloadManager();     void doDownload(const QUrl &url);     QString saveFileName(const QUrl &url);     bool saveToDisk(const QString &filename, QIODevice *data); public slots:     void execute();     void downloadFinished(QNetworkReply *reply); }; DownloadManager::DownloadManager() {     connect(&manager, SIGNAL(finished(QNetworkReply*)),             SLOT(downloadFinished(QNetworkReply*))); } void DownloadManager::doDownload(const QUrl &url) {     QNetworkRequest request(url);     QNetworkReply *reply = manager.get(request);     currentDownloads.append(reply); } QString DownloadManager::saveFileName(const QUrl &url) {     QString path = url.path();     QString basename = QFileInfo(path).fileName();     if (basename.isEmpty())         basename = "download";     if (QFile::exists(basename)) {         // already exists, don't overwrite         int i = 0;         basename += '.';         while (QFile::exists(basename + QString::number(i)))             ++i;         basename += QString::number(i);     }     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; } void DownloadManager::execute() {     QStringList args = QCoreApplication::instance()->arguments();     args.takeFirst();           // skip the first argument, which is the program's name     if (args.isEmpty()) {         printf("Qt Download example - downloads all URLs in parallel\n"                "Usage: download url1 [url2... urlN]\n"                "\n"                "Downloads the URLs passed in the command-line to the local directory\n"                "If the target file already exists, a .0, .1, .2, etc. is appended to\n"                "differentiate.\n");         QCoreApplication::instance()->quit();         return;     }     foreach (QString arg, args) {         QUrl url = QUrl::fromEncoded(arg.toLocal8Bit());         doDownload(url);     } } 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 {         QString filename = saveFileName(url);         if (saveToDisk(filename, reply))             printf("Download of %s succeded (saved to %s)\n",                    url.toEncoded().constData(), qPrintable(filename));     }     currentDownloads.removeAll(reply);     reply->deleteLater();     if (currentDownloads.isEmpty())         // all downloads finished         QCoreApplication::instance()->quit(); } int main(int argc, char **argv) {     QCoreApplication app(argc, argv);     DownloadManager manager;     QTimer::singleShot(0, &manager, SLOT(execute()));     app.exec(); } #include "main.moc"