X-Git-Url: http://git.maemo.org/git/?p=jenirok;a=blobdiff_plain;f=src%2Fgui%2Fresultwindow.cpp;h=1bd7cb4684c1fcb0bfe627c80b79197b05310f75;hp=11e6fc1580a3d8935ed10e1fa646bae6f78de27b;hb=40f8e10e1efc5019011df940328cdc734576143d;hpb=72f0ccb17472f83c1cba569879e185eb7cd60e31;ds=sidebyside diff --git a/src/gui/resultwindow.cpp b/src/gui/resultwindow.cpp index 11e6fc1..1bd7cb4 100644 --- a/src/gui/resultwindow.cpp +++ b/src/gui/resultwindow.cpp @@ -16,7 +16,7 @@ * */ -#include +#include #include #include #include @@ -26,14 +26,22 @@ #include "settings.h" #include "db.h" #include "cache.h" +#include "source.h" +#include "sourcecoreconfig.h" ResultWindow::ResultWindow(QWidget* parent): QMainWindow(parent), -eniro_(0), list_(0) +source_(0), list_(0), connectionManager_(0), timer_(0), searching_(false), retries_(0) { setAttribute(Qt::WA_Maemo5StackedWindow); setWindowTitle(tr("Search results")); } +ResultWindow::~ResultWindow() +{ + delete connectionManager_; + connectionManager_ = 0; +} + void ResultWindow::search(SearchDialog::SearchDetails& details) { if(!list_) @@ -48,62 +56,77 @@ void ResultWindow::search(SearchDialog::SearchDetails& details) list_->clear(); } - DB::connect(); - - Eniro::Site selectedSite = Eniro::stringToSite(Settings::instance()->get("site")); + show(); + setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true); - if(!eniro_) + if(!connectionManager_) { - eniro_ = new Eniro(selectedSite, this); - - connect(eniro_, SIGNAL(resultAvailable(Eniro::Result const&, - Eniro::SearchDetails const&)), - this, SLOT(resultAvailable(Eniro::Result const&, - Eniro::SearchDetails const&))); - - connect(eniro_, SIGNAL(requestFinished(QVector const&, - Eniro::SearchDetails const&, bool)), - this, SLOT(requestFinished(QVector const&, - Eniro::SearchDetails const&, bool))); + connectionManager_ = new ConnectionManager(); } - QString username = Settings::instance()->get("eniro_username"); - QString password = Settings::instance()->get("eniro_password"); + connectionManager_->connect(); - if(!username.isEmpty() && !password.isEmpty()) + Source::SourceId id = Source::stringToId(Settings::instance()->get("source")); + + if(!source_ || id != sourceId_) { - eniro_->login(username, password); + sourceId_ = id; + + if(source_) + { + delete source_; + source_ = 0; + } + + source_ = Source::getSource(sourceId_); + Q_ASSERT(source_ != 0); + source_->setTimeout(REQUEST_TIMEOUT); + + connect(source_, SIGNAL(resultAvailable(Source::Result const&, + Source::SearchDetails const&)), + this, SLOT(resultAvailable(Source::Result const&, + Source::SearchDetails const&))); + + connect(source_, SIGNAL(requestFinished(QVector const&, + Source::SearchDetails const&, bool)), + this, SLOT(requestFinished(QVector const&, + Source::SearchDetails const&, bool))); } - eniro_->setSite(selectedSite); + SourceCoreConfig* config = SourceCoreConfig::getCoreConfig(sourceId_); - DB::disconnect(); + Q_ASSERT(config != 0); - Eniro::SearchType type; + config->apply(source_); + delete config; - switch(details.type) + if(searching_) { - case 0: - type = Eniro::PERSONS; - break; - case 1: - type = Eniro::YELLOW_PAGES; - break; - default: - return; + source_->abort(); + timer_ = startTimer(SEARCH_INTERVAL); } - show(); - setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true); + while(timer_) + { + QApplication::processEvents(QEventLoop::WaitForMoreEvents); + } - eniro_->abort(); - eniro_->search(Eniro::SearchDetails(details.name, details.location, type)); + list_->clear(); + searching_ = true; + retries_ = 0; + currentSearch_ = Source::SearchDetails(details.name, details.location, details.type); + source_->search(currentSearch_); } -void ResultWindow::resultAvailable(Eniro::Result const& result, - Eniro::SearchDetails const& details) +void ResultWindow::resultAvailable(Source::Result const& result, + Source::SearchDetails const& details) { + if(!list_) + { + return; + } + Q_UNUSED(details); if(!result.number.isEmpty()) @@ -129,21 +152,50 @@ void ResultWindow::resultAvailable(Eniro::Result const& result, data["street"] = QVariant(result.street); data["city"] = QVariant(result.city); data["number"] = QVariant(result.number); + data["country"] = QVariant(result.country); item->setData(Qt::UserRole, QVariant(data)); list_->addItem(item); } -void ResultWindow::requestFinished(QVector const& results, - Eniro::SearchDetails const& details, +void ResultWindow::requestFinished(QVector const& results, + Source::SearchDetails const& details, bool error) { Q_UNUSED(details); if(error) { - QMessageBox::critical(this, tr("Error"), eniro_->errorString()); + if(retries_ < RETRIES) + { + qDebug() << "Searching failed, retrying..."; + retries_++; + list_->clear(); + source_->search(currentSearch_); + return; + } + + QString errorString; + Source::Error error = source_->error(); + + switch(error) + { + case Source::CONNECTION_FAILURE: + errorString = tr("Connection to server failed"); + break; + case Source::INVALID_LOGIN: + errorString = tr("Invalid login details"); + break; + case Source::TIMEOUT: + errorString = tr("Request timed out"); + break; + default: + errorString = tr("Searching failed:") + " " + source_->errorString(); + break; + } + + QMessageBox::critical(this, tr("Error"), errorString); } if(results.size() == 0) @@ -156,18 +208,39 @@ void ResultWindow::requestFinished(QVector const& results, setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false); + searching_ = false; + } void ResultWindow::itemClicked(QListWidgetItem* item) { QMap data = item->data(Qt::UserRole).toMap(); - Eniro::Result details; + Source::Result details; details.name = data["name"].toString(); details.street = data["street"].toString(); details.city = data["city"].toString(); details.number = data["number"].toString(); + details.country = data["country"].toString(); emit itemSelected(details); } +void ResultWindow::setVisible(bool visible) +{ + if(!visible && source_) + { + source_->abort(); + } + + QMainWindow::setVisible(visible); +} + +void ResultWindow::timerEvent(QTimerEvent* event) +{ + Q_UNUSED(event); + + killTimer(timer_); + timer_ = 0; +} +