~apachelogger/kubuntu-packaging/qtbase-opensource-src-fixkonvi

« back to all changes in this revision

Viewing changes to debian/patches/QtBearer-networkmanager-make-sure-to-set-flag-Active.patch

  • Committer: Timo Jyrinki
  • Date: 2015-02-04 10:10:58 UTC
  • Revision ID: timo.jyrinki@canonical.com-20150204101058-yumasr4azmrqlb1e
* Include the networkmanager backend changes from 5.4.1
+ sync with Qt 5.3.2 branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
From f217a8096b3c6188dd1d1520d854f330dbb17264 Mon Sep 17 00:00:00 2001
 
2
From: Lorn Potter <lorn.potter@gmail.com>
 
3
Date: Thu, 13 Nov 2014 13:06:49 +1000
 
4
Subject: [PATCH] QtBearer networkmanager make sure to set flag Active
 
5
 
 
6
Also, no need to create objects to get properties, when the properties
 
7
can be had for free.
 
8
 
 
9
Make plugin more robust to network-manager or ofono crashes
 
10
 
 
11
Change-Id: Ibadb46bd51aa27f130f8d245e8c50aa7bff5f9c8
 
12
Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
 
13
Reviewed-by: Timo Jyrinki <timo.jyrinki@canonical.com>
 
14
---
 
15
 .../bearer/linux_common/qofonoservice_linux.cpp    |  12 +
 
16
 .../bearer/linux_common/qofonoservice_linux_p.h    |   2 +
 
17
 src/plugins/bearer/networkmanager/main.cpp         |   5 +-
 
18
 .../networkmanager/qnetworkmanagerengine.cpp       | 310 ++++++++++++++-------
 
19
 .../bearer/networkmanager/qnetworkmanagerengine.h  |  13 +
 
20
 .../networkmanager/qnetworkmanagerservice.cpp      |  22 ++
 
21
 .../bearer/networkmanager/qnetworkmanagerservice.h |   2 +
 
22
 7 files changed, 263 insertions(+), 103 deletions(-)
 
23
 
 
24
diff --git a/src/plugins/bearer/linux_common/qofonoservice_linux.cpp b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
 
25
index b2e2131..abbfd44 100644
 
26
--- a/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
 
27
+++ b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
 
28
@@ -269,6 +269,18 @@ QStringList QOfonoDataConnectionManagerInterface::contexts()
 
29
     return contextList;
 
30
 }
 
31
 
 
32
+PathPropertiesList QOfonoDataConnectionManagerInterface::contextsWithProperties()
 
33
+{
 
34
+    if (contextListProperties.isEmpty()) {
 
35
+        QDBusPendingReply<PathPropertiesList > reply = call(QLatin1String("GetContexts"));
 
36
+        reply.waitForFinished();
 
37
+        if (!reply.isError()) {
 
38
+            contextListProperties = reply.value();
 
39
+        }
 
40
+    }
 
41
+    return contextListProperties;
 
42
+}
 
43
+
 
44
 bool QOfonoDataConnectionManagerInterface::roamingAllowed()
 
45
 {
 
46
     QVariant var = getProperty(QStringLiteral("RoamingAllowed"));
 
47
diff --git a/src/plugins/bearer/linux_common/qofonoservice_linux_p.h b/src/plugins/bearer/linux_common/qofonoservice_linux_p.h
 
48
index 0ed00d9..3b97e06 100644
 
49
--- a/src/plugins/bearer/linux_common/qofonoservice_linux_p.h
 
50
+++ b/src/plugins/bearer/linux_common/qofonoservice_linux_p.h
 
51
@@ -153,6 +153,7 @@ public:
 
52
     ~QOfonoDataConnectionManagerInterface();
 
53
 
 
54
     QStringList contexts();
 
55
+    PathPropertiesList contextsWithProperties();
 
56
     bool roamingAllowed();
 
57
     QVariant getProperty(const QString &);
 
58
     QString bearer();
 
59
@@ -162,6 +163,7 @@ private:
 
60
     QVariantMap getProperties();
 
61
     QVariantMap propertiesMap;
 
62
     QStringList contextList;
 
63
+    PathPropertiesList contextListProperties;
 
64
 private slots:
 
65
     void propertyChanged(const QString &, const QDBusVariant &value);
 
66
 };
 
