X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=search.cpp;h=df928c70bbbd6ea0ad8b3ca90c070fbb64865640;hb=4f302c4427507fec544f32b9003035e93f32b2e2;hp=ac967028c0de1c28c8a0aa6641efa3eb9a9f8807;hpb=4259b7276912249c515aae70995aa606ddf344a3;p=dorian diff --git a/search.cpp b/search.cpp index ac96702..df928c7 100644 --- a/search.cpp +++ b/search.cpp @@ -1,10 +1,11 @@ -#include -#include #include -#include +#include +#include +#include +#include #include #include -#include +#include #include "search.h" #include "platform.h" @@ -26,14 +27,15 @@ 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) { - Trace t("Search::start"); + TRACE; emit beginSearch(); @@ -58,25 +60,31 @@ QList Search::results() return searchResults; } -bool Search::download(const Search::Result &result, const QString &fileName) +void Search::download(const Search::Result &result, const QString &fileName) { - Q_UNUSED(result); + TRACE; + downloadResult = result; + downloadFileName = fileName; + 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())); } void Search::finished() { - Trace t("Search::finished"); + TRACE; if (!reply) { return; } QByteArray data = reply->readAll(); - qDebug() << data; // Parse search results @@ -118,3 +126,58 @@ void Search::finished() reply = 0; emit endSearch(); } + +void 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; + 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 { + qCritical() << "Search::downloadFinished: Could not open" + << downloadFileName; + } + emit endDownload(status, downloadResult, downloadFileName); +}