Implement download sequence, handle redirection.
authorAkos Polster <akos@pipacs.com>
Fri, 29 Oct 2010 23:18:44 +0000 (01:18 +0200)
committerAkos Polster <akos@pipacs.com>
Fri, 29 Oct 2010 23:18:44 +0000 (01:18 +0200)
librarydialog.cpp
search.cpp
search.h
searchresultsdialog.cpp
searchresultsdialog.h

index bcedcf4..c6e7e24 100644 (file)
@@ -270,6 +270,7 @@ void LibraryDialog::showSearchResults()
     }
 
     SearchResultsDialog *dialog = new SearchResultsDialog(results, this);
+    // FIXME
     connect(dialog, SIGNAL(add(const Search::Result &)),
             this, SLOT(onAddSearchResult(const Search::Result &)));
     dialog->show();
index ac96702..0d13733 100644 (file)
@@ -26,9 +26,10 @@ void Search::close()
     inst = 0;
 }
 
-Search::Search(): QObject(0), reply(0)
+Search::Search(): QObject(0), reply(0), downloadReply(0)
 {
     manager = new QNetworkAccessManager(this);
+    downloadManager = new QNetworkAccessManager(this);
 }
 
 void Search::start(const Query &query)
@@ -60,11 +61,17 @@ QList<Search::Result> Search::results()
 
 bool Search::download(const Search::Result &result, const QString &fileName)
 {
-    Q_UNUSED(result);
+    Trace t("Search::download");
+    qDebug() << "UID" << result.id;
     Q_UNUSED(fileName);
     emit beginDownload(0);
-    emit endDownload();
-    return false;
+    QUrl url("http://www.gutenberg.org/ebooks/" + result.id + ".epub");
+    qDebug() << "Requesting" << url;
+    QNetworkRequest request;
+    request.setUrl(url);
+    downloadReply = downloadManager->get(request);
+    connect(downloadReply, SIGNAL(finished()), this, SLOT(downloadFinished()));
+    return true;
 }
 
 void Search::finished()
@@ -76,7 +83,6 @@ void Search::finished()
     }
 
     QByteArray data = reply->readAll();
-    qDebug() << data;
 
     // Parse search results
 
@@ -118,3 +124,28 @@ void Search::finished()
     reply = 0;
     emit endSearch();
 }
+
+void Search::downloadFinished()
+{
+    Trace t("Search::downloadFinished");
+
+    if (!downloadReply) {
+        return;
+    }
+
+    QVariant header = downloadReply->header(QNetworkRequest::LocationHeader);
+    if (header.isValid()) {
+        qDebug() << "Redirected to" << header;
+        downloadReply->deleteLater();
+        QNetworkRequest request;
+        request.setUrl(header.toUrl());
+        downloadReply = downloadManager->get(request);
+        connect(downloadReply, SIGNAL(finished()), this, SLOT(downloadFinished()));
+    } else {
+        QByteArray data = downloadReply->readAll();
+        qDebug() << "Got" << data.size() << "bytes";
+        downloadReply->deleteLater();
+        downloadReply = 0;
+        emit endDownload();
+    }
+}
index 4c7ad0e..6405ea1 100644 (file)
--- a/search.h
+++ b/search.h
@@ -49,11 +49,14 @@ public slots:
     QList<Result> results();
     bool download(const Result &result, const QString &fileName);
     void finished();
+    void downloadFinished();
 
-protected:
+private:
     explicit Search();
     QNetworkAccessManager *manager;
+    QNetworkAccessManager *downloadManager;
     QNetworkReply *reply;
+    QNetworkReply *downloadReply;
     QList<Result> searchResults;
 };
 
index a405559..a523839 100644 (file)
@@ -27,6 +27,9 @@ SearchResultsDialog::SearchResultsDialog(const QList<Search::Result> results_,
     addItemAction(tr("Download book"), this, SLOT(onDownload()));
     connect(list, SIGNAL(activated(const QModelIndex &)),
             this, SLOT(onItemActivated(const QModelIndex &)));
+    Search *search = Search::instance();
+    connect(search, SIGNAL(beginDownload(int)), this, SLOT(onBeginDownload(int)));
+    connect(search, SIGNAL(endDownload()), this, SLOT(onEndDownload()));
 }
 
 void SearchResultsDialog::onItemActivated(const QModelIndex &index)
@@ -39,6 +42,9 @@ void SearchResultsDialog::onItemActivated(const QModelIndex &index)
     int ret = d->exec();
     if (ret == QDialog::Accepted) {
         qDebug() << "Accepted -> Start download";
+        QString fileName = downloadName();
+        qDebug() << "Downloading to" << fileName;
+        Search::instance()->download(result, fileName);
     }
 }
 
@@ -46,3 +52,19 @@ void SearchResultsDialog::onDownload()
 {
     onItemActivated(list->currentIndex());
 }
+
+QString SearchResultsDialog::downloadName() const
+{
+    // FIXME
+    return QString("/tmp/book.epub");
+}
+
+void SearchResultsDialog::onBeginDownload(int size)
+{
+    Trace t("SearchResultsDialog::onBeginDownload");
+}
+
+void SearchResultsDialog::onEndDownload()
+{
+    Trace t("SearchResultsDialog::onEndDownload");
+}
index 83917f3..b161836 100644 (file)
@@ -21,8 +21,13 @@ public:
 protected slots:
     void onDownload();
     void onItemActivated(const QModelIndex &index);
+    void onBeginDownload(int size);
+    void onEndDownload();
 
 protected:
+    QString downloadName() const;
+
+private:
     const QList<Search::Result> results;
     ListView *list;
     QStringList data;