X-Git-Url: http://git.maemo.org/git/?p=jenirok;a=blobdiff_plain;f=src%2Fdaemon%2Fcalllistener.cpp;h=cbeb837d66ba829c4643ca151fae0570786f0586;hp=93fb10042763daa8af1126bafdc1e9f9d3cc3cc1;hb=ee9cbde6d8233ae35e57771468588e6a198ec246;hpb=89496ceee9788c2908c27ad4e2535f2728310d76 diff --git a/src/daemon/calllistener.cpp b/src/daemon/calllistener.cpp index 93fb100..cbeb837 100644 --- a/src/daemon/calllistener.cpp +++ b/src/daemon/calllistener.cpp @@ -17,129 +17,153 @@ */ #include +#include #include +#include #include "calllistener.h" #include "settings.h" -#include "db.h" +#include "cache.h" namespace { - const QString CALL_SERVICE_NAME = "com.nokia.csd"; - const QString CALL_SERVICE_PATH = "/com/nokia/csd/call"; - const QString CALL_SERVICE_INTERFACE = "com.nokia.csd.Call"; - const QString CALL_SERVICE_INSTANCE_NAME = "com.nokia.csd.Call.Instance"; - const QString CALL_SIGNAL_INCOMING = "Coming"; - const QString CALL_SIGNAL_RELEASE = "Release"; - const QString CALL_SIGNAL_TERMINATED = "Terminated"; + const QString CALL_SERVICE_NAME = "com.nokia.csd"; + const QString CALL_SERVICE_PATH = "/com/nokia/csd/call"; + const QString CALL_SERVICE_INTERFACE = "com.nokia.csd.Call"; + const QString CALL_SERVICE_INSTANCE_NAME = "com.nokia.csd.Call.Instance"; + const QString CALL_SIGNAL_INCOMING = "Coming"; + const QString CALL_SIGNAL_RELEASE = "Release"; + const QString CALL_SIGNAL_TERMINATED = "Terminated"; } QDBusConnection CallListener::systemBus_ = QDBusConnection::systemBus(); -CallListener::CallListener(): eniro_(0), contactManager_(0), box_(0), label_(0) +CallListener::CallListener(): eniro_(0), contactManager_(0), +connectionManager_(0), closeConnection_(false), box_(0), label_(0), +retries_(-1) { } CallListener::~CallListener() { - end(); + end(); } void CallListener::begin() { - systemBus_.connect(CALL_SERVICE_NAME, - CALL_SERVICE_PATH, - CALL_SERVICE_INTERFACE, - CALL_SIGNAL_INCOMING, - this, - SLOT(incomingCall(QDBusObjectPath, QString))); + systemBus_.connect(CALL_SERVICE_NAME, + CALL_SERVICE_PATH, + CALL_SERVICE_INTERFACE, + CALL_SIGNAL_INCOMING, + this, + SLOT(incomingCall(QDBusObjectPath, QString))); - systemBus_.connect(CALL_SERVICE_NAME, - CALL_SERVICE_PATH, - CALL_SERVICE_INTERFACE, - CALL_SIGNAL_RELEASE, - this, - SLOT(callTerminate())); + systemBus_.connect(CALL_SERVICE_NAME, + CALL_SERVICE_PATH, + CALL_SERVICE_INTERFACE, + CALL_SIGNAL_RELEASE, + this, + SLOT(callTerminate())); - contactManager_ = new ContactManager; + contactManager_ = new ContactManager; - eniro_ = new Eniro(Eniro::stringToSite(Settings::instance()->get("site"))); + eniro_ = new Eniro(Eniro::stringToSite(Settings::instance()->get("site"))); - eniro_->setMaxResults(1); - eniro_->setFindNumber(false); + 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))); + 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(10); - box_->setWidget(label_); + box_ = new InformationBox(); + label_ = new QLabel("", box_); + label_->setMargin(8); + box_->setWidget(label_); + + qDebug() << "Starting..."; } void CallListener::end() { - systemBus_.disconnect(CALL_SERVICE_NAME, - CALL_SERVICE_PATH, - CALL_SERVICE_INTERFACE, - CALL_SIGNAL_INCOMING, - this, - SLOT(incomingCall(QDBusObjectPath, QString))); - - systemBus_.disconnect(CALL_SERVICE_NAME, - CALL_SERVICE_PATH, - CALL_SERVICE_INTERFACE, - CALL_SIGNAL_RELEASE, - this, - SLOT(callTerminate())); - - delete eniro_; - eniro_ = 0; - delete box_; - box_ = 0; - delete label_; - label_ = 0; + systemBus_.disconnect(CALL_SERVICE_NAME, + CALL_SERVICE_PATH, + CALL_SERVICE_INTERFACE, + CALL_SIGNAL_INCOMING, + this, + SLOT(incomingCall(QDBusObjectPath, QString))); + + systemBus_.disconnect(CALL_SERVICE_NAME, + CALL_SERVICE_PATH, + CALL_SERVICE_INTERFACE, + CALL_SIGNAL_RELEASE, + this, + SLOT(callTerminate())); + + delete contactManager_; + contactManager_ = 0; + delete connectionManager_; + connectionManager_ = 0; + delete eniro_; + eniro_ = 0; + delete box_; + box_ = 0; + delete label_; + label_ = 0; } void CallListener::search(Eniro::SearchDetails const& details) { - label_->setText(tr("Searching...")); - box_->show(); - - DB::connect(); - - QSqlQuery query; - query.prepare("SELECT name, street, city FROM cache WHERE number = :number"); - query.bindValue(":number", details.query); + qDebug() << "Search called"; - if(query.exec() && query.next()) - { - showResult(createResult(query.value(0).toString(), - query.value(1).toString(), - query.value(2).toString())); + Eniro::Result result; - } - else - { - eniro_->search(details); - } + if(Cache::instance().findItem(details.query, result)) + { - DB::disconnect(); + showDelayedResult(createResult(result.name, + result.street, + result.city), BANNER_DELAY); + } + else + { + showResult(tr("Searching...")); + retries_ = 0; + currentSearch_ = details.query; + + if(connectionManager_) + { + delete connectionManager_; + connectionManager_ = 0; + } + + connectionManager_ = new ConnectionManager; + + if(!connectionManager_->isConnected()) + { + connectionManager_->connect(); + closeConnection_ = true; + } + else + { + closeConnection_ = false; + } + + eniro_->search(details); + } } void CallListener::requestFinished(QVector const& results, - Eniro::SearchDetails const& details, - bool error) + Eniro::SearchDetails const& details, + bool error) { - qDebug() << "Found: " << results.size(); - // If box is not visible, the call must have been terminated already if(!box_->isVisible()) { - return; + return; } QString message; @@ -147,93 +171,133 @@ void CallListener::requestFinished(QVector const& results, if(error) { qDebug() << "Error: " << eniro_->errorString(); - message = tr("Search failed:") + " " + eniro_->errorString(); + + if(retries_ < NUMBER_OF_RETRIES && retries_ >= 0) + { + retries_++; + eniro_->search(Eniro::SearchDetails(currentSearch_)); + return; + } + else + { + message = tr("Search failed:") + " " + eniro_->errorString() + "."; + } } else if(results.size() == 0) { - message = tr("Phone number was not found"); + message = tr("Phone number was not found"); } else { - message = createResult(results.at(0).name, results.at(0).street, results.at(0).city); - QSqlQuery query; - - DB::connect(); - - query.prepare("INSERT INTO cache(number, name, street, city) VALUES(:number, :name, :street, :city)"); - query.bindValue(":number", details.query); - query.bindValue(":name", results.at(0).name); - query.bindValue(":street", results.at(0).street); - query.bindValue(":city", results.at(0).city); - - if(!query.exec()) - { - qDebug() << "Unable to save cache"; - } - - QString cacheSize = Settings::instance()->get("cache_size"); - - // Delete old entries from cache - if(cacheSize.toInt() > 0) - { - if(!query.exec("DELETE c1 FROM cache AS c1 LEFT JOIN (SELECT id FROM cache ORDER BY id DESC LIMIT " + cacheSize + ") AS c2 ON c1.id = c2.id WHERE c2.id IS NULL")) - { - qDebug() << "Unable to delete old cache entries"; - } - } - - DB::disconnect(); + 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); + } + + retries_ = -1; + currentSearch_ = ""; + + if(closeConnection_) + { + connectionManager_->disconnect(); + closeConnection_ = false; } + delete connectionManager_; + connectionManager_ = 0; + showResult(message); } QString CallListener::createResult(QString const& name, QString const& street, QString const& city) { - QString result = "" + name + ""; + QString result = "" + name + ""; - if(!street.isEmpty() || !city.isEmpty()) - { - result += "
"; + if(!street.isEmpty() || !city.isEmpty()) + { + result += "
"; - if(!street.isEmpty()) - { - result += street + ", "; - } + if(!street.isEmpty()) + { + result += street + ", "; + } - result += city; - } + result += city; + } - return result; + return result; } void CallListener::showResult(QString const& text) { - label_->setText(text); - box_->hide(); - box_->show(); + label_->setText("" + text + ""); + + if(box_->isVisible()) + { + box_->hide(); + } + + box_->show(); } void CallListener::incomingCall(QDBusObjectPath path, QString number) { - qDebug() << number; + qDebug() << "Incoming: " << number; - if(!contactManager_->numberExists(number)) - { + if(!contactManager_->numberExists(number)) + { + qDebug() << "Number doesn't exist"; - systemBus_.connect(CALL_SERVICE_NAME, - path.path(), - CALL_SERVICE_INSTANCE_NAME, - CALL_SIGNAL_TERMINATED, - this, - SLOT(callTerminate())); + systemBus_.connect(CALL_SERVICE_NAME, + path.path(), + CALL_SERVICE_INSTANCE_NAME, + CALL_SIGNAL_TERMINATED, + this, + SLOT(callTerminate())); - search(Eniro::SearchDetails(number)); - } + qDebug() << "Going to search"; + + search(Eniro::SearchDetails(number)); + } + else + { + qDebug() << "Number exists"; + } } void CallListener::callTerminate() { - box_->hide(); + if(box_->isVisible()) + { + box_->hide(); + } + + if(closeConnection_ && connectionManager_) + { + connectionManager_->disconnect(); + closeConnection_ = false; + } + + delete connectionManager_; + connectionManager_ = 0; +} + +void CallListener::showDelayedResult(QString const& text, int delay) +{ + timedMessage_ = text; + QTimer::singleShot(delay, this, SLOT(showTimedMessage())); +} + +void CallListener::showTimedMessage() +{ + if(timedMessage_.size() == 0) + { + return; + } + + showResult(timedMessage_); + + timedMessage_ = ""; }