X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcommon%2Fconnectionmanager.cpp;h=819652028592e50c4a5da472bd7b14162110a0f4;hb=2136f257ebff2370bdfe7572e0c87ef50705feb2;hp=f45b0e2e64521f324cb609769d5fd7b3b8525630;hpb=6046fed79d373b56f8a5c90aaff1358531e8f99d;p=jenirok diff --git a/src/common/connectionmanager.cpp b/src/common/connectionmanager.cpp index f45b0e2..8196520 100644 --- a/src/common/connectionmanager.cpp +++ b/src/common/connectionmanager.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include "connectionmanager.h" @@ -28,7 +29,7 @@ ConnectionManager::ConnectionManager(QObject* parent): QObject(parent), blocking_(true), stateReady_(false), connectionReady_(false), scanReady_(false), connected_(false), timeout_(false), numberOfConnections_(0), -scannedConnections_(0), timer_(0), connections_(false) +scannedConnections_(0), timer_(0), error_(NO_ERROR), connections_(0) { QDBusConnection systemBus = QDBusConnection::systemBus(); @@ -89,32 +90,129 @@ bool ConnectionManager::connect() bool ConnectionManager::connect(ConnectionManager::Connection const& connection) { - connectionReady_ = false; - QDBusArgument arg; - arg.beginStructure(); - arg << connection.serviceType - << connection.serviceAttributes - << connection.serviceID - << connection.networkType - << connection.networkAttributes - << connection.networkID; - arg.endStructure(); + return connect(connection.id); +} - unsigned int flags = static_cast(ICD_CONNECTION_FLAG_USER_EVENT); - QDBusMessage rep = icd2interface_->call(ICD_DBUS_API_CONNECT_REQ, - flags, arg.asVariant()); +bool ConnectionManager::connect(QString const& id) +{ + QDBusMessage msg = QDBusMessage::createMethodCall("com.nokia.icd", + "/com/nokia/icd", + "com.nokia.icd", + "connect"); + QList arguments; - qDebug() << rep.errorName() << rep.errorMessage(); + arguments.append(QVariant(id)); - if(blocking_) + unsigned int val = 0; + + arguments.append(QVariant(val)); + + msg.setArguments(arguments); + + QDBusMessage rep = QDBusConnection::systemBus().call(msg); + + if(rep.type() == QDBusMessage::ErrorMessage) { - waitSignal(&connectionReady_); - return connected_; + if(rep.errorName() == "com.nokia.icd.error.invalid_iap") + { + error_ = INVALID_IAP; + } + else + { + error_ = UNKNOWN_ERROR; + } + + return false; } return true; } +bool ConnectionManager::getBestConnection(Connection& connection) +{ + bool blockingValue = blocking_; + + blocking_ = true; + + QList connections; + + if(!scanConnections(connections)) + { + return false; + } + + blocking_ = blockingValue; + + if(connections.size() == 0) + { + qDebug() << "No connections"; + error_ = NO_AVAILABLE_CONNECTIONS; + return false; + } + + int biggestWlan = -1; + int biggestGprs = -1; + int bestWlan = -1; + int bestGprs = -1; + + for(int i = 0; i < connections.size(); i++) + { + switch(connections.at(i).type) + { + case WLAN: + if(connections.at(i).strength > biggestWlan) + { + biggestWlan = connections.at(i).strength; + bestWlan = i; + } + break; + + case GPRS: + if(connections.at(i).strength > biggestGprs) + { + biggestGprs = connections.at(i).strength; + bestGprs = i; + } + break; + + default: + qDebug() << "Unknown connection type"; + } + } + + if(bestWlan >= 0) + { + connection = connections.at(bestWlan); + return true; + } + else if(bestGprs >= 0) + { + connection = connections.at(bestGprs); + return true; + } + else + { + error_ = NO_AVAILABLE_CONNECTIONS; + return false; + } + +} + +bool ConnectionManager::autoConnect() +{ + Connection best; + + if(!getBestConnection(best)) + { + return false; + } + + qDebug() << "Best connection: " << best.name; + + return connect(best.id); + +} + bool ConnectionManager::disconnect(bool force) { // Forced disconnect is not allowed if connection @@ -165,7 +263,7 @@ bool ConnectionManager::isConnected() bool ConnectionManager::scanConnections(QList& connections) { - unsigned int flags = static_cast(ICD_SCAN_REQUEST_ACTIVE); + unsigned int flags = static_cast(ICD_SCAN_REQUEST_ACTIVE_SAVED); scanReady_ = false; scannedConnections_ = 0; connections_ = &connections; @@ -189,6 +287,51 @@ bool ConnectionManager::scanConnections(QList& co return true; } +ConnectionManager::NetworkMode ConnectionManager::getNetworkMode() +{ + QDBusMessage msg = QDBusMessage::createMethodCall("com.nokia.phone.net", + "/com/nokia/phone/net", + "Phone.Net", + "get_registration_status"); + + QDBusMessage rep = QDBusConnection::systemBus().call(msg); + + if(rep.type() == QDBusMessage::ErrorMessage) + { + qDebug() << rep.errorMessage(); + + return NETWORK_UNKNOWN; + } + + char services = rep.arguments().value(6).toChar().toAscii(); + + qDebug() << services; + + if(services & 0x08) + { + return NETWORK_3_5G; + } + else if(services & 0x04) + { + return NETWORK_3G; + } + else if(services & 0x01) + { + return NETWORK_2_5G; + } + else if(services & 0x02) + { + return NETWORK_2G; + } + + return NETWORK_UNKNOWN; +} + +ConnectionManager::Error ConnectionManager::error() const +{ + return error_; +} + void ConnectionManager::stateChange(const QDBusMessage& rep) { unsigned int status = rep.arguments().value(7).value(); @@ -281,6 +424,7 @@ void ConnectionManager::scanResult(const QDBusMessage& rep) if(scannedConnections_ >= numberOfConnections_) { scanReady_ = true; + connections_ = 0; emit scanReady(); return; } @@ -291,13 +435,25 @@ void ConnectionManager::scanResult(const QDBusMessage& rep) } Connection connection; - connection.serviceType = args.value(2).toString(); - connection.serviceAttributes = args.value(4).value(); - connection.serviceID = args.value(5).toString(); - connection.networkName = args.value(8).toString(); - connection.networkType = args.value(7).toString(); - connection.networkAttributes = args.value(9).value(); - connection.networkID = args.value(10).toByteArray(); + 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") + { + connection.type = GPRS; + } + else if(type == "WLAN_INFRA" || type == "WLAN_ADHOC") + { + connection.type = WLAN; + } + else + { + qDebug() << "Unknown connection type: " << type; + return; + } emit newConnection(connection);