10
|
1 |
/****************************************************************************
|
|
2 |
**
|
|
3 |
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
4 |
** All rights reserved.
|
|
5 |
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
6 |
**
|
|
7 |
** This file is part of the Qt Mobility Components.
|
|
8 |
**
|
|
9 |
** $QT_BEGIN_LICENSE:LGPL$
|
|
10 |
** No Commercial Usage
|
|
11 |
** This file contains pre-release code and may not be distributed.
|
|
12 |
** You may use this file in accordance with the terms and conditions
|
|
13 |
** contained in the Technology Preview License Agreement accompanying
|
|
14 |
** this package.
|
|
15 |
**
|
|
16 |
** GNU Lesser General Public License Usage
|
|
17 |
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
18 |
** General Public License version 2.1 as published by the Free Software
|
|
19 |
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
20 |
** packaging of this file. Please review the following information to
|
|
21 |
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
22 |
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
23 |
**
|
|
24 |
** In addition, as a special exception, Nokia gives you certain additional
|
|
25 |
** rights. These rights are described in the Nokia Qt LGPL Exception
|
|
26 |
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
27 |
**
|
|
28 |
** If you have questions regarding the use of this file, please contact
|
|
29 |
** Nokia at qt-info@nokia.com.
|
|
30 |
**
|
|
31 |
**
|
|
32 |
**
|
|
33 |
**
|
|
34 |
**
|
|
35 |
**
|
|
36 |
**
|
|
37 |
**
|
|
38 |
** $QT_END_LICENSE$
|
|
39 |
**
|
|
40 |
****************************************************************************/
|
|
41 |
|
|
42 |
#include "qnetworkconfigmanager.h"
|
|
43 |
|
|
44 |
#ifdef Q_OS_SYMBIAN
|
|
45 |
#include "qnetworkconfigmanager_s60_p.h"
|
|
46 |
#elif (defined(Q_WS_MAEMO_6) || defined(Q_WS_MAEMO_5))
|
|
47 |
#include "qnetworkconfigmanager_maemo_p.h"
|
|
48 |
#else
|
|
49 |
#include "qnetworkconfigmanager_p.h"
|
|
50 |
#endif
|
|
51 |
|
|
52 |
QTM_BEGIN_NAMESPACE
|
|
53 |
|
|
54 |
Q_GLOBAL_STATIC(QNetworkConfigurationManagerPrivate, connManager);
|
|
55 |
|
|
56 |
/*!
|
|
57 |
\class QNetworkConfigurationManager
|
|
58 |
|
|
59 |
\brief The QNetworkConfigurationManager class manages the network configurations provided
|
|
60 |
by the system.
|
|
61 |
|
|
62 |
\inmodule QtNetwork
|
|
63 |
\ingroup bearer
|
|
64 |
|
|
65 |
QNetworkConfigurationManager provides access to the network configurations known to the system and
|
|
66 |
enables applications to detect the system capabilities (with regards to network sessions) at runtime.
|
|
67 |
|
|
68 |
A QNetworkConfiguration abstracts a set of configuration options describing how a
|
|
69 |
network interface has to be configured to connect to a particular target network.
|
|
70 |
QNetworkConfigurationManager maintains and updates the global list of
|
|
71 |
QNetworkConfigurations. Applications can access and filter this list via
|
|
72 |
allConfigurations(). If a new configuration is added or an existing one is removed or changed
|
|
73 |
the configurationAdded(), configurationRemoved() and configurationChanged() signals are emitted
|
|
74 |
respectively.
|
|
75 |
|
|
76 |
The defaultConfiguration() can be used when intending to immediately create a new
|
|
77 |
network session without caring about the particular configuration. It returns
|
|
78 |
a \l QNetworkConfiguration::Discovered configuration. If there are not any
|
|
79 |
discovered ones an invalid configuration is returned.
|
|
80 |
|
|
81 |
Some configuration updates may require some time to perform updates. A WLAN scan is
|
|
82 |
such an example. Unless the platform performs internal updates it may be required to
|
|
83 |
manually trigger configuration updates via QNetworkConfigurationManager::updateConfigurations().
|
|
84 |
The completion of the update process is indicted by emitting the updateCompleted()
|
|
85 |
signal. The update process ensures that every existing QNetworkConfiguration instance
|
|
86 |
is updated. There is no need to ask for a renewed configuration list via allConfigurations().
|
|
87 |
|
|
88 |
\sa QNetworkConfiguration
|
|
89 |
*/
|
|
90 |
|
|
91 |
/*!
|
|
92 |
\fn void QNetworkConfigurationManager::configurationAdded(const QNetworkConfiguration& config)
|
|
93 |
|
|
94 |
This signal is emitted whenever a new network configuration is added to the system. The new
|
|
95 |
configuration is specified by \a config.
|
|
96 |
*/
|
|
97 |
|
|
98 |
/*!
|
|
99 |
\fn void QNetworkConfigurationManager::configurationRemoved(const QNetworkConfiguration& configuration)
|
|
100 |
|
|
101 |
This signal is emitted when a configuration is about to be removed from the system. The removed
|
|
102 |
\a configuration is invalid but retains name and identifier.
|
|
103 |
*/
|
|
104 |
|
|
105 |
/*!
|
|
106 |
\fn void QNetworkConfigurationManager::updateCompleted()
|
|
107 |
|
|
108 |
This signal is emitted when the configuration update has been completed. Such an update can
|
|
109 |
be initiated via \l updateConfigurations().
|
|
110 |
*/
|
|
111 |
|
|
112 |
/*! \fn void QNetworkConfigurationManager::configurationChanged(const QNetworkConfiguration& config)
|
|
113 |
|
|
114 |
This signal is emitted when the \l {QNetworkConfiguration::state()}{state} of \a config changes.
|
|
115 |
*/
|
|
116 |
|
|
117 |
/*!
|
|
118 |
\fn void QNetworkConfigurationManager::onlineStateChanged(bool isOnline)
|
|
119 |
|
|
120 |
This signal is emitted when the device changes from online to offline mode or vice versa.
|
|
121 |
\a isOnline represents the new state of the device.
|
|
122 |
|
|
123 |
The state is considered to be online for as long as
|
|
124 |
\l{allConfigurations()}{allConfigurations}(QNetworkConfiguration::Active) returns a list with
|
|
125 |
at least one entry.
|
|
126 |
*/
|
|
127 |
|
|
128 |
/*!
|
|
129 |
\enum QNetworkConfigurationManager::Capability
|
|
130 |
|
|
131 |
Specifies the system capabilities of the bearer API. The possible values are:
|
|
132 |
|
|
133 |
\value CanStartAndStopInterfaces Network sessions and their underlying access points can be
|
|
134 |
started and stopped. If this flag is not set QNetworkSession
|
|
135 |
can only monitor but not influence the state of access points.
|
|
136 |
On some platforms this feature may require elevated user
|
|
137 |
permissions. This option is platform specific and may not
|
|
138 |
always be available.
|
|
139 |
\value DirectConnectionRouting Network sessions and their sockets can be bound to a
|
|
140 |
particular network interface. Any packet that passes through
|
|
141 |
the socket goes to the specified network interface and thus
|
|
142 |
disregards standard routing table entries. This may be useful
|
|
143 |
when two interfaces can reach overlapping IP ranges or an
|
|
144 |
application has specific needs in regards to target networks.
|
|
145 |
This option is platform specific and may not always be
|
|
146 |
available.
|
|
147 |
\value SystemSessionSupport If this flag is set the underlying platform ensures that a
|
|
148 |
network interface is not shut down until the last network
|
|
149 |
session has been \l{QNetworkSession::close()}{closed()}. This
|
|
150 |
works across multiple processes. If the platform session
|
|
151 |
support is missing this API can only ensure the above behavior
|
|
152 |
for network sessions within the same process.
|
|
153 |
In general mobile platforms (such as Symbian/S60) have such
|
|
154 |
support whereas most desktop platform lack this capability.
|
|
155 |
\value ApplicationLevelRoaming The system gives applications control over the systems roaming
|
|
156 |
behavior. Applications can initiate roaming (in case the
|
|
157 |
current link is not suitable) and are consulted if the system
|
|
158 |
has identified a more suitable access point.
|
|
159 |
\value ForcedRoaming The system disconnects an existing access point and reconnects
|
|
160 |
via a more suitable one. The application does not have any
|
|
161 |
control over this process and has to reconnect its active
|
|
162 |
sockets.
|
|
163 |
\value DataStatistics If this flag is set QNetworkSession can provide statistics
|
|
164 |
about transmitted and received data.
|
|
165 |
\value NetworkSessionRequired If this flag is set the platform requires that a network
|
|
166 |
session is created before network operations can be performed.
|
|
167 |
*/
|
|
168 |
|
|
169 |
/*!
|
|
170 |
Constructs a QNetworkConfigurationManager with the given \a parent.
|
|
171 |
*/
|
|
172 |
QNetworkConfigurationManager::QNetworkConfigurationManager( QObject* parent )
|
|
173 |
: QObject(parent)
|
|
174 |
{
|
|
175 |
QNetworkConfigurationManagerPrivate* priv = connManager();
|
|
176 |
connect(priv, SIGNAL(configurationAdded(QNetworkConfiguration)),
|
|
177 |
this, SIGNAL(configurationAdded(QNetworkConfiguration)));
|
|
178 |
connect(priv, SIGNAL(configurationRemoved(QNetworkConfiguration)),
|
|
179 |
this, SIGNAL(configurationRemoved(QNetworkConfiguration)));
|
|
180 |
connect(priv, SIGNAL(configurationUpdateComplete()),
|
|
181 |
this, SIGNAL(updateCompleted()));
|
|
182 |
connect(priv, SIGNAL(onlineStateChanged(bool)),
|
|
183 |
this, SIGNAL(onlineStateChanged(bool)));
|
|
184 |
connect(priv, SIGNAL(configurationChanged(QNetworkConfiguration)),
|
|
185 |
this, SIGNAL(configurationChanged(QNetworkConfiguration)));
|
|
186 |
}
|
|
187 |
|
|
188 |
/*!
|
|
189 |
Frees the resources associated with the QNetworkConfigurationManager object.
|
|
190 |
*/
|
|
191 |
QNetworkConfigurationManager::~QNetworkConfigurationManager()
|
|
192 |
{
|
|
193 |
}
|
|
194 |
|
|
195 |
|
|
196 |
/*!
|
|
197 |
Returns the default configuration to be used. This function always returns a discovered
|
|
198 |
configuration; otherwise an invalid configuration.
|
|
199 |
|
|
200 |
In some cases it may be required to call updateConfigurations() and wait for the
|
|
201 |
updateCompleted() signal before calling this function.
|
|
202 |
|
|
203 |
\sa allConfigurations()
|
|
204 |
*/
|
|
205 |
QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration() const
|
|
206 |
{
|
|
207 |
return connManager()->defaultConfiguration();
|
|
208 |
}
|
|
209 |
|
|
210 |
/*!
|
|
211 |
Returns the list of configurations which comply with the given \a filter.
|
|
212 |
|
|
213 |
By default this function returns all (defined and undefined) configurations.
|
|
214 |
|
|
215 |
A wireless network with a particular SSID may only be accessible in a
|
|
216 |
certain area despite the fact that the system has a valid configuration
|
|
217 |
for it. Therefore the filter flag may be used to limit the list to
|
|
218 |
discovered and possibly connected configurations only.
|
|
219 |
|
|
220 |
If \a filter is set to zero this function returns all possible configurations.
|
|
221 |
|
|
222 |
Note that this function returns the states for all configurations as they are known at
|
|
223 |
the time of this function call. If for instance a configuration of type WLAN is defined
|
|
224 |
the system may have to perform a WLAN scan in order to determine whether it is
|
|
225 |
actually available. To obtain the most accurate state updateConfigurations() should
|
|
226 |
be used to update each configuration's state. Note that such an update may require
|
|
227 |
some time. It's completion is signalled by updateCompleted(). In the absence of a
|
|
228 |
configuration update this function returns the best estimate at the time of the call.
|
|
229 |
Therefore, if WLAN configurations are of interest, it is recommended that
|
|
230 |
updateConfigurations() is called once after QNetworkConfigurationManager
|
|
231 |
instantiation (WLAN scans are too time consuming to perform in constructor).
|
|
232 |
After this the data is kept automatically up-to-date as the system reports
|
|
233 |
any changes.
|
|
234 |
*/
|
|
235 |
QList<QNetworkConfiguration> QNetworkConfigurationManager::allConfigurations(QNetworkConfiguration::StateFlags filter) const
|
|
236 |
{
|
|
237 |
QList<QNetworkConfiguration> result;
|
|
238 |
QNetworkConfigurationManagerPrivate* conPriv = connManager();
|
|
239 |
|
|
240 |
//find all InternetAccessPoints
|
|
241 |
foreach (const QString &ii, conPriv->accessPointConfigurations.keys()) {
|
|
242 |
QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> p =
|
|
243 |
conPriv->accessPointConfigurations.value(ii);
|
|
244 |
if ( (p->state & filter) == filter ) {
|
|
245 |
QNetworkConfiguration pt;
|
|
246 |
pt.d = conPriv->accessPointConfigurations.value(ii);
|
|
247 |
result << pt;
|
|
248 |
}
|
|
249 |
}
|
|
250 |
|
|
251 |
//find all service networks
|
|
252 |
foreach (const QString &ii, conPriv->snapConfigurations.keys()) {
|
|
253 |
QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> p =
|
|
254 |
conPriv->snapConfigurations.value(ii);
|
|
255 |
if ( (p->state & filter) == filter ) {
|
|
256 |
QNetworkConfiguration pt;
|
|
257 |
pt.d = conPriv->snapConfigurations.value(ii);
|
|
258 |
result << pt;
|
|
259 |
}
|
|
260 |
}
|
|
261 |
|
|
262 |
return result;
|
|
263 |
}
|
|
264 |
|
|
265 |
/*!
|
|
266 |
Returns the QNetworkConfiguration for \a identifier; otherwise returns an
|
|
267 |
invalid QNetworkConfiguration.
|
|
268 |
|
|
269 |
\sa QNetworkConfiguration::identifier()
|
|
270 |
*/
|
|
271 |
QNetworkConfiguration QNetworkConfigurationManager::configurationFromIdentifier(const QString& identifier) const
|
|
272 |
{
|
|
273 |
QNetworkConfigurationManagerPrivate* conPriv = connManager();
|
|
274 |
QNetworkConfiguration item;
|
|
275 |
if (conPriv->accessPointConfigurations.contains(identifier))
|
|
276 |
item.d = conPriv->accessPointConfigurations.value(identifier);
|
|
277 |
else if (conPriv->snapConfigurations.contains(identifier))
|
|
278 |
item.d = conPriv->snapConfigurations.value(identifier);
|
|
279 |
else if (conPriv->userChoiceConfigurations.contains(identifier))
|
|
280 |
item.d = conPriv->userChoiceConfigurations.value(identifier);
|
|
281 |
return item;
|
|
282 |
|
|
283 |
}
|
|
284 |
|
|
285 |
/*!
|
|
286 |
Returns true if the system is considered to be connected to another device via an active
|
|
287 |
network interface; otherwise returns false.
|
|
288 |
|
|
289 |
This is equivalent to the following code snippet:
|
|
290 |
|
|
291 |
\code
|
|
292 |
QNetworkConfigurationManager mgr;
|
|
293 |
QList<QNetworkConfiguration> activeConfigs = mgr.allConfigurations(QNetworkConfiguration::Active)
|
|
294 |
if (activeConfigs.count() > 0)
|
|
295 |
Q_ASSERT(mgr.isOnline())
|
|
296 |
else
|
|
297 |
Q_ASSERT(!mgr.isOnline())
|
|
298 |
\endcode
|
|
299 |
|
|
300 |
\sa onlineStateChanged()
|
|
301 |
*/
|
|
302 |
bool QNetworkConfigurationManager::isOnline() const
|
|
303 |
{
|
|
304 |
QNetworkConfigurationManagerPrivate* conPriv = connManager();
|
|
305 |
Q_UNUSED(conPriv);
|
|
306 |
QList<QNetworkConfiguration> activeConfigs = allConfigurations(QNetworkConfiguration::Active);
|
|
307 |
return activeConfigs.count() > 0;
|
|
308 |
}
|
|
309 |
|
|
310 |
/*!
|
|
311 |
Returns the capabilities supported by the current platform.
|
|
312 |
*/
|
|
313 |
QNetworkConfigurationManager::Capabilities QNetworkConfigurationManager::capabilities() const
|
|
314 |
{
|
|
315 |
return connManager()->capFlags;
|
|
316 |
}
|
|
317 |
|
|
318 |
/*!
|
|
319 |
Initiates an update of all configurations. This may be used to initiate WLAN scans or other
|
|
320 |
time consuming updates which may be required to obtain the correct state for configurations.
|
|
321 |
|
|
322 |
This call is asynchronous. On completion of this update the updateCompleted() signal is
|
|
323 |
emitted. If new configurations are discovered or old ones were removed or changed the update
|
|
324 |
process may trigger the emission of one or multiple configurationAdded(),
|
|
325 |
configurationRemoved() and configurationChanged() signals.
|
|
326 |
|
|
327 |
If a configuration state changes as a result of this update all existing QNetworkConfiguration
|
|
328 |
instances are updated automatically.
|
|
329 |
|
|
330 |
\sa allConfigurations()
|
|
331 |
*/
|
|
332 |
void QNetworkConfigurationManager::updateConfigurations()
|
|
333 |
{
|
|
334 |
connManager()->performAsyncConfigurationUpdate();
|
|
335 |
}
|
|
336 |
|
|
337 |
#include "moc_qnetworkconfigmanager.cpp"
|
|
338 |
|
|
339 |
QTM_END_NAMESPACE
|
|
340 |
|