1
/* This file is part of the KDE project
2
Copyright (C) 2008 Dario Freddi <drf54321@gmail.com>
4
This library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Library General Public
6
License version 2 as published by the Free Software Foundation.
8
This library is distributed in the hope that it will be useful,
9
but WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
Library General Public License for more details.
13
You should have received a copy of the GNU Library General Public License
14
along with this library; see the file COPYING.LIB. If not, write to
15
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16
Boston, MA 02110-1301, USA.
20
#include "wirelessnetworkinterface.h"
22
#include "wirelessaccesspoint.h"
24
#include "wicddbusinterface.h"
25
#include "wicd-defines.h"
27
#include <QtDBus/QDBusInterface>
28
#include <QtDBus/QDBusReply>
29
#include <QtCore/QProcess>
33
class WicdWirelessNetworkInterface::Private
38
QMap<int, QString> getAccessPointsWithId();
40
Solid::Control::WirelessNetworkInterface::OperationMode parseOpMode(const QString &m);
42
bool isActiveInterface;
49
Solid::Control::NetworkInterface::ConnectionState connection_state;
52
Solid::Control::WirelessNetworkInterface::OperationMode WicdWirelessNetworkInterface::Private::parseOpMode(const QString &m)
55
return Solid::Control::WirelessNetworkInterface::Master;
56
} else if (m == "Managed") {
57
return Solid::Control::WirelessNetworkInterface::Managed;
58
} else if (m == "Adhoc") {
59
return Solid::Control::WirelessNetworkInterface::Adhoc;
62
return Solid::Control::WirelessNetworkInterface::Master;
65
void WicdWirelessNetworkInterface::recacheInformation()
68
process.start("iwconfig " + d->uni);
69
process.waitForFinished();
70
QString iwconfig = process.readAll();
72
process.start("iwlist " + d->uni + " auth");
73
process.waitForFinished();
74
QString iwlist = process.readAll();
76
QDBusReply< QString > bitrater = WicdDbusInterface::instance()->wireless().call("GetCurrentBitrate", iwconfig);
77
QDBusReply< QString > authmr = WicdDbusInterface::instance()->wireless().call("GetAvailableAuthMethods", iwlist);
78
QDBusReply< QString > moder = WicdDbusInterface::instance()->wireless().call("GetOperationalMode", iwconfig);
79
QDBusReply< int > networkr = WicdDbusInterface::instance()->wireless().call("GetCurrentNetworkID");
80
QDBusReply< QString > driverr = WicdDbusInterface::instance()->daemon().call("GetWPADriver");
81
QDBusReply< QString > interfacer = WicdDbusInterface::instance()->daemon().call("GetWirelessInterface");
82
QDBusReply< QString > cstater = WicdDbusInterface::instance()->wireless().call("CheckWirelessConnectingMessage");
84
if (d->bitrate != bitrater.value().split(' ').at(0).toInt() * 1000) {
85
d->bitrate = bitrater.value().split(' ').at(0).toInt() * 1000;
86
emit bitRateChanged(d->bitrate);
88
d->driver = driverr.value();
90
if (d->mode != moder.value()) {
91
d->mode = moder.value();
92
emit modeChanged(d->parseOpMode(d->mode));
95
d->auth_methods = authmr.value();
97
if (interfacer.value() == d->uni) {
98
kDebug() << "Active interface";
99
if (d->current_network != networkr.value()) {
100
d->current_network = networkr.value();
101
emit activeAccessPointChanged(d->getAccessPointsWithId()[d->current_network]);
104
Solid::Control::NetworkInterface::ConnectionState connection_state;
106
if (cstater.value() == "configuring_interface") {
107
connection_state = Solid::Control::NetworkInterface::Configuring;
108
} else if (cstater.value() == "validating_authentication") {
109
connection_state = Solid::Control::NetworkInterface::NeedAuth;
110
} else if (cstater.value() == "done") {
111
connection_state = Solid::Control::NetworkInterface::Activated;
112
} else if (cstater.value() == "interface_down") {
113
connection_state = Solid::Control::NetworkInterface::Disconnected;
114
} else if (cstater.value() == "running_dhcp" ||
115
cstater.value() == "setting_static_ip" ||
116
cstater.value() == "setting_broadcast_address") {
117
connection_state = Solid::Control::NetworkInterface::IPConfig;
118
} else if (cstater.value() == "interface_up") {
119
connection_state = Solid::Control::NetworkInterface::Preparing;
121
connection_state = Solid::Control::NetworkInterface::UnknownState;
124
if (connection_state != d->connection_state) {
125
connection_state = d->connection_state;
126
emit connectionStateChanged(d->connection_state);
131
QMap<int, QString> WicdWirelessNetworkInterface::Private::getAccessPointsWithId()
133
QDBusReply< int > networks = WicdDbusInterface::instance()->wireless().call("GetNumberOfNetworks");
134
QMap<int, QString> retlist;
136
for (int i = 0; i < networks.value(); ++i) {
137
QDBusReply< QString > r = WicdDbusInterface::instance()->wireless().call("GetWirelessProperty", i, "bssid");
144
WicdWirelessNetworkInterface::WicdWirelessNetworkInterface(const QString &objectPath)
145
: WicdNetworkInterface(objectPath)
149
recacheInformation();
150
QDBusConnection::systemBus().connect(WICD_DBUS_SERVICE, WICD_DAEMON_DBUS_PATH, WICD_DAEMON_DBUS_INTERFACE,
151
"StatusChanged", this, SLOT(refreshStatus()));
154
WicdWirelessNetworkInterface::~WicdWirelessNetworkInterface()
159
Solid::Control::NetworkInterface::Type WicdWirelessNetworkInterface::type() const
161
return Solid::Control::NetworkInterface::Ieee80211;
164
bool WicdWirelessNetworkInterface::isActive() const
166
return d->isActiveInterface;
169
Solid::Control::NetworkInterface::Capabilities WicdWirelessNetworkInterface::capabilities() const
171
Solid::Control::NetworkInterface::Capabilities cap;
173
if (interfaceName() != "lo" || !interfaceName().contains("wmaster")) {
174
cap |= Solid::Control::NetworkInterface::IsManageable;
180
QString WicdWirelessNetworkInterface::driver() const
185
int WicdWirelessNetworkInterface::bitRate() const
190
Solid::Control::NetworkInterface::ConnectionState WicdWirelessNetworkInterface::connectionState() const
192
if (d->isActiveInterface) {
193
return d->connection_state;
195
return Solid::Control::NetworkInterface::Unavailable;
199
Solid::Control::WirelessNetworkInterface::Capabilities WicdWirelessNetworkInterface::wirelessCapabilities() const
201
Solid::Control::WirelessNetworkInterface::Capabilities cap;
203
if (d->auth_methods.contains("WPA")) {
204
cap |= Solid::Control::WirelessNetworkInterface::Wpa;
206
if (d->auth_methods.contains("CIPHER-TKIP")) {
207
cap |= Solid::Control::WirelessNetworkInterface::Tkip;
209
if (d->auth_methods.contains("CIPHER-CCMP")) {
210
cap |= Solid::Control::WirelessNetworkInterface::Ccmp;
213
cap |= Solid::Control::WirelessNetworkInterface::Wep104;
214
cap |= Solid::Control::WirelessNetworkInterface::Wep40;
219
Solid::Control::WirelessNetworkInterface::OperationMode WicdWirelessNetworkInterface::mode() const
221
return d->parseOpMode(d->mode);
224
MacAddressList WicdWirelessNetworkInterface::accessPoints() const
226
return d->getAccessPointsWithId().values();
229
QString WicdWirelessNetworkInterface::activeAccessPoint() const
231
if (d->isActiveInterface) {
232
return d->getAccessPointsWithId()[d->current_network];
238
QString WicdWirelessNetworkInterface::hardwareAddress() const
240
// Let's parse ifconfig here
244
ifconfig.start(QString("ifconfig %1").arg(uni()));
245
ifconfig.waitForFinished();
247
QString result = ifconfig.readAllStandardOutput();
249
QStringList lines = result.split('\n');
251
return lines.at(0).split("HWaddr ").at(1);
254
QObject * WicdWirelessNetworkInterface::createAccessPoint(const QString & uni)
256
QMap<int, QString> aps = d->getAccessPointsWithId();
258
if (!aps.values().contains(uni)) {
259
kDebug() << "Requested a non existent AP";
262
int network = aps.key(uni);
264
return new WicdAccessPoint(network);
267
#include "wirelessnetworkinterface.moc"