/****************************************************************************+ −
**+ −
** 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$+ −
** No Commercial Usage+ −
** This file contains pre-release code and may not be distributed.+ −
** You may use this file in accordance with the terms and conditions+ −
** contained in the Technology Preview License Agreement accompanying+ −
** this package.+ −
**+ −
** 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.+ −
**+ −
** 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"+ −