X-Git-Url: http://git.maemo.org/git/?p=jenirok;a=blobdiff_plain;f=src%2Fdaemon%2Fcalllistener.cpp;h=6c25bfc758bd7ef361b31eb1fc3a8b60a1460237;hp=cbeb837d66ba829c4643ca151fae0570786f0586;hb=9127dc5e47aee7fa6659f45ae60a9394612f27b1;hpb=ee9cbde6d8233ae35e57771468588e6a198ec246 diff --git a/src/daemon/calllistener.cpp b/src/daemon/calllistener.cpp index cbeb837..6c25bfc 100644 --- a/src/daemon/calllistener.cpp +++ b/src/daemon/calllistener.cpp @@ -18,11 +18,12 @@ #include #include -#include -#include #include "calllistener.h" #include "settings.h" #include "cache.h" +#include "contactmanager.h" +#include "connectionmanager.h" +#include "db.h" namespace { @@ -37,19 +38,26 @@ namespace QDBusConnection CallListener::systemBus_ = QDBusConnection::systemBus(); -CallListener::CallListener(): eniro_(0), contactManager_(0), -connectionManager_(0), closeConnection_(false), box_(0), label_(0), -retries_(-1) +CallListener::CallListener(): eniro_(0), +closeConnection_(false), initialized_(false), box_(0), label_(0), +retries_(-1), site_(Eniro::FI), timer_(0) { } CallListener::~CallListener() { end(); + DB::removeDatabase(); } -void CallListener::begin() +bool CallListener::begin() { + if(Settings::instance()->getConnectionType() == Settings::ALWAYS_ASK) + { + qDebug() << "Bad connection settings, unable to start"; + return false; + } + systemBus_.connect(CALL_SERVICE_NAME, CALL_SERVICE_PATH, CALL_SERVICE_INTERFACE, @@ -64,26 +72,12 @@ void CallListener::begin() this, SLOT(callTerminate())); - contactManager_ = new ContactManager; - - eniro_ = new Eniro(Eniro::stringToSite(Settings::instance()->get("site"))); - - eniro_->setMaxResults(1); - eniro_->setFindNumber(false); - eniro_->setTimeout(REQUEST_TIMEOUT); - - connect(eniro_, SIGNAL(requestFinished(QVector const&, - Eniro::SearchDetails const&, bool)), - this, SLOT(requestFinished(QVector const&, - Eniro::SearchDetails const&, bool))); - - box_ = new InformationBox(); - label_ = new QLabel("", box_); - label_->setMargin(8); - box_->setWidget(label_); + site_ = Eniro::stringToSite(Settings::instance()->get("site")); qDebug() << "Starting..."; + return true; + } void CallListener::end() @@ -102,54 +96,41 @@ void CallListener::end() this, SLOT(callTerminate())); - delete contactManager_; - contactManager_ = 0; - delete connectionManager_; - connectionManager_ = 0; - delete eniro_; - eniro_ = 0; - delete box_; - box_ = 0; - delete label_; - label_ = 0; + searchClose(); + } void CallListener::search(Eniro::SearchDetails const& details) { qDebug() << "Search called"; + searchInit(); + Eniro::Result result; if(Cache::instance().findItem(details.query, result)) { + qDebug() << "Found from cache"; + showDelayedResult(createResult(result.name, - result.street, - result.city), BANNER_DELAY); + result.street, + result.city), BANNER_DELAY); } else { - showResult(tr("Searching...")); retries_ = 0; currentSearch_ = details.query; - if(connectionManager_) + if(!handleConnection()) { - delete connectionManager_; - connectionManager_ = 0; + qDebug() << "Unable to connect"; + return; } - connectionManager_ = new ConnectionManager; + showDelayedResult(tr("Searching..."), BANNER_DELAY); - if(!connectionManager_->isConnected()) - { - connectionManager_->connect(); - closeConnection_ = true; - } - else - { - closeConnection_ = false; - } + qDebug() << "Starting to search..."; eniro_->search(details); } @@ -161,7 +142,7 @@ void CallListener::requestFinished(QVector const& results, bool error) { // If box is not visible, the call must have been terminated already - if(!box_->isVisible()) + if(!initialized_ || !box_->isVisible()) { return; } @@ -172,7 +153,7 @@ void CallListener::requestFinished(QVector const& results, { qDebug() << "Error: " << eniro_->errorString(); - if(retries_ < NUMBER_OF_RETRIES && retries_ >= 0) + if(retries_ < SEARCH_RETRIES && retries_ >= 0) { retries_++; eniro_->search(Eniro::SearchDetails(currentSearch_)); @@ -180,19 +161,41 @@ void CallListener::requestFinished(QVector const& results, } else { - message = tr("Search failed:") + " " + eniro_->errorString() + "."; + timedMessage_ = ""; + QString errorString; + Eniro::Error error = eniro_->error(); + + switch(error) + { + case Eniro::TIMEOUT: + errorString = tr("Request timed out"); + break; + default: + errorString = eniro_->errorString(); + break; + } + + showError(tr("Searching failed:") + " " + errorString + "."); } } - else if(results.size() == 0) - { - message = tr("Phone number was not found"); - } else { - message = createResult(results.at(0).name, results.at(0).street, results.at(0).city); - Eniro::Result result = results.at(0); - result.number = details.query; - Cache::instance().addItem(result); + timedMessage_ = ""; + + if(results.size() == 0) + { + message = tr("Phone number was not found"); + showResult(message); + } + else + { + message = createResult(results.at(0).name, results.at(0).street, + results.at(0).city); + showResult(message); + Eniro::Result result = results.at(0); + result.number = details.query; + Cache::instance().addItem(result); + } } retries_ = -1; @@ -200,15 +203,10 @@ void CallListener::requestFinished(QVector const& results, if(closeConnection_) { - connectionManager_->disconnect(); + ConnectionManager cm; + cm.disconnect(true); closeConnection_ = false; } - - delete connectionManager_; - connectionManager_ = 0; - - showResult(message); - } QString CallListener::createResult(QString const& name, QString const& street, QString const& city) @@ -232,6 +230,11 @@ QString CallListener::createResult(QString const& name, QString const& street, Q void CallListener::showResult(QString const& text) { + if(!initialized_) + { + return; + } + label_->setText("" + text + ""); if(box_->isVisible()) @@ -246,7 +249,9 @@ void CallListener::incomingCall(QDBusObjectPath path, QString number) { qDebug() << "Incoming: " << number; - if(!contactManager_->numberExists(number)) + ContactManager cm; + + if(!cm.numberExists(number)) { qDebug() << "Number doesn't exist"; @@ -257,8 +262,6 @@ void CallListener::incomingCall(QDBusObjectPath path, QString number) this, SLOT(callTerminate())); - qDebug() << "Going to search"; - search(Eniro::SearchDetails(number)); } else @@ -269,19 +272,19 @@ void CallListener::incomingCall(QDBusObjectPath path, QString number) void CallListener::callTerminate() { - if(box_->isVisible()) + if(box_ && box_->isVisible()) { box_->hide(); } - if(closeConnection_ && connectionManager_) + if(closeConnection_) { - connectionManager_->disconnect(); + ConnectionManager cm; + cm.disconnect(true); closeConnection_ = false; } - delete connectionManager_; - connectionManager_ = 0; + searchClose(); } void CallListener::showDelayedResult(QString const& text, int delay) @@ -292,7 +295,7 @@ void CallListener::showDelayedResult(QString const& text, int delay) void CallListener::showTimedMessage() { - if(timedMessage_.size() == 0) + if(timedMessage_.size() == 0 || !initialized_) { return; } @@ -301,3 +304,187 @@ void CallListener::showTimedMessage() timedMessage_ = ""; } + +void CallListener::searchInit() +{ + qDebug() << "Initializing search..."; + + if(initialized_) + { + qDebug() << "Already initialized"; + return; + } + + eniro_ = new Eniro(site_); + eniro_->setMaxResults(1); + eniro_->setFindNumber(false); + eniro_->setTimeout(REQUEST_TIMEOUT); + + connect(eniro_, SIGNAL(requestFinished(QVector const&, + Eniro::SearchDetails const&, bool)), + this, SLOT(requestFinished(QVector const&, + Eniro::SearchDetails const&, bool))); + box_ = new InformationBox; + label_ = new QLabel("", box_); + label_->setMargin(8); + label_->setWordWrap(true); + box_->setWidget(label_); + initialized_ = true; +} + +void CallListener::searchClose() +{ + initialized_ = false; + + qDebug() << "Closing search..."; + + if(eniro_) + { + disconnect(eniro_, SIGNAL(requestFinished(QVector const&, + Eniro::SearchDetails const&, bool)), + this, SLOT(requestFinished(QVector const&, + Eniro::SearchDetails const&, bool))); + } + + delete eniro_; + eniro_ = 0; + delete box_; + box_ = 0; + label_ = 0; +} + +bool CallListener::handleConnection() +{ + if(!initialized_) + { + return false; + } + + ConnectionManager cm; + + if(cm.isConnected()) + { + closeConnection_ = false; + return true; + } + + closeConnection_ = true; + + Settings::ConnectionType configType = Settings::instance()->getConnectionType(); + + if(configType == Settings::ALWAYS_ASK) + { + showError(tr("Automatic connecting is not allowed by settings.")); + return false; + } + + showDelayedResult(tr("Connecting..."), BANNER_DELAY); + + ConnectionManager::Connection best; + + ConnectionManager::ConnectionType lookupType = ConnectionManager::NO_TYPE; + + switch(configType) + { + case Settings::WLAN: + lookupType = ConnectionManager::WLAN; + break; + case Settings::GPRS: + lookupType = ConnectionManager::GPRS; + break; + default: + lookupType = ConnectionManager::NO_TYPE; + break; + } + + int cretries = 0; + + while(cretries < CONNECTION_LOOKUP_RETRIES) + { + if(!initialized_) + { + return false; + } + + if(cm.getBestConnection(best, lookupType)) + { + break; + } + + qDebug() << "No connections found, retrying..."; + + cretries++; + + sleep(WAIT_BETWEEN_RETRIES); + + } + + if(cretries >= CONNECTION_LOOKUP_RETRIES) + { + showError(tr("No available 3G or WLAN networks found.")); + return false; + } + + int retries = 0; + + while(retries < CONNECT_RETRIES) + { + if(!initialized_) + { + return false; + } + + sleep(WAIT_BETWEEN_RETRIES); + + if(cm.connect(best.id)) + { + break; + } + else if(cm.error() == ConnectionManager::INVALID_IAP) + { + showError(tr("Selected access point doesn't exist.")); + return false; + } + + qDebug() << "Unable to connect, retrying..."; + retries++; + + } + + if(initialized_ && retries >= CONNECT_RETRIES) + { + showError(tr("Unable to connect to network.")); + return false; + } + + return initialized_; +} + +void CallListener::showError(QString const& msg) +{ + qDebug() << "Error: " << msg; + box_->setTimeout(ERROR_BANNER_TIMEOUT); + showResult(msg); +} + +void CallListener::timerEvent(QTimerEvent* event) +{ + Q_UNUSED(event); + killTimer(timer_); + timer_ = 0; +} + +void CallListener::sleep(int ms) +{ + if(timer_) + { + killTimer(timer_); + } + + timer_ = startTimer(ms); + + while(timer_) + { + QCoreApplication::processEvents(QEventLoop::WaitForMoreEvents); + } +}