1 #include <QNetworkAccessManager>
2 #include <QNetworkReply>
3 #include <QNetworkRequest>
6 #include <QWebElementCollection>
15 Search *Search::instance()
29 Search::Search(): QObject(0), reply(0)
31 manager = new QNetworkAccessManager(this);
34 void Search::start(const Query &query)
36 Trace t("Search::start");
40 searchResults.clear();
41 QNetworkRequest request;
42 request.setUrl(QUrl("http://www.gutenberg.org/catalog/world/results"));
43 // request.setRawHeader("User-Agent", "Dorian " + Platform::version());
44 QString title = query.title;
45 if (title.isEmpty()) {
49 data = "title=" + QUrl::toPercentEncoding(title) + "&author=" +
50 QUrl::toPercentEncoding(query.author);
51 qDebug() << "Request:" << (request.url().toString() + "?" + data);
52 reply = manager->post(request, data);
53 connect(reply, SIGNAL(finished()), this, SLOT(finished()));
56 QList<Search::Result> Search::results()
61 bool Search::download(const Search::Result &result, const QString &fileName)
65 emit beginDownload(0);
70 void Search::finished()
72 Trace t("Search::finished");
73 QByteArray data = reply->readAll();
77 QWebFrame *frame = page.mainFrame();
78 frame->setHtml(QString(data));
79 QWebElementCollection tables = frame->findAllElements("table");
80 if (tables.count() == 1) {
81 qDebug() << "Found table";
82 QWebElement table = tables[0];
83 foreach (QWebElement row, table.findAll("tr")) {
84 QWebElementCollection cols = row.findAll("td");
85 QString id = cols[0].toPlainText().trimmed();
89 QString author = cols[2].toPlainText().trimmed();
90 QStringList titles = cols[3].toPlainText().trimmed().
91 split("\n", QString::SkipEmptyParts);
93 r.authors = author.split("\n", QString::SkipEmptyParts);
98 r.language = cols[4].toPlainText().trimmed();
99 searchResults.append(r);
101 qDebug() << " Authors:" << r.authors;
102 qDebug() << " Title:" << r.title;
103 qDebug() << " Language:" << r.language;
107 reply->deleteLater();