67
diff --git a/src/plugins/bearer/networkmanager/main.cpp b/src/plugins/bearer/networkmanager/main.cpp
 
68
index f416bb4..3576ddc 100644
 
69
--- a/src/plugins/bearer/networkmanager/main.cpp
 
70
+++ b/src/plugins/bearer/networkmanager/main.cpp
 
71
@@ -66,10 +66,7 @@ QBearerEngine *QNetworkManagerEnginePlugin::create(const QString &key) const
 
72
 {
 
73
     if (key == QLatin1String("networkmanager")) {
 
74
         QNetworkManagerEngine *engine = new QNetworkManagerEngine;
 
75
-        if (engine->networkManagerAvailable())
 
76
-            return engine;
 
77
-        else
 
78
-            delete engine;
 
79
+        return engine;
 
80
     }
 
81
 
 
82
     return 0;
 
83
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
 
84
index a8244f0..f0977b4 100644
 
85
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
 
86
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
 
87
@@ -56,29 +56,34 @@ QT_BEGIN_NAMESPACE
 
88
 
 
89
 QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
 
90
 :   QBearerEngineImpl(parent),
 
91
-    managerInterface(new QNetworkManagerInterface(this)),
 
92
-    systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this)),
 
93
-    ofonoManager(new QOfonoManagerInterface(this))
 
94
+    managerInterface(NULL),
 
95
+    systemSettings(NULL),
 
96
+    ofonoManager(NULL),
 
97
+    nmAvailable(false)
 
98
 {
 
99
-
 
100
-    if (!managerInterface->isValid())
 
101
-        return;
 
102
-
 
103
     qDBusRegisterMetaType<QNmSettingsMap>();
 
104
 
 
105
-    connect(managerInterface, SIGNAL(deviceAdded(QDBusObjectPath)),
 
106
-            this, SLOT(deviceAdded(QDBusObjectPath)));
 
107
-    connect(managerInterface, SIGNAL(deviceRemoved(QDBusObjectPath)),
 
108
-            this, SLOT(deviceRemoved(QDBusObjectPath)));
 
109
-    connect(managerInterface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)),
 
110
-            this, SLOT(activationFinished(QDBusPendingCallWatcher*)));
 
111
-    connect(managerInterface, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
 
112
-            this, SLOT(interfacePropertiesChanged(QMap<QString,QVariant>)));
 
113
-    managerInterface->setConnections();
 
114
-
 
115
-    connect(systemSettings, SIGNAL(newConnection(QDBusObjectPath)),
 
116
-            this, SLOT(newConnection(QDBusObjectPath)));
 
117
-    systemSettings->setConnections();
 
118
+    nmWatcher = new QDBusServiceWatcher(NM_DBUS_SERVICE,QDBusConnection::systemBus(),
 
119
+            QDBusServiceWatcher::WatchForRegistration |
 
120
+            QDBusServiceWatcher::WatchForUnregistration, this);
 
121
+    connect(nmWatcher, SIGNAL(serviceRegistered(QString)),
 
122
+            this, SLOT(nmRegistered(QString)));
 
123
+    connect(nmWatcher, SIGNAL(serviceUnregistered(QString)),
 
124
+            this, SLOT(nmUnRegistered(QString)));
 
125
+
 
126
+    ofonoWatcher = new QDBusServiceWatcher("org.ofono",QDBusConnection::systemBus(),
 
127
+            QDBusServiceWatcher::WatchForRegistration |
 
128
+            QDBusServiceWatcher::WatchForUnregistration, this);
 
