examples/network/downloadmanager/downloadmanager.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/network/downloadmanager/downloadmanager.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** 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 "downloadmanager.h"
+
+#include <QFileInfo>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QString>
+#include <QStringList>
+#include <QTimer>
+#include <stdio.h>
+
+DownloadManager::DownloadManager(QObject *parent)
+    : QObject(parent), downloadedCount(0), totalCount(0)
+{
+}
+
+void DownloadManager::append(const QStringList &urlList)
+{
+    foreach (QString url, urlList)
+        append(QUrl::fromEncoded(url.toLocal8Bit()));
+
+    if (downloadQueue.isEmpty())
+        QTimer::singleShot(0, this, SIGNAL(finished()));
+}
+
+void DownloadManager::append(const QUrl &url)
+{
+    if (downloadQueue.isEmpty())
+        QTimer::singleShot(0, this, SLOT(startNextDownload()));
+
+    downloadQueue.enqueue(url);
+    ++totalCount;
+}
+
+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;
+}
+
+void DownloadManager::startNextDownload()
+{
+    if (downloadQueue.isEmpty()) {
+        printf("%d/%d files downloaded successfully\n", downloadedCount, totalCount);
+        emit finished();
+        return;
+    }
+
+    QUrl url = downloadQueue.dequeue();
+
+    QString filename = saveFileName(url);
+    output.setFileName(filename);
+    if (!output.open(QIODevice::WriteOnly)) {
+        fprintf(stderr, "Problem opening save file '%s' for download '%s': %s\n",
+                qPrintable(filename), url.toEncoded().constData(),
+                qPrintable(output.errorString()));
+
+        startNextDownload();
+        return;                 // skip this download
+    }
+
+    QNetworkRequest request(url);
+    currentDownload = manager.get(request);
+    connect(currentDownload, SIGNAL(downloadProgress(qint64,qint64)),
+            SLOT(downloadProgress(qint64,qint64)));
+    connect(currentDownload, SIGNAL(finished()),
+            SLOT(downloadFinished()));
+    connect(currentDownload, SIGNAL(readyRead()),
+            SLOT(downloadReadyRead()));
+
+    // prepare the output
+    printf("Downloading %s...\n", url.toEncoded().constData());
+    downloadTime.start();
+}
+
+void DownloadManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
+{
+    progressBar.setStatus(bytesReceived, bytesTotal);
+
+    // calculate the download speed
+    double speed = bytesReceived * 1000.0 / downloadTime.elapsed();
+    QString unit;
+    if (speed < 1024) {
+        unit = "bytes/sec";
+    } else if (speed < 1024*1024) {
+        speed /= 1024;
+        unit = "kB/s";
+    } else {
+        speed /= 1024*1024;
+        unit = "MB/s";
+    }
+
+    progressBar.setMessage(QString::fromLatin1("%1 %2")
+                           .arg(speed, 3, 'f', 1).arg(unit));
+    progressBar.update();
+}
+
+void DownloadManager::downloadFinished()
+{
+    progressBar.clear();
+    output.close();
+
+    if (currentDownload->error()) {
+        // download failed
+        fprintf(stderr, "Failed: %s\n", qPrintable(currentDownload->errorString()));
+    } else {
+        printf("Succeeded.\n");
+        ++downloadedCount;
+    }
+
+    currentDownload->deleteLater();
+    startNextDownload();
+}
+
+void DownloadManager::downloadReadyRead()
+{
+    output.write(currentDownload->readAll());
+}