1
/***************************************************************************
2
* Copyright (C) 2013 by Daniel Nicoletti <dantti12@gmail.com> *
4
* This program is free software; you can redistribute it and/or modify *
5
* it under the terms of the GNU General Public License as published by *
6
* the Free Software Foundation; either version 2 of the License, or *
7
* (at your option) any later version. *
9
* This program is distributed in the hope that it will be useful, *
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12
* GNU General Public License for more details. *
14
* You should have received a copy of the GNU General Public License *
15
* along with this program; see the file COPYING. If not, write to *
16
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
17
* Boston, MA 02110-1301, USA. *
18
***************************************************************************/
20
#include "AvailableConnectionsModel.h"
22
#include <NetworkManagerQt/ConnectionSettings>
23
#include <NetworkManagerQt/ActiveConnection>
24
#include <NetworkManagerQt/Device>
25
#include <NetworkManagerQt/Settings>
26
#include <NetworkManagerQt/WirelessSetting>
27
#include <NetworkManagerQt/WirelessDevice>
28
#include <NetworkManagerQt/WimaxDevice>
29
#include <NetworkManagerQt/WimaxNsp>
33
using namespace NetworkManager;
35
AvailableConnectionsModel::AvailableConnectionsModel(QObject *parent) :
36
QStandardItemModel(parent)
40
void AvailableConnectionsModel::setDevice(const NetworkManager::Device::Ptr &device)
42
if (m_device && m_device->uni() == device->uni()) {
44
} else if (m_device) {
45
m_device->disconnect(this);
48
removeRows(0, rowCount());
50
if (device->type() == NetworkManager::Device::Wifi) {
51
NetworkManager::WirelessDevice::Ptr wifi = device.dynamicCast<NetworkManager::WirelessDevice>();
53
connect(device.data(), SIGNAL(availableConnectionChanged()), SLOT(availableConnectionChanged()));
54
foreach (const Connection::Ptr &connection, device->availableConnections()) {
55
addConnection(connection);
58
connect(wifi.data(), SIGNAL(networkAppeared(QString)), SLOT(networkAppeared(QString)));
59
connect(wifi.data(), SIGNAL(networkDisappeared(QString)), SLOT(networkDisappeared(QString)));
60
foreach (const WirelessNetwork::Ptr &network, wifi->networks()) {
63
} else if (device->type() == NetworkManager::Device::Wimax) {
64
NetworkManager::WimaxDevice::Ptr wiMax = device.dynamicCast<NetworkManager::WimaxDevice>();
65
connect(device.data(), SIGNAL(availableConnectionChanged()), SLOT(availableConnectionChanged()));
66
foreach (const Connection::Ptr &connection, device->availableConnections()) {
67
addConnection(connection);
70
connect(wiMax.data(), SIGNAL(nspAppeared(QString)), SLOT(nspAppeared(QString)));
71
connect(wiMax.data(), SIGNAL(nspDisappeared(QString)), SLOT(nspDisappeared(QString)));
72
foreach (const QString &nsp, wiMax->nsps()) {
73
NetworkManager::WimaxNsp::Ptr nspPtr = wiMax->findNsp(nsp);
75
addNspNetwork(nspPtr);
79
connect(device.data(), SIGNAL(availableConnectionChanged()), SLOT(availableConnectionChanged()));
80
foreach (const Connection::Ptr &connection, device->availableConnections()) {
81
addConnection(connection);
86
void AvailableConnectionsModel::availableConnectionChanged()
88
Device *device = qobject_cast<NetworkManager::Device*>(sender());
90
Connection::List connections = device->availableConnections();
91
foreach (const Connection::Ptr &connection, connections) {
92
qWarning() << "Connection" << connection->name();
93
if (!findConnectionItem(connection->path())) {
94
qWarning() << "New connection" << connection->name();
95
addConnection(connection);
100
while (i < rowCount()) {
101
Kinds kind = static_cast<Kind>(item(i)->data(RoleKinds).toUInt());
102
if (kind == Connection) {
104
QString path = item(i)->data(RoleConectionPath).toString();
105
foreach (const Connection::Ptr &connection, connections) {
106
if (connection->path() == path) {
113
qWarning() << "Remove connection" << path;
123
void AvailableConnectionsModel::connectionAdded(const QString &path)
125
Connection::Ptr connection = findConnection(path);
127
addConnection(connection);
131
void AvailableConnectionsModel::connectionRemoved(const QString &path)
133
QStandardItem *stdItem = findConnectionItem(path);
135
removeRow(stdItem->row());
139
void AvailableConnectionsModel::addConnection(const NetworkManager::Connection::Ptr &connection)
141
QStandardItem *stdItem = findConnectionItem(connection->path());
146
stdItem = new QStandardItem;
147
stdItem->setData(Connection, RoleKinds);
148
stdItem->setData(connection->path(), RoleConectionPath);
150
ConnectionSettings::Ptr settings = connection->settings();
151
if (settings->connectionType() == ConnectionSettings::Wireless) {
152
WirelessSetting::Ptr wirelessSetting;
153
wirelessSetting = settings->setting(Setting::Wireless).dynamicCast<WirelessSetting>();
154
stdItem->setData(wirelessSetting->ssid(), RoleNetworkID);
155
stdItem->setData(wirelessSetting->macAddress(), RoleMacAddress);
156
stdItem->setText(wirelessSetting->ssid());
158
stdItem->setText(connection->name());
164
void AvailableConnectionsModel::networkAppeared(const QString &ssid)
166
NetworkManager::WirelessDevice::Ptr wifi = m_device.dynamicCast<NetworkManager::WirelessDevice>();
168
WirelessNetwork::Ptr network = wifi->findNetwork(ssid);
173
void AvailableConnectionsModel::networkDisappeared(const QString &ssid)
175
QStandardItem *stdItem = findNetworkItem(ssid);
177
removeRow(stdItem->row());
181
void AvailableConnectionsModel::addNetwork(const WirelessNetwork::Ptr &network)
183
QStandardItem *stdItem = findNetworkItem(network->ssid());
184
connect(network.data(), SIGNAL(signalStrengthChanged(int)), SLOT(signalStrengthChanged(int)), Qt::UniqueConnection);
186
stdItem = new QStandardItem;
187
stdItem->setData(network->ssid(), RoleNetworkID);
188
stdItem->setData(Network | NetworkWireless, RoleKinds);
189
stdItem->setText(network->ssid());
192
stdItem->setData(Network | Connection, RoleKinds);
194
bool isSecure = network->referenceAccessPoint()->capabilities() & AccessPoint::Privacy;
195
stdItem->setData(isSecure, RoleSecurity);
196
stdItem->setData(network->signalStrength(), RoleSignalStrength);
199
void AvailableConnectionsModel::signalStrengthChanged(int strength)
201
WirelessNetwork *network = qobject_cast<WirelessNetwork*>(sender());
202
QStandardItem *stdItem = findNetworkItem(network->ssid());
204
stdItem->setData(strength, RoleSignalStrength);
208
void AvailableConnectionsModel::nspAppeared(const QString &uni)
210
NetworkManager::WimaxDevice::Ptr wimax = m_device.dynamicCast<NetworkManager::WimaxDevice>();
212
WimaxNsp::Ptr nsp = wimax->findNsp(uni);
217
void AvailableConnectionsModel::nspDisappeared(const QString &name)
219
QStandardItem *stdItem = findNetworkItem(name);
221
removeRow(stdItem->row());
225
void AvailableConnectionsModel::addNspNetwork(const WimaxNsp::Ptr &nsp)
227
QStandardItem *stdItem = findNetworkItem(nsp->name());
228
connect(nsp.data(), SIGNAL(signalQualityChanged(uint)), SLOT(signalQualityChanged(int)), Qt::UniqueConnection);
230
stdItem = new QStandardItem;
231
stdItem->setData(nsp->uni(), RoleNetworkID);
232
stdItem->setData(Network | NetworkNsp, RoleKinds);
233
stdItem->setText(nsp->name());
236
stdItem->setData(Network | Connection, RoleKinds);
238
stdItem->setData(true, RoleSecurity);
239
stdItem->setData(nsp->signalQuality(), RoleSignalStrength);
242
void AvailableConnectionsModel::signalQualityChanged(uint quality)
244
WimaxNsp *nsp = qobject_cast<WimaxNsp*>(sender());
245
QStandardItem *stdItem = findNetworkItem(nsp->name());
247
stdItem->setData(quality, RoleSignalStrength);
251
QStandardItem *AvailableConnectionsModel::findConnectionItem(const QString &path)
253
for (int i = 0; i < rowCount(); ++i) {
254
QStandardItem *stdItem = item(i);
255
if (stdItem->data(RoleKinds).toUInt() & Connection &&
256
stdItem->data(RoleConectionPath).toString() == path) {
264
QStandardItem *AvailableConnectionsModel::findNetworkItem(const QString &id)
266
for (int i = 0; i < rowCount(); ++i) {
267
QStandardItem *stdItem = item(i);
268
if (stdItem->data(RoleNetworkID).toString() == id) {