-#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"
void Search::start(const Query &query)
{
- Trace t("Search::start");
+ TRACE;
emit beginSearch();
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);
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;
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);
}