Make a branch to make krunner Good Enough For Aaron™.
[kdebase/uwolfer.git] / workspace / libs / solid / control / networkinterface.cpp
blob74512c23d492c55f769006ecac1178c78e37bde0
1 /* This file is part of the KDE project
2 Copyright (C) 2006 Will Stephenson <wstephenson@kde.org>
3 Copyright (C) 2007 Kevin Ottens <ervin@kde.org>
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License version 2 as published by the Free Software Foundation.
9 This library 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 GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA.
21 #include <QMap>
22 #include <QStringList>
24 #include <solid/control/ifaces/network.h>
25 #include <solid/control/ifaces/networkinterface.h>
26 #include <solid/control/ifaces/wirelessnetwork.h>
28 #include "frontendobject_p.h"
30 #include "soliddefs_p.h"
31 #include "networkmanager.h"
32 #include "network.h"
33 #include "network_p.h"
34 #include "networkinterface.h"
35 #include "wirelessnetwork.h"
37 namespace Solid
39 namespace Control
41 class NetworkInterfacePrivate : public FrontendObjectPrivate
43 public:
44 NetworkInterfacePrivate(QObject *parent)
45 : FrontendObjectPrivate(parent) { }
47 void setBackendObject(QObject *object);
48 void _k_destroyed(QObject *object);
50 Solid::Control::Network *findRegisteredNetwork(const QString &uni) const;
53 mutable QMap<QString, Network *> networkMap;
54 mutable Network invalidNetwork;
60 Solid::Control::NetworkInterface::NetworkInterface()
61 : QObject(), d(new NetworkInterfacePrivate(this))
65 Solid::Control::NetworkInterface::NetworkInterface(const QString &uni)
66 : QObject(), d(new NetworkInterfacePrivate(this))
68 const NetworkInterface &device = NetworkManager::findNetworkInterface(uni);
69 d->setBackendObject(device.d->backendObject());
72 Solid::Control::NetworkInterface::NetworkInterface(QObject *backendObject)
73 : QObject(), d(new NetworkInterfacePrivate(this))
75 d->setBackendObject(backendObject);
78 Solid::Control::NetworkInterface::NetworkInterface(const NetworkInterface &device)
79 : QObject(), d(new NetworkInterfacePrivate(this))
81 d->setBackendObject(device.d->backendObject());
84 Solid::Control::NetworkInterface::~NetworkInterface()
86 foreach (QObject *network, d->networkMap)
88 delete network;
92 Solid::Control::NetworkInterface &Solid::Control::NetworkInterface::operator=(const Solid::Control::NetworkInterface & dev)
94 d->setBackendObject(dev.d->backendObject());
95 return *this;
98 bool Solid::Control::NetworkInterface::isValid() const
100 return d->backendObject()!=0;
103 QString Solid::Control::NetworkInterface::uni() const
105 return_SOLID_CALL(Ifaces::NetworkInterface *, d->backendObject(), QString(), uni());
108 bool Solid::Control::NetworkInterface::isActive() const
110 return_SOLID_CALL(Ifaces::NetworkInterface *, d->backendObject(), false, isActive());
113 Solid::Control::NetworkInterface::Type Solid::Control::NetworkInterface::type() const
115 return_SOLID_CALL(Ifaces::NetworkInterface *, d->backendObject(), UnknownType, type());
117 Solid::Control::NetworkInterface::ConnectionState Solid::Control::NetworkInterface::connectionState() const
119 return_SOLID_CALL(Ifaces::NetworkInterface *, d->backendObject(), UnknownState, connectionState());
122 int Solid::Control::NetworkInterface::signalStrength() const
124 return_SOLID_CALL(Ifaces::NetworkInterface *, d->backendObject(), 0, signalStrength());
127 int Solid::Control::NetworkInterface::designSpeed() const
129 return_SOLID_CALL(Ifaces::NetworkInterface *, d->backendObject(), 0, designSpeed());
132 bool Solid::Control::NetworkInterface::isLinkUp() const
134 return_SOLID_CALL(Ifaces::NetworkInterface *, d->backendObject(), false, isLinkUp());
137 Solid::Control::NetworkInterface::Capabilities Solid::Control::NetworkInterface::capabilities() const
139 return_SOLID_CALL(Ifaces::NetworkInterface *, d->backendObject(), Capabilities(), capabilities());
142 Solid::Control::Network * Solid::Control::NetworkInterface::findNetwork(const QString & uni) const
144 if (!isValid()) return 0;
146 Network *network = d->findRegisteredNetwork(uni);
148 if (network!=0)
150 return network;
152 else
154 return &(d->invalidNetwork);
158 Solid::Control::NetworkList Solid::Control::NetworkInterface::networks() const
160 NetworkList list;
161 Ifaces::NetworkInterface *device = qobject_cast<Ifaces::NetworkInterface *>(d->backendObject());
163 if (device==0) return list;
165 QStringList uniList = device->networks();
167 foreach (const QString &uni, uniList)
169 Network *network = d->findRegisteredNetwork(uni);
170 if (network!=0)
172 list.append(network);
176 return list;
179 void Solid::Control::NetworkInterfacePrivate::_k_destroyed(QObject *object)
181 if (object == backendObject())
183 FrontendObjectPrivate::_k_destroyed(object);
185 foreach (Network *network, networkMap)
187 delete network->d_func()->backendObject();
188 delete network;
191 networkMap.clear();
195 void Solid::Control::NetworkInterfacePrivate::setBackendObject(QObject *object)
197 foreach (QObject *network, networkMap) {
198 delete network;
201 networkMap.clear();
204 FrontendObjectPrivate::setBackendObject(object);
206 if (object) {
207 QObject::connect(object, SIGNAL(activeChanged(bool)),
208 parent(), SIGNAL(activeChanged(bool)));
209 QObject::connect(object, SIGNAL(linkUpChanged(bool)),
210 parent(), SIGNAL(linkUpChanged(bool)));
211 QObject::connect(object, SIGNAL(signalStrengthChanged(int)),
212 parent(), SIGNAL(signalStrengthChanged(int)));
213 QObject::connect(object, SIGNAL(connectionStateChanged(int)),
214 parent(), SIGNAL(connectionStateChanged(int)));
215 QObject::connect(object, SIGNAL(networkAppeared(const QString &)),
216 parent(), SIGNAL(networkAppeared(const QString &)));
217 QObject::connect(object, SIGNAL(networkDisappeared(const QString &)),
218 parent(), SIGNAL(networkDisappeared(const QString &)));
222 Solid::Control::Network *Solid::Control::NetworkInterfacePrivate::findRegisteredNetwork(const QString &uni) const
224 Network *network = 0;
226 if (networkMap.contains(uni)) {
227 network = networkMap[uni];
228 } else {
229 Ifaces::NetworkInterface *device = qobject_cast<Ifaces::NetworkInterface *>(backendObject());
231 if (device!=0)
233 QObject *iface = device->createNetwork(uni);
235 if (qobject_cast<Ifaces::WirelessNetwork *>(iface)!=0)
237 network = new WirelessNetwork(iface);
239 else if (qobject_cast<Ifaces::Network *>(iface)!=0)
241 network = new Network(iface);
244 if (network != 0)
246 networkMap[uni] = network;
251 return network;
254 #include "networkinterface.moc"