Make orientation switch explicit on Symbian, too.
[dorian] / search.cpp
index 0d13733..df928c7 100644 (file)
@@ -1,10 +1,11 @@
-#include <QNetworkAccessManager>
-#include <QNetworkReply>
 #include <QNetworkRequest>
-#include <QWebFrame>
+#include <QNetworkReply>
+#include <QtGui>
+#include <QFile>
+#include <QNetworkAccessManager>
 #include <QWebPage>
 #include <QWebElementCollection>
-#include <QWebElement>
+#include <QWebFrame>
 
 #include "search.h"
 #include "platform.h"
@@ -34,7 +35,7 @@ Search::Search(): QObject(0), reply(0), downloadReply(0)
 
 void Search::start(const Query &query)
 {
-    Trace t("Search::start");
+    TRACE;
 
     emit beginSearch();
 
@@ -59,9 +60,11 @@ QList<Search::Result> Search::results()
     return searchResults;
 }
 
-bool Search::download(const Search::Result &result, const QString &fileName)
+void Search::download(const Search::Result &result, const QString &fileName)
 {
-    Trace t("Search::download");
+    TRACE;
+    downloadResult = result;
+    downloadFileName = fileName;
     qDebug() << "UID" << result.id;
     Q_UNUSED(fileName);
     emit beginDownload(0);
@@ -71,12 +74,11 @@ bool Search::download(const Search::Result &result, const QString &fileName)
     request.setUrl(url);
     downloadReply = downloadManager->get(request);
     connect(downloadReply, SIGNAL(finished()), this, SLOT(downloadFinished()));
-    return true;
 }
 
 void Search::finished()
 {
-    Trace t("Search::finished");
+    TRACE;
 
     if (!reply) {
         return;
@@ -127,25 +129,55 @@ void Search::finished()
 
 void Search::downloadFinished()
 {
-    Trace t("Search::downloadFinished");
+    TRACE;
 
     if (!downloadReply) {
         return;
     }
 
+    // Handle download errors
+    if (QNetworkReply::NoError != downloadReply->error()) {
+        qCritical() << "Search::downloadFinished: Network error"
+                << downloadReply->error();
+        downloadReply->deleteLater();
+        downloadReply = 0;
+        emit endDownload(Search::DownloadError, downloadResult, downloadFileName);
+        return;
+    }
+
+    // Handle redirection
     QVariant header = downloadReply->header(QNetworkRequest::LocationHeader);
     if (header.isValid()) {
+        // Handle redirection: Download again with the new URL
         qDebug() << "Redirected to" << header;
-        downloadReply->deleteLater();
         QNetworkRequest request;
         request.setUrl(header.toUrl());
+        downloadReply->deleteLater();
         downloadReply = downloadManager->get(request);
         connect(downloadReply, SIGNAL(finished()), this, SLOT(downloadFinished()));
+        return;
+    }
+
+    // Handle download success
+    QByteArray data = downloadReply->readAll();
+    qint64 size = (qint64)data.size();
+    qDebug() << "Got" << size << "bytes";
+    downloadReply->deleteLater();
+    downloadReply = 0;
+    QFile out(downloadFileName);
+    int status = Search::FileError;
+    if (out.open(QIODevice::WriteOnly)) {
+        if (size == out.write(data, size)) {
+            qDebug() << "Book saved to" << downloadFileName;
+            status = Search::Ok;
+        } else {
+            qCritical() << "Search::downloadFinished: Failed to write" << size
+                    << "bytes to" << downloadFileName;
+        }
+        out.close();
     } else {
-        QByteArray data = downloadReply->readAll();
-        qDebug() << "Got" << data.size() << "bytes";
-        downloadReply->deleteLater();
-        downloadReply = 0;
-        emit endDownload();
+        qCritical() << "Search::downloadFinished: Could not open"
+                << downloadFileName;
     }
+    emit endDownload(status, downloadResult, downloadFileName);
 }