#include <QtCore/QTimerEvent>
#include <QtCore/QVariant>
#include <QtDBus/QDBusArgument>
+#include <QtDBus/QDBusConnection>
#include <icd/dbus_api.h>
#include "connectionmanager.h"
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();
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<unsigned int>(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<QVariant> 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<Connection> 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
bool ConnectionManager::scanConnections(QList<ConnectionManager::Connection>& connections)
{
- unsigned int flags = static_cast<unsigned int>(ICD_SCAN_REQUEST_ACTIVE);
+ unsigned int flags = static_cast<unsigned int>(ICD_SCAN_REQUEST_ACTIVE_SAVED);
scanReady_ = false;
scannedConnections_ = 0;
connections_ = &connections;
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<unsigned int>();
if(scannedConnections_ >= numberOfConnections_)
{
scanReady_ = true;
+ connections_ = 0;
emit scanReady();
return;
}
}
Connection connection;
- connection.serviceType = args.value(2).toString();
- connection.serviceAttributes = args.value(4).value<unsigned int>();
- connection.serviceID = args.value(5).toString();
- connection.networkName = args.value(8).toString();
- connection.networkType = args.value(7).toString();
- connection.networkAttributes = args.value(9).value<unsigned int>();
- 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);