diff options
-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(); |