summaryrefslogtreecommitdiffstats
path: root/src/plugins/bearer/networkmanager
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@gmail.com>2014-11-04 17:59:24 +1000
committerLorn Potter <lorn.potter@gmail.com>2014-11-06 20:00:15 +0100
commit999fa634829bf90e939f2fc14678a842eb49c75e (patch)
treed0aa66f9a15616eec4e4ec05c53b4b766e0c667d /src/plugins/bearer/networkmanager
parent13401116cce64bc7f2cf80b07ce34a4ad3abe829 (diff)
Support dual sim in QtBearer's networkmanager backend
Task-number: QTBUG-42368 Change-Id: I306733b5de7871fdeaa0accb512a3610753c84a5 Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
Diffstat (limited to 'src/plugins/bearer/networkmanager')
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp90
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.h6
2 files changed, 51 insertions, 45 deletions
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
index f07d7b242b..9adadb8f4f 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
@@ -58,9 +58,7 @@ QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
: QBearerEngineImpl(parent),
managerInterface(new QNetworkManagerInterface(this)),
systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this)),
- ofonoManager(new QOfonoManagerInterface(this)),
- ofonoNetwork(0),
- ofonoContextManager(0)
+ ofonoManager(new QOfonoManagerInterface(this))
{
if (!managerInterface->isValid())
@@ -97,16 +95,22 @@ QNetworkManagerEngine::~QNetworkManagerEngine()
interfaceDevices.clear();
connectionInterfaces.clear();
+
+ qDeleteAll(ofonoContextManagers);
+ ofonoContextManagers.clear();
}
void QNetworkManagerEngine::initialize()
{
QMutexLocker locker(&mutex);
- connect(ofonoManager,SIGNAL(modemChanged()),this,SLOT(changedModem()));
- ofonoNetwork = new QOfonoNetworkRegistrationInterface(ofonoManager->currentModem(),this);
- ofonoContextManager = new QOfonoDataConnectionManagerInterface(ofonoManager->currentModem(),this);
-
+ if (ofonoManager->isValid()) {
+ Q_FOREACH (const QString &modem, ofonoManager->getModems()) {
+ QOfonoDataConnectionManagerInterface *ofonoContextManager
+ = new QOfonoDataConnectionManagerInterface(modem,this);
+ ofonoContextManagers.insert(modem, ofonoContextManager);
+ }
+ }
// Get current list of access points.
foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
locker.unlock();
@@ -746,11 +750,14 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
}
}
} else if (connectionType == QLatin1String("gsm")) {
- cpPriv->bearerType = currentBearerType();
+
+ const QString contextPath = map.value("connection").value("id").toString();
+ cpPriv->name = contextName(contextPath);
+ cpPriv->bearerType = currentBearerType(contextPath);
+
if (map.value("connection").contains("timestamp")) {
cpPriv->state |= QNetworkConfiguration::Discovered;
}
- cpPriv->name = contextName(map.value("connection").value("id").toString());
}
return cpPriv;
@@ -889,34 +896,32 @@ QNetworkConfigurationPrivatePointer QNetworkManagerEngine::defaultConfiguration(
return QNetworkConfigurationPrivatePointer();
}
-void QNetworkManagerEngine::changedModem()
+QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType(const QString &id)
{
- if (ofonoNetwork)
- delete ofonoNetwork;
-
- ofonoNetwork = new QOfonoNetworkRegistrationInterface(ofonoManager->currentModem(),this);
-
- if (ofonoContextManager)
- delete ofonoContextManager;
- ofonoContextManager = new QOfonoDataConnectionManagerInterface(ofonoManager->currentModem(),this);
-}
+ if (ofonoManager->isValid()) {
+ QString contextPart = id.section('/', -1);
-QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType()
-{
- if (ofonoContextManager) {
- QString bearer = ofonoContextManager->bearer();
- if (bearer == QLatin1String("gsm")) {
- return QNetworkConfiguration::Bearer2G;
- } else if (bearer == QLatin1String("edge")) {
- return QNetworkConfiguration::Bearer2G;
- } else if (bearer == QLatin1String("umts")) {
- return QNetworkConfiguration::BearerWCDMA;
- } else if (bearer == QLatin1String("hspa")
- || bearer == QLatin1String("hsdpa")
- || bearer == QLatin1String("hsupa")) {
- return QNetworkConfiguration::BearerHSPA;
- } else if (bearer == QLatin1String("lte")) {
- return QNetworkConfiguration::BearerLTE;
+ QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
+ while (i.hasNext()) {
+ i.next();
+ QString contextPath = i.key() +"/"+contextPart;
+ if (i.value()->contexts().contains(contextPath)) {
+
+ QString bearer = i.value()->bearer();
+ if (bearer == QStringLiteral("gsm")) {
+ return QNetworkConfiguration::Bearer2G;
+ } else if (bearer == QStringLiteral("edge")) {
+ return QNetworkConfiguration::Bearer2G;
+ } else if (bearer == QStringLiteral("umts")) {
+ return QNetworkConfiguration::BearerWCDMA;
+ } else if (bearer == QStringLiteral("hspa")
+ || bearer == QStringLiteral("hsdpa")
+ || bearer == QStringLiteral("hsupa")) {
+ return QNetworkConfiguration::BearerHSPA;
+ } else if (bearer == QStringLiteral("lte")) {
+ return QNetworkConfiguration::BearerLTE;
+ }
+ }
}
}
return QNetworkConfiguration::BearerUnknown;
@@ -924,13 +929,16 @@ QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType()
QString QNetworkManagerEngine::contextName(const QString &path)
{
- if (ofonoContextManager) {
+ if (ofonoManager->isValid()) {
QString contextPart = path.section('/', -1);
-
- Q_FOREACH (const QString &oContext, ofonoContextManager->contexts()) {
- if (oContext.contains(contextPart)) {
- QOfonoConnectionContextInterface contextInterface(oContext,this);
- return contextInterface.name();
+ QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
+ while (i.hasNext()) {
+ i.next();
+ Q_FOREACH (const QString &oContext, i.value()->contexts()) {
+ if (oContext.contains(contextPart)) {
+ QOfonoConnectionContextInterface contextInterface(oContext,this);
+ return contextInterface.name();
+ }
}
}
}
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
index d2ef9886a3..84c0b21b6c 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
@@ -106,7 +106,6 @@ private Q_SLOTS:
void newAccessPoint(const QString &path);
void removeAccessPoint(const QString &path);
void scanFinished();
- void changedModem();
private:
QNetworkConfigurationPrivate *parseConnection(const QString &settingsPath,
@@ -125,9 +124,8 @@ private:
QHash<QString,QString> connectionInterfaces; // ac, interface
QOfonoManagerInterface *ofonoManager;
- QOfonoNetworkRegistrationInterface *ofonoNetwork;
- QOfonoDataConnectionManagerInterface *ofonoContextManager;
- QNetworkConfiguration::BearerType currentBearerType();
+ QHash <QString, QOfonoDataConnectionManagerInterface *> ofonoContextManagers;
+ QNetworkConfiguration::BearerType currentBearerType(const QString &id);
QString contextName(const QString &path);
};