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");
78 QByteArray data = reply->readAll();
81 // Parse search results
84 QWebFrame *frame = page.mainFrame();
85 frame->setHtml(QString(data));
86 QWebElementCollection tables = frame->findAllElements("table");
87 if (tables.count() == 1) {
88 QWebElement table = tables[0];
89 foreach (QWebElement row, table.findAll("tr")) {
90 QWebElementCollection cols = row.findAll("td");
91 if (cols.count() < 5) {
94 QString id = cols[0].toPlainText().trimmed();
98 QString author = cols[2].toPlainText().trimmed();
99 QStringList titles = cols[3].toPlainText().trimmed().
100 split("\n", QString::SkipEmptyParts);
102 r.authors = author.split("\n", QString::SkipEmptyParts);
104 if (titles.count()) {
107 r.language = cols[4].toPlainText().trimmed();
108 r.source = "Project Gutenberg";
109 searchResults.append(r);
111 qDebug() << " Authors:" << r.authors;
112 qDebug() << " Title:" << r.title;
113 qDebug() << " Language:" << r.language;
117 reply->deleteLater();