summaryrefslogtreecommitdiffstats
path: root/src/imports/wifi/qwifinetworklistmodel.cpp
diff options
context:
space:
mode:
authorGatis Paeglis <gatis.paeglis@digia.com>2014-03-19 18:41:20 +0100
committerGatis Paeglis <gatis.paeglis@digia.com>2014-04-07 17:56:37 +0300
commit88a2385ab7b9f33437ce648a70757b9d8c8a48c7 (patch)
tree9810146763673b2f040d0076ac6fe9e72ed83a7c /src/imports/wifi/qwifinetworklistmodel.cpp
parent9f14000d57a9bf29204eef3fc92ef638da887d7e (diff)
[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 <eirik.aavitsland@digia.com>
Diffstat (limited to 'src/imports/wifi/qwifinetworklistmodel.cpp')
-rw-r--r--src/imports/wifi/qwifinetworklistmodel.cpp59
1 files changed, 44 insertions, 15 deletions
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<int, QByteArray> QWifiNetworkListModel::roleNames() const
{
QHash<int, QByteArray> 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; i<m_networks.size(); ++i) {
+ for (int i = 0; i < m_networks.size(); ++i) {
if (m_networks.at(i)->ssid() == 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<QByteArray> lines = results.split('\n');
-
QSet<QByteArray> sensibleNetworks;
- for (int i=1; i<lines.size(); ++i) {
+
+ for (int i = 1; i < lines.size(); ++i) {
QList<QByteArray> 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;
}
}
}
-
-