129
+    connect(ofonoWatcher, SIGNAL(serviceRegistered(QString)),
 
130
+            this, SLOT(ofonoRegistered(QString)));
 
131
+    connect(ofonoWatcher, SIGNAL(serviceUnregistered(QString)),
 
132
+            this, SLOT(ofonoUnRegistered(QString)));
 
133
+
 
134
+    if (QDBusConnection::systemBus().interface()->isServiceRegistered("org.ofono"))
 
135
+        ofonoRegistered();
 
136
+
 
137
+    if (QDBusConnection::systemBus().interface()->isServiceRegistered(NM_DBUS_SERVICE))
 
138
+        nmRegistered();
 
139
 }
 
140
 
 
141
 QNetworkManagerEngine::~QNetworkManagerEngine()
 
142
@@ -105,15 +110,13 @@ QNetworkManagerEngine::~QNetworkManagerEngine()
 
143
 
 
144
 void QNetworkManagerEngine::initialize()
 
145
 {
 
146
-    QMutexLocker locker(&mutex);
 
147
+    if (nmAvailable)
 
148
+        setupConfigurations();
 
149
+}
 
150
 
 
151
-    if (ofonoManager->isValid()) {
 
152
-        Q_FOREACH (const QString &modem, ofonoManager->getModems()) {
 
153
-            QOfonoDataConnectionManagerInterface *ofonoContextManager
 
154
-                    = new QOfonoDataConnectionManagerInterface(modem,this);
 
155
-            ofonoContextManagers.insert(modem, ofonoContextManager);
 
156
-        }
 
157
-    }
 
158
+void QNetworkManagerEngine::setupConfigurations()
 
