X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fcommon%2Fconnectionmanager.cpp;h=fb0f395882677db9a9513d6c30a10df9c251c84f;hb=d97cbb873b74e7a9a9ecf3363a14d8a33a251cdc;hp=caf670913f844781304b46942695df810d453a5e;hpb=4a9690bd6f3d972d36976863607f9353a5d62301;p=jenirok diff --git a/src/common/connectionmanager.cpp b/src/common/connectionmanager.cpp index caf6709..fb0f395 100644 --- a/src/common/connectionmanager.cpp +++ b/src/common/connectionmanager.cpp @@ -16,21 +16,22 @@ * */ -#include -#include +#include #include #include #include +#include #include #include #include #include "connectionmanager.h" +bool ConnectionManager::connected_ = false; ConnectionManager::ConnectionManager(QObject* parent): QObject(parent), -blocking_(true), stateReady_(false), connectionReady_(false), scanReady_(false), -connected_(false), timeout_(false), numberOfConnections_(0), -scannedConnections_(0), timer_(0), error_(NO_ERROR), connections_(0) +stateReady_(false), connectionReady_(false), scanReady_(false), +timeout_(false), numberOfConnections_(0), +scannedConnections_(0), timer_(0), searchType_(NO_TYPE), error_(NO_ERROR), connections_(0) { QDBusConnection systemBus = QDBusConnection::systemBus(); @@ -69,24 +70,14 @@ ConnectionManager::~ConnectionManager() this, SLOT(scanResult(const QDBusMessage&))); } -void ConnectionManager::setBlocking(bool value) -{ - blocking_ = value; -} - bool ConnectionManager::connect() { connectionReady_ = false; unsigned int flags = static_cast(ICD_CONNECTION_FLAG_USER_EVENT); icd2interface_->call(ICD_DBUS_API_CONNECT_REQ, QVariant(flags)); - if(blocking_) - { - waitSignal(&connectionReady_); - return connected_; - } - - return true; + waitSignal(&connectionReady_); + return connected_; } bool ConnectionManager::connect(ConnectionManager::Connection const& connection) @@ -123,27 +114,26 @@ bool ConnectionManager::connect(QString const& id) error_ = UNKNOWN_ERROR; } + connected_ = false; + return false; } + connected_ = true; + return true; } bool ConnectionManager::getBestConnection(Connection& connection, ConnectionType type) { - bool blockingValue = blocking_; - - blocking_ = true; - QList connections; if(!scanConnections(connections)) { + qDebug() << "Unable to scan connections"; return false; } - blocking_ = blockingValue; - if(connections.size() == 0) { error_ = NO_AVAILABLE_CONNECTIONS; @@ -157,27 +147,27 @@ bool ConnectionManager::getBestConnection(Connection& connection, ConnectionType for(int i = 0; i < connections.size(); i++) { - switch(connections.at(i).type) - { - case WLAN: - if(type != GPRS && connections.at(i).strength > biggestWlan) - { - biggestWlan = connections.at(i).strength; - bestWlan = i; - } - break; - - case GPRS: - if(type != WLAN && connections.at(i).strength > biggestGprs) - { - biggestGprs = connections.at(i).strength; - bestGprs = i; - } - break; - - default: - qDebug() << "Unknown connection type"; - } + switch(connections.at(i).type) + { + case WLAN: + if(type != GPRS && connections.at(i).strength > biggestWlan) + { + biggestWlan = connections.at(i).strength; + bestWlan = i; + } + break; + + case GPRS: + if(type != WLAN && connections.at(i).strength > biggestGprs) + { + biggestGprs = connections.at(i).strength; + bestGprs = i; + } + break; + + default: + qDebug() << "Unknown connection type"; + } } if(bestWlan >= 0) @@ -200,24 +190,31 @@ bool ConnectionManager::getBestConnection(Connection& connection, ConnectionType bool ConnectionManager::disconnect(bool force) { - // Forced disconnect is not allowed if connection - // was not initialized by this class - if(!connected_ && force) + if(force) { - return false; + QDBusMessage msg = QDBusMessage::createSignal("/com/nokia/icd_ui", + "com.nokia.icd_ui", + "disconnect"); + + QList arguments; + bool val = true; + arguments.append(QVariant(val)); + msg.setArguments(arguments); + + bool ret = QDBusConnection::systemBus().send(msg); + + if(ret) + { + connected_ = false; + } + + return ret; } connectionReady_ = false; unsigned int flags; - if(force) - { - flags = static_cast(ICD_CONNECTION_FLAG_UI_EVENT); - } - else - { - flags = static_cast(ICD_CONNECTION_FLAG_USER_EVENT); - } + flags = static_cast(ICD_CONNECTION_FLAG_USER_EVENT); icd2interface_->call(ICD_DBUS_API_DISCONNECT_REQ, QVariant(flags)); connected_ = false; @@ -233,17 +230,11 @@ bool ConnectionManager::isConnected() if(numOfReplies == 0) { - emit isConnectedReply(false); return false; } - if(blocking_) - { - waitSignal(&stateReady_); - return connected_; - } - - return true; + waitSignal(&stateReady_); + return connected_; } bool ConnectionManager::scanConnections(QList& connections, @@ -253,42 +244,24 @@ bool ConnectionManager::scanConnections(QList& co scanReady_ = false; scannedConnections_ = 0; connections_ = &connections; - - QStringList networks; - - switch(type) - { - case WLAN: - networks << "WLAN_INFRA" << "WLAN_ADHOC"; - break; - case GPRS: - networks << "GPRS"; - break; - default: - break; - } + searchType_ = type; QDBusMessage rep = icd2interface_->call(ICD_DBUS_API_SCAN_REQ, - QVariant(flags), - QVariant(networks)); + QVariant(flags)); numberOfConnections_ = rep.arguments().value(0).toList().size(); + // For some reason, during call icd2 doesn't return any connections + // it is going to scan. However, it still scans them so use default value + // of 2. if(numberOfConnections_ == 0) { - connections_ = 0; - qDebug() << "No connections"; - return false; - } - - if(blocking_) - { - bool ret = waitSignal(&scanReady_); - connections_ = 0; - return ret; + numberOfConnections_ = 2; } - return true; + bool ret = waitSignal(&scanReady_); + connections_ = 0; + return ret; } ConnectionManager::Error ConnectionManager::error() const @@ -333,11 +306,6 @@ void ConnectionManager::stateChange(const QDBusMessage& rep) break; } - if(stateReady_) - { - emit isConnectedReply(connected_); - } - } void ConnectionManager::connectionChange(const QDBusMessage& rep) @@ -363,10 +331,6 @@ void ConnectionManager::connectionChange(const QDBusMessage& rep) break; } - if(connectionReady_) - { - emit connectReply(connected_); - } } void ConnectionManager::scanResult(const QDBusMessage& rep) @@ -389,28 +353,34 @@ void ConnectionManager::scanResult(const QDBusMessage& rep) { scanReady_ = true; connections_ = 0; - emit scanReady(); return; } - if(status != ICD_SCAN_NEW) + if(status != ICD_SCAN_NEW && status != ICD_SCAN_NOTIFY) { return; } Connection connection; - connection.id = QString(args.value(10).toByteArray()); - connection.name = args.value(8).toString(); - connection.strength = args.value(11).toInt(); QString type = args.value(7).toString(); if(type == "GPRS") { + if(searchType_ == WLAN) + { + return; + } + connection.type = GPRS; } else if(type == "WLAN_INFRA" || type == "WLAN_ADHOC") { + if(searchType_ == GPRS) + { + return; + } + connection.type = WLAN; } else @@ -419,7 +389,22 @@ void ConnectionManager::scanResult(const QDBusMessage& rep) return; } - emit newConnection(connection); + connection.id = QString(args.value(10).toByteArray()); + connection.name = args.value(8).toString(); + connection.strength = args.value(11).toInt(); + + for(int i = 0; i < connections_->size(); i++) + { + if(connections_->at(i).id == connection.id) + { + if(status == ICD_SCAN_NEW) + { + connections_->replace(i, connection); + } + + return; + } + } connections_->push_back(connection); }