X-Git-Url: http://git.maemo.org/git/?p=jenirok;a=blobdiff_plain;f=src%2Fdaemon%2Fcalllistener.cpp;h=78d5737cf37116ce14b081701412ee5562af1773;hp=821c073f5d1a1c7b7eea6c309182f11c2f6cd236;hb=07e0d59c6ec1c43f9c3aa2512cbe7774fa2c6753;hpb=4a9690bd6f3d972d36976863607f9353a5d62301 diff --git a/src/daemon/calllistener.cpp b/src/daemon/calllistener.cpp index 821c073..78d5737 100644 --- a/src/daemon/calllistener.cpp +++ b/src/daemon/calllistener.cpp @@ -23,6 +23,7 @@ #include "cache.h" #include "contactmanager.h" #include "connectionmanager.h" +#include "sourcecoreconfig.h" #include "db.h" namespace @@ -38,9 +39,9 @@ namespace QDBusConnection CallListener::systemBus_ = QDBusConnection::systemBus(); -CallListener::CallListener(): eniro_(0), +CallListener::CallListener(): source_(0), closeConnection_(false), initialized_(false), box_(0), label_(0), -retries_(-1), site_(Eniro::FI), timer_(0), autoconnect_(false) +retries_(-1), timer_(0) { } @@ -58,6 +59,13 @@ bool CallListener::begin() return false; } + sourceId_ = Source::stringToId(Settings::instance()->get("source")); + QMap tmpConfig; + SourceCoreConfig* config = SourceCoreConfig::getCoreConfig(sourceId_); + config->getConfig(tmpConfig); + sourceConfig_ = tmpConfig; + delete config; + systemBus_.connect(CALL_SERVICE_NAME, CALL_SERVICE_PATH, CALL_SERVICE_INTERFACE, @@ -72,8 +80,6 @@ bool CallListener::begin() this, SLOT(callTerminate())); - site_ = Eniro::stringToSite(Settings::instance()->get("site")); - qDebug() << "Starting..."; return true; @@ -97,16 +103,17 @@ void CallListener::end() SLOT(callTerminate())); searchClose(); + sourceConfig_.clear(); } -void CallListener::search(Eniro::SearchDetails const& details) +void CallListener::search(Source::SearchDetails const& details) { qDebug() << "Search called"; searchInit(); - Eniro::Result result; + Source::Result result; if(Cache::instance().findItem(details.query, result)) { @@ -132,15 +139,22 @@ void CallListener::search(Eniro::SearchDetails const& details) qDebug() << "Starting to search..."; - eniro_->search(details); + source_->search(details); } } -void CallListener::requestFinished(QVector const& results, - Eniro::SearchDetails const& details, +void CallListener::requestFinished(QVector const& results, + Source::SearchDetails const& details, bool error) { + if(closeConnection_) + { + closeConnection_ = false; + ConnectionManager cm; + cm.disconnect(true); + } + // If box is not visible, the call must have been terminated already if(!initialized_ || !box_->isVisible()) { @@ -151,27 +165,27 @@ void CallListener::requestFinished(QVector const& results, if(error) { - qDebug() << "Error: " << eniro_->errorString(); + qDebug() << "Error: " << source_->errorString(); if(retries_ < SEARCH_RETRIES && retries_ >= 0) { retries_++; - eniro_->search(Eniro::SearchDetails(currentSearch_)); + source_->search(Source::SearchDetails(currentSearch_, "", Source::BOTH)); return; } else { timedMessage_ = ""; QString errorString; - Eniro::Error error = eniro_->error(); + Source::Error error = source_->error(); switch(error) { - case Eniro::TIMEOUT: + case Source::TIMEOUT: errorString = tr("Request timed out"); break; default: - errorString = eniro_->errorString(); + errorString = source_->errorString(); break; } @@ -192,7 +206,7 @@ void CallListener::requestFinished(QVector const& results, message = createResult(results.at(0).name, results.at(0).street, results.at(0).city); showResult(message); - Eniro::Result result = results.at(0); + Source::Result result = results.at(0); result.number = details.query; Cache::instance().addItem(result); } @@ -200,13 +214,6 @@ void CallListener::requestFinished(QVector const& results, retries_ = -1; currentSearch_ = ""; - - if(closeConnection_) - { - ConnectionManager cm; - cm.disconnect(true); - closeConnection_ = false; - } } QString CallListener::createResult(QString const& name, QString const& street, QString const& city) @@ -247,13 +254,17 @@ void CallListener::showResult(QString const& text) void CallListener::incomingCall(QDBusObjectPath path, QString number) { - qDebug() << "Incoming: " << number; + if(number.isEmpty()) + { + qDebug() << "Unknown caller without number"; + return; + } ContactManager cm; if(!cm.numberExists(number)) { - qDebug() << "Number doesn't exist"; + qDebug() << "Number doesn't exist: " << number; systemBus_.connect(CALL_SERVICE_NAME, path.path(), @@ -262,11 +273,11 @@ void CallListener::incomingCall(QDBusObjectPath path, QString number) this, SLOT(callTerminate())); - search(Eniro::SearchDetails(number)); + search(Source::SearchDetails(number, "", Source::BOTH)); } else { - qDebug() << "Number exists"; + qDebug() << "Number exists: " << number; } } @@ -277,13 +288,6 @@ void CallListener::callTerminate() box_->hide(); } - if(closeConnection_) - { - ConnectionManager cm; - cm.disconnect(true); - closeConnection_ = false; - } - searchClose(); } @@ -315,15 +319,19 @@ void CallListener::searchInit() 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))); + source_ = Source::getSource(sourceId_); + SourceCoreConfig* config = SourceCoreConfig::getCoreConfig(sourceId_); + config->loadFromConfig(sourceConfig_); + config->apply(source_); + delete config; + source_->setMaxResults(1); + source_->setFindNumber(false); + source_->setTimeout(REQUEST_TIMEOUT); + + connect(source_, SIGNAL(requestFinished(QVector const&, + Source::SearchDetails const&, bool)), + this, SLOT(requestFinished(QVector const&, + Source::SearchDetails const&, bool))); box_ = new InformationBox; label_ = new QLabel("", box_); label_->setMargin(8); @@ -334,23 +342,35 @@ void CallListener::searchInit() void CallListener::searchClose() { + if(!initialized_) + { + return; + } + initialized_ = false; qDebug() << "Closing search..."; - if(eniro_) + if(source_) { - disconnect(eniro_, SIGNAL(requestFinished(QVector const&, - Eniro::SearchDetails const&, bool)), - this, SLOT(requestFinished(QVector const&, - Eniro::SearchDetails const&, bool))); + disconnect(source_, SIGNAL(requestFinished(QVector const&, + Source::SearchDetails const&, bool)), + this, SLOT(requestFinished(QVector const&, + Source::SearchDetails const&, bool))); } - delete eniro_; - eniro_ = 0; + delete source_; + source_ = 0; delete box_; box_ = 0; label_ = 0; + + if(closeConnection_) + { + closeConnection_ = false; + ConnectionManager cm; + cm.disconnect(true); + } } bool CallListener::handleConnection() @@ -374,7 +394,7 @@ bool CallListener::handleConnection() if(configType == Settings::ALWAYS_ASK) { - showError(tr("Automatic connecting is not allowed by settings.")); + showError(tr("Automatic connecting is not allowed by settings."), BANNER_DELAY); return false; } @@ -398,6 +418,14 @@ bool CallListener::handleConnection() } int cretries = 0; + int scans = 0; + bool found = false; + int maxScans = GPRS_SCANS; + + if(lookupType != ConnectionManager::GPRS) + { + maxScans = WLAN_SCANS; + } while(cretries < CONNECTION_LOOKUP_RETRIES) { @@ -406,17 +434,32 @@ bool CallListener::handleConnection() return false; } - if(cm.getBestConnection(best, lookupType)) + if(scans < maxScans) + { + if(cm.getBestConnection(best, lookupType)) + { + found = true; + } + + scans++; + } + + // If there is only gprs connection available, + // make sure that we are on 3g network + if(found && (best.type != ConnectionManager::GPRS || is3g())) { break; } + if(found) + { + sleep(WAIT_BETWEEN_RETRIES); + } + qDebug() << "No connections found, retrying..."; cretries++; - sleep(WAIT_BETWEEN_RETRIES); - } if(cretries >= CONNECTION_LOOKUP_RETRIES) @@ -434,7 +477,7 @@ bool CallListener::handleConnection() return false; } - sleep(WAIT_BETWEEN_RETRIES); + qDebug() << "Connecting to " << best.name; if(cm.connect(best.id)) { @@ -446,25 +489,92 @@ bool CallListener::handleConnection() return false; } - qDebug() << "Unable to connect, retrying..."; retries++; + qDebug() << "Unable to connect, retrying..."; + + if(retries < CONNECT_RETRIES) + { + sendRetrySignal(best.id, initialized_); + } + } - if(initialized_ && retries >= CONNECT_RETRIES) + if(retries >= CONNECT_RETRIES) { - showError(tr("Unable to connect to network.")); + sendRetrySignal(best.id, false); + + if(initialized_) + { + showError(tr("Unable to connect to network.")); + } + return false; } return initialized_; } -void CallListener::showError(QString const& msg) +void CallListener::showError(QString const& msg, int timeout) { qDebug() << "Error: " << msg; + + if(!initialized_ || !box_) + { + return; + } + box_->setTimeout(ERROR_BANNER_TIMEOUT); - showResult(msg); + + if(timeout) + { + showDelayedResult(msg, timeout); + } + else + { + showResult(msg); + } +} + +bool CallListener::is3g() +{ + QDBusMessage msg = QDBusMessage::createMethodCall("com.nokia.phone.net", + "/com/nokia/phone/net", + "Phone.Net", + "get_registration_status"); + + QDBusMessage rep = systemBus_.call(msg); + + if(rep.type() == QDBusMessage::ErrorMessage) + { + qDebug() << "Unable to get network status"; + return false; + } + + uint status = rep.arguments().value(6).toUInt(); + + if(status & 0x10 || status & 0x08) + { + return true; + } + + return false; +} + +void CallListener::sendRetrySignal(QString const& iap, bool retry) +{ + QDBusMessage msg = QDBusMessage::createSignal("/com/nokia/icd_ui", + "com.nokia.icd_ui", + "retry"); + + QList arguments; + arguments.append(QVariant(iap)); + arguments.append(QVariant(retry)); + msg.setArguments(arguments); + + QDBusConnection::systemBus().send(msg); + + qDebug() << "Retry signal sent"; } void CallListener::timerEvent(QTimerEvent* event)