From 575008ec81d7bffc8b7ce631fa8f21377aada7cf Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Thu, 23 Oct 2014 19:48:23 +1000 Subject: 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 --- src/plugins/bearer/corewlan/qcorewlanengine.h | 2 ++ 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(); -- cgit v1.2.3