From 88a2385ab7b9f33437ce648a70757b9d8c8a48c7 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Wed, 19 Mar 2014 18:41:20 +0100 Subject: [Wifi] Add new enums and make some API changes - Now QtWifi can provide feedback when incorrect password is entered. - networkStateChanged signal provides a reference to the currently active network connection. - bug fixes in QWifiManager::connect Task-number: QTEE-408 Change-Id: Ic7458b864f09aef3cfca40fb081dec45e0bba7db Reviewed-by: Eirik Aavitsland --- src/imports/wifi/qwifinetworklistmodel.cpp | 59 ++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 15 deletions(-) (limited to 'src/imports/wifi/qwifinetworklistmodel.cpp') diff --git a/src/imports/wifi/qwifinetworklistmodel.cpp b/src/imports/wifi/qwifinetworklistmodel.cpp index bd1d37d..4fbf25f 100644 --- a/src/imports/wifi/qwifinetworklistmodel.cpp +++ b/src/imports/wifi/qwifinetworklistmodel.cpp @@ -27,6 +27,14 @@ QWifiNetworkListModel::QWifiNetworkListModel(QWifiManager *manager) { } +QWifiNetworkListModel::~QWifiNetworkListModel() +{ + qDeleteAll(m_networks); + qDeleteAll(m_outOfRangeNetworks); + m_networks.clear(); + m_outOfRangeNetworks.clear(); +} + QHash QWifiNetworkListModel::roleNames() const { QHash names; @@ -48,7 +56,7 @@ QVariant QWifiNetworkListModel::data(const QModelIndex &index, int role) const QWifiNetwork *QWifiNetworkListModel::networkForSSID(const QByteArray &ssid, int *pos) { - for (int i=0; issid() == ssid) { if (pos) *pos = i; @@ -58,21 +66,32 @@ QWifiNetwork *QWifiNetworkListModel::networkForSSID(const QByteArray &ssid, int return 0; } +QWifiNetwork *QWifiNetworkListModel::outOfRangeListContains(const QByteArray &ssid) +{ + for (int i = 0; i < m_outOfRangeNetworks.length(); ++i) + if (m_outOfRangeNetworks.at(i)->ssid() == ssid) + return m_outOfRangeNetworks.takeAt(i); + return 0; +} + void QWifiNetworkListModel::parseScanResults(const QByteArray &results) { QList lines = results.split('\n'); - QSet sensibleNetworks; - for (int i=1; i info = lines.at(i).split('\t'); if (info.size() < 5 || info.at(4).isEmpty() || info.at(0).isEmpty()) continue; int pos = 0; - if (!sensibleNetworks.contains(info.at(4))) - sensibleNetworks.insert(info.at(4)); - QWifiNetwork *existingNetwork = networkForSSID(info.at(4), &pos); - if (!existingNetwork) { + sensibleNetworks.insert(info.at(4)); + QWifiNetwork *knownNetwork = networkForSSID(info.at(4), &pos); + if (!knownNetwork) + knownNetwork = outOfRangeListContains(info.at(4)); + + if (!knownNetwork) { QWifiNetwork *network = new QWifiNetwork(); + network->setOutOfRange(false); network->setBssid(info.at(0)); network->setFlags(info.at(3)); // signal strength is in dBm @@ -82,13 +101,23 @@ void QWifiNetworkListModel::parseScanResults(const QByteArray &results) m_networks << network; endInsertRows(); } else { + if (knownNetwork->outOfRange()) { + // known network has come back into a range + knownNetwork->setOutOfRange(false); + beginInsertRows(QModelIndex(), m_networks.size(), m_networks.size()); + m_networks << knownNetwork; + endInsertRows(); + pos = m_networks.length() - 1; + } // ssids are the same, compare bssids.. - if (existingNetwork->bssid() == info.at(0)) { + if (knownNetwork->bssid() == info.at(0)) { // same access point, simply update the signal strength - existingNetwork->setSignalStrength(info.at(2).toInt()); + knownNetwork->setSignalStrength(info.at(2).toInt()); + knownNetwork->setOutOfRange(false); dataChanged(createIndex(pos, 0), createIndex(pos, 0)); - } else if (existingNetwork->signalStrength() < info.at(2).toInt()) { + } else if (knownNetwork->signalStrength() < info.at(2).toInt()) { // replace with a stronger access point within the same network + m_networks.at(pos)->setOutOfRange(false); m_networks.at(pos)->setBssid(info.at(0)); m_networks.at(pos)->setFlags(info.at(3)); m_networks.at(pos)->setSignalStrength(info.at(2).toInt()); @@ -97,16 +126,16 @@ void QWifiNetworkListModel::parseScanResults(const QByteArray &results) } } } - // remove networks that have gone out of range - for (int i = 0; i < m_networks.size(); ++i) { + // remove out-of-range networks from the data model + for (int i = 0; i < m_networks.size();) { if (!sensibleNetworks.contains(m_networks.at(i)->ssid())) { beginRemoveRows(QModelIndex(), i, i); - delete m_networks.takeAt(i); + QWifiNetwork *n = m_networks.takeAt(i); + n->setOutOfRange(true); + m_outOfRangeNetworks.append(n); endRemoveRows(); } else { ++i; } } } - - -- cgit v1.2.3