diff options
author | Lorn Potter <lorn.potter@gmail.com> | 2014-10-23 19:48:23 +1000 |
---|---|---|
committer | Lorn Potter <lorn.potter@gmail.com> | 2014-10-24 06:37:54 +0200 |
commit | 575008ec81d7bffc8b7ce631fa8f21377aada7cf (patch) | |
tree | d0f49bddbc62aa4c158fe74498e6aaade40214e9 | |
parent | d6d3841e71473d3e9253b3088bc4094a7546600e (diff) |
Fix bogus error report when disconnect/stop actually works
The interfaces serviceActive does not mean the network is connected, so
we get the next best thing - the interfaces associated ssid will be
empty if a previously connected AP is now disconnected.
Task-number: QTBUG-42087
Change-Id: I539811d9f18cc553a4022a03686fb8a864b98491
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
-rw-r--r-- | src/plugins/bearer/corewlan/qcorewlanengine.h | 2 | ||||
-rw-r--r-- | src/plugins/bearer/corewlan/qcorewlanengine.mm | 34 |
2 files changed, 31 insertions, 5 deletions
diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.h b/src/plugins/bearer/corewlan/qcorewlanengine.h index 930bde40b3..50bdab0ea6 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.h +++ b/src/plugins/bearer/corewlan/qcorewlanengine.h @@ -83,6 +83,7 @@ public: private Q_SLOTS: void doRequestUpdate(); void networksChanged(); + void checkDisconnect(); private: bool isWifiReady(const QString &dev); @@ -95,6 +96,7 @@ private: QScanThread *scanThread; quint64 getBytes(const QString &interfaceName,bool b); + QString disconnectedInterfaceString; protected: void startNetworkChangeLoop(); diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm index 65e70876f2..8caca7d677 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.mm +++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm @@ -544,20 +544,44 @@ void QCoreWlanEngine::disconnectFromId(const QString &id) QMutexLocker locker(&mutex); QString interfaceString = getInterfaceFromId(id); + if (interfaceString.isEmpty()) { + locker.unlock(); + emit connectionError(id, DisconnectionError); + return; + } NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; CWInterface *wifiInterface = [CWInterface interfaceWithName: QCFString::toNSString(interfaceString)]; + disconnectedInterfaceString = interfaceString; [wifiInterface disassociate]; - if (wifiInterface.serviceActive) { - locker.unlock(); - emit connectionError(id, DisconnectionError); - locker.relock(); - } + + QTimer::singleShot(1000, this,SLOT(checkDisconnect())); [autoreleasepool release]; } +void QCoreWlanEngine::checkDisconnect() +{ + QMutexLocker locker(&mutex); + if (!disconnectedInterfaceString.isEmpty()) { + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + + CWInterface *wifiInterface = + [CWInterface interfaceWithName: QCFString::toNSString(disconnectedInterfaceString)]; + + const QString networkSsid = QCFString::toQString([wifiInterface ssid]); + if (!networkSsid.isEmpty()) { + const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid)); + locker.unlock(); + emit connectionError(id, DisconnectionError); + locker.relock(); + } + [autoreleasepool release]; + disconnectedInterfaceString.clear(); + } +} + void QCoreWlanEngine::requestUpdate() { scanThread->getUserConfigurations(); |