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.
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"
33 #include "network_p.h"
34 #include "networkinterface.h"
35 #include "wirelessnetwork.h"
41 class NetworkInterfacePrivate
: public FrontendObjectPrivate
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
)
92 Solid::Control::NetworkInterface
&Solid::Control::NetworkInterface::operator=(const Solid::Control::NetworkInterface
& dev
)
94 d
->setBackendObject(dev
.d
->backendObject());
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
);
154 return &(d
->invalidNetwork
);
158 Solid::Control::NetworkList
Solid::Control::NetworkInterface::networks() const
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
);
172 list
.append(network
);
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();
195 void Solid::Control::NetworkInterfacePrivate::setBackendObject(QObject
*object
)
197 foreach (QObject
*network
, networkMap
) {
204 FrontendObjectPrivate::setBackendObject(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
];
229 Ifaces::NetworkInterface
*device
= qobject_cast
<Ifaces::NetworkInterface
*>(backendObject());
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
);
246 networkMap
[uni
] = network
;
254 #include "networkinterface.moc"