159
+{
 
160
+    QMutexLocker locker(&mutex);
 
161
     // Get active connections.
 
162
     foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
 
163
 
 
164
@@ -151,7 +154,7 @@ void QNetworkManagerEngine::initialize()
 
165
 
 
166
 bool QNetworkManagerEngine::networkManagerAvailable() const
 
167
 {
 
168
-    return managerInterface->isValid();
 
169
+    return nmAvailable;
 
170
 }
 
171
 
 
172
 QString QNetworkManagerEngine::getInterfaceFromId(const QString &settingsPath)
 
173
@@ -180,6 +183,9 @@ void QNetworkManagerEngine::connectToId(const QString &id)
 
174
     const QString settingsPath = connection->connectionInterface()->path();
 
175
     QString specificPath = configuredAccessPoints.key(settingsPath);
 
176
 
 
177
+    if (isConnectionActive(settingsPath))
 
178
+        return;
 
179
+
 
180
     QHashIterator<QString, QNetworkManagerInterfaceDevice*> i(interfaceDevices);
 
181
     while (i.hasNext()) {
 
182
         i.next();
 
183
@@ -229,7 +235,7 @@ void QNetworkManagerEngine::disconnectFromId(const QString &id)
 
184
 
 
185
 void QNetworkManagerEngine::requestUpdate()
 
186
 {
 
187
-    if (managerInterface->wirelessEnabled()) {
 
188
+    if (managerInterface && managerInterface->wirelessEnabled()) {
 
189
         QHashIterator<QString, QNetworkManagerInterfaceDeviceWireless *> i(wirelessDevices);
 
190
         while (i.hasNext()) {
 
191
             i.next();
 
192
@@ -282,8 +288,9 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QMap<QString, QVari
 
193
                 if (ptr) {
 
194
                     ptr->mutex.lock();
 
195
                     if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
 
196
-                        ptr->state != QNetworkConfiguration::Active) {
 
197
-                        ptr->state = QNetworkConfiguration::Active;
 
198
+                            (ptr->state & QNetworkConfiguration::Active) != QNetworkConfiguration::Active) {
 
199
+
 
200
+                        ptr->state |= QNetworkConfiguration::Active;
 
201
 
 
202
                         if (activeConnectionsList.value(id) && activeConnectionsList.value(id)->defaultRoute()
 
203
                                 && managerInterface->state() < QNetworkManagerInterface::NM_STATE_CONNECTED_GLOBAL) {
 
204
@@ -339,23 +346,25 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QMap<QString
 
205
 
 
206
     QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
 
207
     if (ptr) {
 
208
-        ptr->mutex.lock();
 
209
-        if (properties.value("State").toUInt() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
 
210
-            QStringList devices = activeConnection->devices();
 
211
-            if (!devices.isEmpty()) {
 
212
-                QNetworkManagerInterfaceDevice device(devices.at(0),this);
 
213
-                connectionInterfaces.insert(id,device.networkInterface());
 
214
-            }
 
215
+        if (properties.contains(QStringLiteral("State"))) {
 
216
+            ptr->mutex.lock();
 
217
+            if (properties.value("State").toUInt() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
 
218
+                QStringList devices = activeConnection->devices();
 
219
+                if (!devices.isEmpty()) {
 
220
+                    QNetworkManagerInterfaceDevice device(devices.at(0),this);
 
221
+                    connectionInterfaces.insert(id,device.networkInterface());
 
222
+                }
 
223
 
 
224
-            ptr->state |= QNetworkConfiguration::Active;
 
225
-            ptr->mutex.unlock();
 
226
+                ptr->state |= QNetworkConfiguration::Active;
 
227
+                ptr->mutex.unlock();
 
228
 
 
229
-            locker.unlock();
 
230
-            emit configurationChanged(ptr);
 
231
-            locker.relock();
 
232
-        } else {
 
233
-            connectionInterfaces.remove(id);
 
234
-            ptr->mutex.unlock();
 
235
+                locker.unlock();
 
236
+                emit configurationChanged(ptr);
 
237
+                locker.relock();
 
238
+            } else {
 
239
+                connectionInterfaces.remove(id);
 
240
+                ptr->mutex.unlock();
 
241
+            }
 
242
         }
 
243
     }
 
244
 }
 
245
@@ -403,9 +412,6 @@ void QNetworkManagerEngine::deviceAdded(const QDBusObjectPath &path)
 
246
         connect(wirelessDevice,SIGNAL(scanDone()),this,SLOT(scanFinished()));
 
247
         wirelessDevice->setConnections();
 
248
 
 
249
-        foreach (const QDBusObjectPath &apPath, wirelessDevice->getAccessPoints())
 
250
-            newAccessPoint(apPath.path());
 
251
-
 
252
         wirelessDevices.insert(path.path(), wirelessDevice);
 
253
     }
 
254
 
 
255
@@ -518,14 +524,9 @@ void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
 
256
         parseConnection(settingsPath, connection->getSettings());
 
257
 
 
258
     // Check if connection is active.
 
259
-    QHashIterator<QString, QNetworkManagerConnectionActive*> i(activeConnectionsList);
 
260
-    while (i.hasNext()) {
 
261
-        i.next();
 
262
-        if (i.value()->connection().path() == settingsPath) {
 
263
-            cpPriv->state |= QNetworkConfiguration::Active;
 
264
-            break;
 
265
-        }
 
266
-    }
 
267
+    if (isConnectionActive(settingsPath))
 
268
+        cpPriv->state |= QNetworkConfiguration::Active;
 
269
+
 
270
     if (deviceType == DEVICE_TYPE_ETHERNET) {
 
271
         QHashIterator<QString, QNetworkManagerInterfaceDevice*> i(interfaceDevices);
 
272
         while (i.hasNext()) {
 
273
@@ -539,12 +540,36 @@ void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
 
274
              }
 
275
          }
 
276
      }
 
277
+
 
278
     QNetworkConfigurationPrivatePointer ptr(cpPriv);
 
279
     accessPointConfigurations.insert(ptr->id, ptr);
 
280
     locker.unlock();
 
281
     emit configurationAdded(ptr);
 
282
 }
 
283
 
 
284
+bool QNetworkManagerEngine::isConnectionActive(const QString &settingsPath)
 
285
+{
 
286
+    QHashIterator<QString, QNetworkManagerConnectionActive*> i(activeConnectionsList);
 
287
+    while (i.hasNext()) {
 
288
+        i.next();
 
289
+        if (i.value()->connection().path() == settingsPath) {
 
290
+            if (i.value()->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATING
 
291
+                    || i.value()->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
 
292
+                return true;
 
293
+            } else {
 
294
+                break;
 
295
+            }
 
296
+        }
 
297
+    }
 
298
+
 
299
+    QNetworkManagerSettingsConnection *settingsConnection = connectionFromId(settingsPath);
 
300
+    if (settingsConnection->getType() == DEVICE_TYPE_MODEM) {
 
301
+        return isActiveContext(settingsConnection->connectionInterface()->path());
 
302
+    }
 
303
+
 
304
+    return false;
 
305
+}
 
306
+
 
307
 void QNetworkManagerEngine::removeConnection(const QString &path)
 
308
 {
 
309
     QMutexLocker locker(&mutex);
 
310
@@ -652,7 +677,6 @@ void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher)
 
311
 void QNetworkManagerEngine::newAccessPoint(const QString &path)
 
312
 {
 
313
     QMutexLocker locker(&mutex);
 
314
-
 
315
     QNetworkManagerInterfaceAccessPoint *accessPoint =
 
316
         new QNetworkManagerInterfaceAccessPoint(path,this);
 
317
 
 
318
@@ -683,6 +707,9 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path)
 
319
                 ptr->mutex.lock();
 
320
                 QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
 
321
                 ptr->state = (flag | QNetworkConfiguration::Discovered);
 
322
+
 
323
+                if (isConnectionActive(settingsPath))
 
324
+                    ptr->state = (flag | QNetworkConfiguration::Active);
 
325
                 ptr->mutex.unlock();
 
326
 
 
327
                 locker.unlock();
 
328
@@ -762,7 +789,6 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
 
329
     QMutexLocker locker(&mutex);
 
330
     QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
 
331
     cpPriv->name = map.value("connection").value("id").toString();
 
332
-
 
333
     cpPriv->isValid = true;
 
334
     cpPriv->id = settingsPath;
 
335
     cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
 
336
@@ -811,18 +837,46 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
 
337
         }
 
338
     } else if (connectionType == QLatin1String("gsm")) {
 
339
 
 
340
-        const QString contextPath = map.value("connection").value("id").toString();
 
341
-        cpPriv->name = contextName(contextPath);
 
342
-        cpPriv->bearerType = currentBearerType(contextPath);
 
343
-
 
344
-        if (map.value("connection").contains("timestamp")) {
 
345
-            cpPriv->state |= QNetworkConfiguration::Discovered;
 
346
+        const QString connectionPath = map.value("connection").value("id").toString();
 
347
+        cpPriv->name = contextName(connectionPath);
 
348
+        cpPriv->bearerType = currentBearerType(connectionPath);
 
349
+
 
350
+        if (ofonoManager && ofonoManager->isValid()) {
 
351
+            const QString contextPart = connectionPath.section('/', -1);
 
352
+            QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
 
353
+            while (i.hasNext()) {
 
354
+                i.next();
 
355
+                const QString path = i.key() +"/"+contextPart;
 
356
+                if (isActiveContext(path)) {
 
357
+                    cpPriv->state |= QNetworkConfiguration::Active;
 
358
+                    break;
 
359
+                }
 
360
+            }
 
361
         }
 
362
     }
 
363
 
 
364
     return cpPriv;
 
365
 }
 
366
 
 
367
+bool QNetworkManagerEngine::isActiveContext(const QString &contextPath)
 
368
+{
 
369
+    if (ofonoManager && ofonoManager->isValid()) {
 
370
+        const QString contextPart = contextPath.section('/', -1);
 
371
+        QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
 
372
+        while (i.hasNext()) {
 
373
+            i.next();
 
374
+            PathPropertiesList list = i.value()->contextsWithProperties();
 
375
+            for (int i = 0; i < list.size(); ++i) {
 
376
+                if (list.at(i).path.path().contains(contextPart)) {
 
377
+                    return list.at(i).properties.value(QStringLiteral("Active")).toBool();
 
378
+
 
379
+                }
 
380
+            }
 
381
+        }
 
382
+    }
 
383
+    return false;
 
384
+}
 
385
+
 
386
 QNetworkManagerSettingsConnection *QNetworkManagerEngine::connectionFromId(const QString &id) const
 
387
 {
 
388
     for (int i = 0; i < connections.count(); ++i) {
 
389
@@ -967,53 +1021,111 @@ QNetworkConfigurationPrivatePointer QNetworkManagerEngine::defaultConfiguration(
 
390
 
 
391
 QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType(const QString &id)
 
392
 {
 
393
-    if (ofonoManager->isValid()) {
 
394
-        QString contextPart = id.section('/', -1);
 
395
-
 
396
-        QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
 
397
-        while (i.hasNext()) {
 
398
-            i.next();
 
399
-            QString contextPath = i.key() +"/"+contextPart;
 
400
-            if (i.value()->contexts().contains(contextPath)) {
 
401
-
 
402
-                QString bearer = i.value()->bearer();
 
403
-                if (bearer == QStringLiteral("gsm")) {
 
404
-                    return QNetworkConfiguration::Bearer2G;
 
405
-                } else if (bearer == QStringLiteral("edge")) {
 
406
-                    return QNetworkConfiguration::Bearer2G;
 
407
-                } else if (bearer == QStringLiteral("umts")) {
 
408
-                    return QNetworkConfiguration::BearerWCDMA;
 
409
-                } else if (bearer == QStringLiteral("hspa")
 
410
-                           || bearer == QStringLiteral("hsdpa")
 
411
-                           || bearer == QStringLiteral("hsupa")) {
 
412
-                    return QNetworkConfiguration::BearerHSPA;
 
413
-                } else if (bearer == QStringLiteral("lte")) {
 
414
-                    return QNetworkConfiguration::BearerLTE;
 
415
-                }
 
416
+    QString contextPart = id.section('/', -1);
 
417
+    QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
 
418
+    while (i.hasNext()) {
 
419
+        i.next();
 
420
+        QString contextPath = i.key() +"/"+contextPart;
 
421
+
 
422
+        if (i.value()->contexts().contains(contextPath)) {
 
423
+
 
424
+            QString bearer = i.value()->bearer();
 
425
+
 
426
+            if (bearer == QStringLiteral("gsm")) {
 
427
+                return QNetworkConfiguration::Bearer2G;
 
428
+            } else if (bearer == QStringLiteral("edge")) {
 
429
+                return QNetworkConfiguration::Bearer2G;
 
430
+            } else if (bearer == QStringLiteral("umts")) {
 
431
+                return QNetworkConfiguration::BearerWCDMA;
 
432
+            } else if (bearer == QStringLiteral("hspa")
 
433
+                       || bearer == QStringLiteral("hsdpa")
 
434
+                       || bearer == QStringLiteral("hsupa")) {
 
435
+                return QNetworkConfiguration::BearerHSPA;
 
436
+            } else if (bearer == QStringLiteral("lte")) {
 
437
+                return QNetworkConfiguration::BearerLTE;
 
438
             }
 
439
         }
 
440
     }
 
441
+
 
442
     return QNetworkConfiguration::BearerUnknown;
 
443
 }
 
444
 
 
445
 QString QNetworkManagerEngine::contextName(const QString &path)
 
446
 {
 
447
-    if (ofonoManager->isValid()) {
 
448
-        QString contextPart = path.section('/', -1);
 
449
-        QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
 
450
-        while (i.hasNext()) {
 
451
-            i.next();
 
452
-            Q_FOREACH (const QString &oContext, i.value()->contexts()) {
 
453
-                if (oContext.contains(contextPart)) {
 
454
-                    QOfonoConnectionContextInterface contextInterface(oContext,this);
 
455
-                    return contextInterface.name();
 
456
-                }
 
457
+    QString contextPart = path.section('/', -1);
 
458
+    QHashIterator<QString, QOfonoDataConnectionManagerInterface*> i(ofonoContextManagers);
 
459
+    while (i.hasNext()) {
 
460
+        i.next();
 
461
+        PathPropertiesList list = i.value()->contextsWithProperties();
 
462
+        for (int i = 0; i < list.size(); ++i) {
 
463
+            if (list.at(i).path.path().contains(contextPart)) {
 
464
+                return list.at(i).properties.value(QStringLiteral("Name")).toString();
 
465
             }
 
466
         }
 
467
     }
 
468
     return path;
 
469
 }
 
470
 
 
471
+void QNetworkManagerEngine::nmRegistered(const QString &)
 
472
+{
 
473
+    if (ofonoManager) {
 
474
+        delete ofonoManager;
 
475
+        ofonoManager = NULL;
 
476
+    }
 
477
+    managerInterface = new QNetworkManagerInterface(this);
 
478
+    systemSettings = new QNetworkManagerSettings(NM_DBUS_SERVICE, this);
 
479
+
 
480
+    connect(managerInterface, SIGNAL(deviceAdded(QDBusObjectPath)),
 
481
+            this, SLOT(deviceAdded(QDBusObjectPath)));
 
482
+    connect(managerInterface, SIGNAL(deviceRemoved(QDBusObjectPath)),
 
483
+            this, SLOT(deviceRemoved(QDBusObjectPath)));
 
484
+    connect(managerInterface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)),
 
485
+            this, SLOT(activationFinished(QDBusPendingCallWatcher*)));
 
486
+    connect(managerInterface, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
 
487
+            this, SLOT(interfacePropertiesChanged(QMap<QString,QVariant>)));
 
488
+    managerInterface->setConnections();
 
489
+
 
490
+    connect(systemSettings, SIGNAL(newConnection(QDBusObjectPath)),
 
491
+            this, SLOT(newConnection(QDBusObjectPath)));
 
492
+    systemSettings->setConnections();
 
493
+    nmAvailable = true;
 
494
+
 
495
+    setupConfigurations();
 
496
+}
 
497
+
 
498
+void QNetworkManagerEngine::nmUnRegistered(const QString &)
 
499
+{
 
500
+    if (systemSettings) {
 
501
+        delete systemSettings;
 
502
+        systemSettings = NULL;
 
503
+    }
 
504
+    if (managerInterface) {
 
505
+        delete managerInterface;
 
506
+        managerInterface = NULL;
 
507
+    }
 
508
+}
 
509
+
 
510
+void QNetworkManagerEngine::ofonoRegistered(const QString &)
 
511
+{
 
512
+    if (ofonoManager) {
 
513
+        delete ofonoManager;
 
514
+        ofonoManager = NULL;
 
515
+    }
 
516
+    ofonoManager = new QOfonoManagerInterface(this);
 
517
+    if (ofonoManager && ofonoManager->isValid()) {
 
518
+        Q_FOREACH (const QString &modem, ofonoManager->getModems()) {
 
519
+            QOfonoDataConnectionManagerInterface *ofonoContextManager
 
520
+                    = new QOfonoDataConnectionManagerInterface(modem,this);
 
521
+            ofonoContextManagers.insert(modem, ofonoContextManager);
 
522
+        }
 
523
+    }
 
524
+}
 
525
+
 
526
+void QNetworkManagerEngine::ofonoUnRegistered(const QString &)
 
527
+{
 
528
+    ofonoContextManagers.clear();
 
529
+}
 
530
+
 
531
 QT_END_NAMESPACE
 
532
 
 
533
 #endif // QT_NO_DBUS
 
534
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
 
535
index 671ed80..da6af14 100644
 
536
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
 
537
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
 
538
@@ -109,6 +109,12 @@ private Q_SLOTS:
 
539
 
 
540
     void wiredCarrierChanged(bool);
 
541
 
 
542
+    void nmRegistered(const QString &serviceName = QString());
 
543
+    void nmUnRegistered(const QString &serviceName = QString());
 
544
+
 
545
+    void ofonoRegistered(const QString &serviceName = QString());
 
546
+    void ofonoUnRegistered(const QString &serviceName = QString());
 
547
+
 
548
 private:
 
549
     QNetworkConfigurationPrivate *parseConnection(const QString &settingsPath,
 
550
                                                   const QNmSettingsMap &map);
 
551
@@ -132,6 +138,13 @@ private:
 
552
     QNetworkConfiguration::BearerType currentBearerType(const QString &id);
 
553
     QString contextName(const QString &path);
 
554
 
 
555
+    bool isConnectionActive(const QString &settingsPath);
 
556
+    QDBusServiceWatcher *ofonoWatcher;
 
557
+    QDBusServiceWatcher *nmWatcher;
 
558
+
 
559
+    bool isActiveContext(const QString &contextPath);
 
560
+    bool nmAvailable;
 
561
+    void setupConfigurations();
 
562
 };
 
563
 
 
564
 QT_END_NAMESPACE
 
565
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
 
566
index dc3b71e..fad94f0 100644
 
567
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
 
568
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
 
569
@@ -688,6 +688,15 @@ QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(c
 
570
                                   QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
 
571
                                   QLatin1String("PropertiesChanged"),
 
572
                                   this,SLOT(propertiesSwap(QMap<QString,QVariant>)));
 
573
+
 
574
+    QDBusPendingReply<QList<QDBusObjectPath> > reply
 
575
+            = d->connectionInterface->asyncCall(QLatin1String("GetAccessPoints"));
 
576
+
 
577
+    QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(reply);
 
578
+    connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
 
579
+                     this, SLOT(accessPointsFinished(QDBusPendingCallWatcher*)));
 
580
+
 
581
+
 
582
     d->valid = true;
 
583
 }
 
584
 
 
585
@@ -749,6 +758,19 @@ bool QNetworkManagerInterfaceDeviceWireless::setConnections()
 
586
     return allOk;
 
587
 }
 
588
 
 
589
+void QNetworkManagerInterfaceDeviceWireless::accessPointsFinished(QDBusPendingCallWatcher *watcher)
 
590
+{
 
591
+    QDBusPendingReply<QList<QDBusObjectPath> > reply(*watcher);
 
592
+    watcher->deleteLater();
 
593
+    if (!reply.isError()) {
 
594
+        accessPointsList = reply.value();
 
595
+    }
 
596
+
 
597
+    for (int i = 0; i < accessPointsList.size(); i++) {
 
598
+        Q_EMIT accessPointAdded(accessPointsList.at(i).path());
 
599
+    }
 
600
+}
 
601
+
 
602
 QDBusInterface *QNetworkManagerInterfaceDeviceWireless::connectionInterface() const
 
603
 {
 
604
     return d->connectionInterface;
 
605
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
 
606
index da909c4..e645159 100644
 
607
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
 
608
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
 
609
@@ -369,6 +369,8 @@ private Q_SLOTS:
 
610
     void slotAccessPointAdded(QDBusObjectPath);
 
611
     void slotAccessPointRemoved(QDBusObjectPath);
 
612
 
 
613
+    void accessPointsFinished(QDBusPendingCallWatcher *watcher);
 
614
+
 
615
 private:
 
616
     QNetworkManagerInterfaceDeviceWirelessPrivate *d;
 
617
     QVariantMap propertyMap;
 
618
-- 
 
619
2.1.4
 
620