bearer/qnetworksession.cpp

Source codeSwitch to Preprocessed file
LineSource CodeCoverage
1/**************************************************************************** -
2** -
3** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -
4** Contact: http://www.qt-project.org/legal -
5** -
6** This file is part of the QtNetwork module of the Qt Toolkit. -
7** -
8** $QT_BEGIN_LICENSE:LGPL$ -
9** Commercial License Usage -
10** Licensees holding valid commercial Qt licenses may use this file in -
11** accordance with the commercial license agreement provided with the -
12** Software or, alternatively, in accordance with the terms contained in -
13** a written agreement between you and Digia. For licensing terms and -
14** conditions see http://qt.digia.com/licensing. For further information -
15** use the contact form at http://qt.digia.com/contact-us. -
16** -
17** GNU Lesser General Public License Usage -
18** Alternatively, this file may be used under the terms of the GNU Lesser -
19** General Public License version 2.1 as published by the Free Software -
20** Foundation and appearing in the file LICENSE.LGPL included in the -
21** packaging of this file. Please review the following information to -
22** ensure the GNU Lesser General Public License version 2.1 requirements -
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -
24** -
25** In addition, as a special exception, Digia gives you certain additional -
26** rights. These rights are described in the Digia Qt LGPL Exception -
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -
28** -
29** GNU General Public License Usage -
30** Alternatively, this file may be used under the terms of the GNU -
31** General Public License version 3.0 as published by the Free Software -
32** Foundation and appearing in the file LICENSE.GPL included in the -
33** packaging of this file. Please review the following information to -
34** ensure the GNU General Public License version 3.0 requirements will be -
35** met: http://www.gnu.org/copyleft/gpl.html. -
36** -
37** -
38** $QT_END_LICENSE$ -
39** -
40****************************************************************************/ -
41 -
42#include "qnetworksession.h" -
43#include "qnetworksession_p.h" -
44#include "qbearerengine_p.h" -
45 -
46#include <QEventLoop> -
47#include <QMetaMethod> -
48#include <QTimer> -
49#include <QThread> -
50 -
51#include "qnetworkconfigmanager_p.h" -
52 -
53#ifndef QT_NO_BEARERMANAGEMENT -
54 -
55QT_BEGIN_NAMESPACE -
56 -
57/*! -
58 \class QNetworkSession -
59 -
60 \brief The QNetworkSession class provides control over the system's access points -
61 and enables session management for cases when multiple clients access the same access point. -
62 -
63 \since 4.7 -
64 -
65 \inmodule QtNetwork -
66 \ingroup network -
67 -
68 A QNetworkSession enables control over the system's network interfaces. The session's configuration -
69 parameter are determined via the QNetworkConfiguration object to which it is bound. Depending on the -
70 type of the session (single access point or service network) a session may be linked to one or more -
71 network interfaces. By means of \l{open()}{opening} and \l{close()}{closing} of network sessions -
72 a developer can start and stop the systems network interfaces. If the configuration represents -
73 multiple access points (see \l QNetworkConfiguration::ServiceNetwork) more advanced features such as roaming may be supported. -
74 -
75 QNetworkSession supports session management within the same process and depending on the platform's -
76 capabilities may support out-of-process sessions. If the same -
77 network configuration is used by multiple open sessions the underlying network interface is only terminated once -
78 the last session has been closed. -
79 -
80 \section1 Roaming -
81 -
82 Applications may connect to the preferredConfigurationChanged() signal in order to -
83 receive notifications when a more suitable access point becomes available. -
84 In response to this signal the application must either initiate the roaming via migrate() -
85 or ignore() the new access point. Once the session has roamed the -
86 newConfigurationActivated() signal is emitted. The application may now test the -
87 carrier and must either accept() or reject() it. The session will return to the previous -
88 access point if the roaming was rejected. The subsequent state diagram depicts the required -
89 state transitions. -
90 -
91 \image roaming-states.png -
92 -
93 Some platforms may distinguish forced roaming and application level roaming (ALR). -
94 ALR implies that the application controls (via migrate(), ignore(), accept() and reject()) -
95 whether a network session can roam from one access point to the next. Such control is useful -
96 if the application maintains stateful socket connections and wants to control the transition from -
97 one interface to the next. Forced roaming implies that the system automatically roams to the next network without -
98 consulting the application. This has the advantage that the application can make use of roaming features -
99 without actually being aware of it. It is expected that the application detects that the underlying -
100 socket is broken and automatically reconnects via the new network link. -
101 -
102 If the platform supports both modes of roaming, an application indicates its preference -
103 by connecting to the preferredConfigurationChanged() signal. Connecting to this signal means that -
104 the application wants to take control over the roaming behavior and therefore implies application -
105 level roaming. If the client does not connect to the preferredConfigurationChanged(), forced roaming -
106 is used. If forced roaming is not supported the network session will not roam by default. -
107 -
108 Some applications may want to suppress any form of roaming altogether. Possible use cases may be -
109 high priority downloads or remote services which cannot handle a roaming enabled client. Clients -
110 can suppress roaming by connecting to the preferredConfigurationChanged() signal and answer each -
111 signal emission with ignore(). -
112 -
113 \sa QNetworkConfiguration, QNetworkConfigurationManager -
114*/ -
115 -
116/*! -
117 \enum QNetworkSession::State -
118 -
119 This enum describes the connectivity state of the session. If the session is based on a -
120 single access point configuration the state of the session is the same as the state of the -
121 associated network interface. -
122 -
123 \value Invalid The session is invalid due to an invalid configuration. This may -
124 happen due to a removed access point or a configuration that was -
125 invalid to begin with. -
126 \value NotAvailable The session is based on a defined but not yet discovered QNetworkConfiguration -
127 (see \l QNetworkConfiguration::StateFlag). -
128 \value Connecting The network session is being established. -
129 \value Connected The network session is connected. If the current process wishes to use this session -
130 it has to register its interest by calling open(). A network session -
131 is considered to be ready for socket operations if it isOpen() and connected. -
132 \value Closing The network session is in the process of being shut down. -
133 \value Disconnected The network session is not connected. The associated QNetworkConfiguration -
134 has the state QNetworkConfiguration::Discovered. -
135 \value Roaming The network session is roaming from one access point to another -
136 access point. -
137*/ -
138 -
139/*! -
140 \enum QNetworkSession::SessionError -
141 -
142 This enum describes the session errors that can occur. -
143 -
144 \value UnknownSessionError An unidentified error occurred. -
145 \value SessionAbortedError The session was aborted by the user or system. -
146 \value RoamingError The session cannot roam to a new configuration. -
147 \value OperationNotSupportedError The operation is not supported for current configuration. -
148 \value InvalidConfigurationError The operation cannot currently be performed for the -
149 current configuration. -
150*/ -
151 -
152/*! -
153 \enum QNetworkSession::UsagePolicy -
154 \since 5.0 -
155 -
156 These flags allow the system to inform the application of network usage restrictions that -
157 may be in place. -
158 -
159 \value NoPolicy No policy in force, usage is unrestricted. -
160 \value NoBackgroundTrafficPolicy Background network traffic (not user initiated) should be avoided -
161 for example to save battery or data charges -
162*/ -
163 -
164/*! -
165 \fn void QNetworkSession::stateChanged(QNetworkSession::State state) -
166 -
167 This signal is emitted whenever the state of the network session changes. -
168 The \a state parameter is the new state. -
169 -
170 \sa state() -
171*/ -
172 -
173/*! -
174 \fn void QNetworkSession::error(QNetworkSession::SessionError error) -
175 -
176 This signal is emitted after an error occurred. The \a error parameter -
177 describes the error that occurred. -
178 -
179 \sa error(), errorString() -
180*/ -
181 -
182/*! -
183 \fn void QNetworkSession::preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless) -
184 -
185 This signal is emitted when the preferred configuration/access point for the -
186 session changes. Only sessions which are based on service network configurations -
187 may emit this signal. \a config can be used to determine access point specific -
188 details such as proxy settings and \a isSeamless indicates whether roaming will -
189 break the sessions IP address. -
190 -
191 As a consequence to this signal the application must either start the roaming process -
192 by calling migrate() or choose to ignore() the new access point. -
193 -
194 If the roaming process is non-seamless the IP address will change which means that -
195 a socket becomes invalid. However seamless mobility can ensure that the local IP address -
196 does not change. This is achieved by using a virtual IP address which is bound to the actual -
197 link address. During the roaming process the virtual address is attached to the new link -
198 address. -
199 -
200 Some platforms may support the concept of Forced Roaming and Application Level Roaming (ALR). -
201 Forced roaming implies that the platform may simply roam to a new configuration without -
202 consulting applications. It is up to the application to detect the link layer loss and reestablish -
203 its sockets. In contrast ALR provides the opportunity to prevent the system from roaming. -
204 If this session is based on a configuration that supports roaming the application can choose -
205 whether it wants to be consulted (ALR use case) by connecting to this signal. For as long as this signal -
206 connection remains the session remains registered as a roaming stakeholder; otherwise roaming will -
207 be enforced by the platform. -
208 -
209 \sa migrate(), ignore(), QNetworkConfiguration::isRoamingAvailable() -
210*/ -
211 -
212/*! -
213 \fn void QNetworkSession::newConfigurationActivated() -
214 -
215 This signal is emitted once the session has roamed to the new access point. -
216 The application may reopen its socket and test the suitability of the new network link. -
217 Subsequently it must either accept() or reject() the new access point. -
218 -
219 \sa accept(), reject() -
220*/ -
221 -
222/*! -
223 \fn void QNetworkSession::opened() -
224 -
225 This signal is emitted when the network session has been opened. -
226 -
227 The underlying network interface will not be shut down as long as the session remains open. -
228 Note that this feature is dependent on \l{QNetworkConfigurationManager::SystemSessionSupport}{system wide session support}. -
229*/ -
230 -
231/*! -
232 \fn void QNetworkSession::closed() -
233 -
234 This signal is emitted when the network session has been closed. -
235*/ -
236 -
237/*! -
238 \fn void QNetworkSession::usagePoliciesChanged(QNetworkSession::UsagePolicies usagePolicies) -
239 \since 5.0 -
240 -
241 This signal is emitted when the \a usagePolicies in force are changed by the system. -
242*/ -
243 -
244/*! -
245 Constructs a session based on \a connectionConfig with the given \a parent. -
246 -
247 \sa QNetworkConfiguration -
248*/ -
249QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig, QObject *parent) -
250 : QObject(parent), d(0) -
251{ -
252 // invalid configuration -
253 if (!connectionConfig.identifier().isEmpty()) {
evaluated: !connectionConfig.identifier().isEmpty()
TRUEFALSE
yes
Evaluation Count:38
yes
Evaluation Count:2
2-38
254 foreach (QBearerEngine *engine, qNetworkConfigurationManagerPrivate()->engines()) {
executed (the execution status of this line is deduced): for (QForeachContainer<__typeof__(qNetworkConfigurationManagerPrivate()->engines())> _container_(qNetworkConfigurationManagerPrivate()->engines()); !_container_.brk && _container_.i != _container_.e; __extension__ ({ ++_container_.brk; ++_container_.i; })) for (QBearerEngine *engine = *_container_.i;; __extension__ ({--_container_.brk; break;})) {
-
255 if (engine->hasIdentifier(connectionConfig.identifier())) {
partially evaluated: engine->hasIdentifier(connectionConfig.identifier())
TRUEFALSE
yes
Evaluation Count:38
no
Evaluation Count:0
0-38
256 d = engine->createSessionBackend();
executed (the execution status of this line is deduced): d = engine->createSessionBackend();
-
257 d->q = this;
executed (the execution status of this line is deduced): d->q = this;
-
258 d->publicConfig = connectionConfig;
executed (the execution status of this line is deduced): d->publicConfig = connectionConfig;
-
259 d->syncStateWithInterface();
executed (the execution status of this line is deduced): d->syncStateWithInterface();
-
260 connect(d, SIGNAL(quitPendingWaitsForOpened()), this, SIGNAL(opened()));
executed (the execution status of this line is deduced): connect(d, "2""quitPendingWaitsForOpened()", this, "2""opened()");
-
261 connect(d, SIGNAL(error(QNetworkSession::SessionError)),
executed (the execution status of this line is deduced): connect(d, "2""error(QNetworkSession::SessionError)",
-
262 this, SIGNAL(error(QNetworkSession::SessionError)));
executed (the execution status of this line is deduced): this, "2""error(QNetworkSession::SessionError)");
-
263 connect(d, SIGNAL(stateChanged(QNetworkSession::State)),
executed (the execution status of this line is deduced): connect(d, "2""stateChanged(QNetworkSession::State)",
-
264 this, SIGNAL(stateChanged(QNetworkSession::State)));
executed (the execution status of this line is deduced): this, "2""stateChanged(QNetworkSession::State)");
-
265 connect(d, SIGNAL(closed()), this, SIGNAL(closed()));
executed (the execution status of this line is deduced): connect(d, "2""closed()", this, "2""closed()");
-
266 connect(d, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)),
executed (the execution status of this line is deduced): connect(d, "2""preferredConfigurationChanged(QNetworkConfiguration,bool)",
-
267 this, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)));
executed (the execution status of this line is deduced): this, "2""preferredConfigurationChanged(QNetworkConfiguration,bool)");
-
268 connect(d, SIGNAL(newConfigurationActivated()),
executed (the execution status of this line is deduced): connect(d, "2""newConfigurationActivated()",
-
269 this, SIGNAL(newConfigurationActivated()));
executed (the execution status of this line is deduced): this, "2""newConfigurationActivated()");
-
270 connect(d, SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)),
executed (the execution status of this line is deduced): connect(d, "2""usagePoliciesChanged(QNetworkSession::UsagePolicies)",
-
271 this, SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)));
executed (the execution status of this line is deduced): this, "2""usagePoliciesChanged(QNetworkSession::UsagePolicies)");
-
272 break;
executed: break;
Execution Count:38
38
273 } -
274 }
never executed: }
0
275 }
executed: }
Execution Count:38
38
276 -
277 qRegisterMetaType<QNetworkSession::State>();
executed (the execution status of this line is deduced): qRegisterMetaType<QNetworkSession::State>();
-
278 qRegisterMetaType<QNetworkSession::SessionError>();
executed (the execution status of this line is deduced): qRegisterMetaType<QNetworkSession::SessionError>();
-
279 qRegisterMetaType<QNetworkSession::UsagePolicies>();
executed (the execution status of this line is deduced): qRegisterMetaType<QNetworkSession::UsagePolicies>();
-
280}
executed: }
Execution Count:40
40
281 -
282/*! -
283 Frees the resources associated with the QNetworkSession object. -
284*/ -
285QNetworkSession::~QNetworkSession() -
286{ -
287 delete d;
executed (the execution status of this line is deduced): delete d;
-
288}
executed: }
Execution Count:38
38
289 -
290/*! -
291 Creates an open session which increases the session counter on the underlying network interface. -
292 The system will not terminate a network interface until the session reference counter reaches zero. -
293 Therefore an open session allows an application to register its use of the interface. -
294 -
295 As a result of calling open() the interface will be started if it is not connected/up yet. -
296 Some platforms may not provide support for out-of-process sessions. On such platforms the session -
297 counter ignores any sessions held by another process. The platform capabilities can be -
298 detected via QNetworkConfigurationManager::capabilities(). -
299 -
300 Note that this call is asynchronous. Depending on the outcome of this call the results can be enquired -
301 by connecting to the stateChanged(), opened() or error() signals. -
302 -
303 It is not a requirement to open a session in order to monitor the underlying network interface. -
304 -
305 \sa close(), stop(), isOpen() -
306*/ -
307void QNetworkSession::open() -
308{ -
309 if (d)
evaluated: d
TRUEFALSE
yes
Evaluation Count:27
yes
Evaluation Count:1
1-27
310 d->open();
executed: d->open();
Execution Count:27
27
311 else -
312 emit error(InvalidConfigurationError);
executed: error(InvalidConfigurationError);
Execution Count:1
1
313} -
314 -
315/*! -
316 Waits until the session has been opened, up to \a msecs milliseconds. If the session has been opened, this -
317 function returns true; otherwise it returns false. In the case where it returns false, you can call error() -
318 to determine the cause of the error. -
319 -
320 The following example waits up to one second for the session to be opened: -
321 -
322 \code -
323 session->open(); -
324 if (session->waitForOpened(1000)) -
325 qDebug("Open!"); -
326 \endcode -
327 -
328 If \a msecs is -1, this function will not time out. -
329 -
330 \sa open(), error() -
331*/ -
332bool QNetworkSession::waitForOpened(int msecs) -
333{ -
334 if (!d)
evaluated: !d
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:17
1-17
335 return false;
executed: return false;
Execution Count:1
1
336 -
337 if (d->isOpen)
partially evaluated: d->isOpen
TRUEFALSE
yes
Evaluation Count:17
no
Evaluation Count:0
0-17
338 return true;
executed: return true;
Execution Count:17
17
339 -
340 if (!(d->state == Connecting || d->state == Connected)) {
never evaluated: d->state == Connecting
never evaluated: d->state == Connected
0
341 return false;
never executed: return false;
0
342 } -
343 -
344 QEventLoop loop;
never executed (the execution status of this line is deduced): QEventLoop loop;
-
345 QObject::connect(d, SIGNAL(quitPendingWaitsForOpened()), &loop, SLOT(quit()));
never executed (the execution status of this line is deduced): QObject::connect(d, "2""quitPendingWaitsForOpened()", &loop, "1""quit()");
-
346 QObject::connect(this, SIGNAL(error(QNetworkSession::SessionError)), &loop, SLOT(quit()));
never executed (the execution status of this line is deduced): QObject::connect(this, "2""error(QNetworkSession::SessionError)", &loop, "1""quit()");
-
347 -
348 //final call -
349 if (msecs >= 0)
never evaluated: msecs >= 0
0
350 QTimer::singleShot(msecs, &loop, SLOT(quit()));
never executed: QTimer::singleShot(msecs, &loop, "1""quit()");
0
351 -
352 // enter the event loop and wait for opened/error/timeout -
353 loop.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents);
never executed (the execution status of this line is deduced): loop.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents);
-
354 -
355 return d->isOpen;
never executed: return d->isOpen;
0
356} -
357 -
358/*! -
359 Decreases the session counter on the associated network configuration. If the session counter reaches zero -
360 the active network interface is shut down. This also means that state() will only change from \l Connected to -
361 \l Disconnected if the current session was the last open session. -
362 -
363 If the platform does not support out-of-process sessions calling this function does not stop the -
364 interface. In this case \l{stop()} has to be used to force a shut down. -
365 The platform capabilities can be detected via QNetworkConfigurationManager::capabilities(). -
366 -
367 Note that this call is asynchronous. Depending on the outcome of this call the results can be enquired -
368 by connecting to the stateChanged(), opened() or error() signals. -
369 -
370 \sa open(), stop(), isOpen() -
371*/ -
372void QNetworkSession::close() -
373{ -
374 if (d)
partially evaluated: d
TRUEFALSE
yes
Evaluation Count:8
no
Evaluation Count:0
0-8
375 d->close();
executed: d->close();
Execution Count:8
8
376}
executed: }
Execution Count:8
8
377 -
378/*! -
379 Invalidates all open sessions against the network interface and therefore stops the -
380 underlying network interface. This function always changes the session's state() flag to -
381 \l Disconnected. -
382 -
383 \sa open(), close() -
384*/ -
385void QNetworkSession::stop() -
386{ -
387 if (d)
partially evaluated: d
TRUEFALSE
yes
Evaluation Count:3
no
Evaluation Count:0
0-3
388 d->stop();
executed: d->stop();
Execution Count:3
3
389}
executed: }
Execution Count:3
3
390 -
391/*! -
392 Returns the QNetworkConfiguration that this network session object is based on. -
393 -
394 \sa QNetworkConfiguration -
395*/ -
396QNetworkConfiguration QNetworkSession::configuration() const -
397{ -
398 return d ? d->publicConfig : QNetworkConfiguration();
executed: return d ? d->publicConfig : QNetworkConfiguration();
Execution Count:25
25
399} -
400 -
401#ifndef QT_NO_NETWORKINTERFACE -
402/*! -
403 Returns the network interface that is used by this session. -
404 -
405 This function only returns a valid QNetworkInterface when this session is \l Connected. -
406 -
407 The returned interface may change as a result of a roaming process. -
408 -
409 \sa state() -
410*/ -
411QNetworkInterface QNetworkSession::interface() const -
412{ -
413 return d ? d->currentInterface() : QNetworkInterface();
executed: return d ? d->currentInterface() : QNetworkInterface();
Execution Count:56
56
414} -
415#endif -
416 -
417/*! -
418 Returns true if this session is open. If the number of all open sessions is greater than -
419 zero the underlying network interface will remain connected/up. -
420 -
421 The session can be controlled via open() and close(). -
422*/ -
423bool QNetworkSession::isOpen() const -
424{ -
425 return d ? d->isOpen : false;
executed: return d ? d->isOpen : false;
Execution Count:75
75
426} -
427 -
428/*! -
429 Returns the state of the session. -
430 -
431 If the session is based on a single access point configuration the state of the -
432 session is the same as the state of the associated network interface. Therefore -
433 a network session object can be used to monitor network interfaces. -
434 -
435 A \l QNetworkConfiguration::ServiceNetwork based session summarizes the state of all its children -
436 and therefore returns the \l Connected state if at least one of the service network's -
437 \l {QNetworkConfiguration::children()}{children()} configurations is active. -
438 -
439 Note that it is not required to hold an open session in order to obtain the network interface state. -
440 A connected but closed session may be used to monitor network interfaces whereas an open and connected -
441 session object may prevent the network interface from being shut down. -
442 -
443 \sa error(), stateChanged() -
444*/ -
445QNetworkSession::State QNetworkSession::state() const -
446{ -
447 return d ? d->state : QNetworkSession::Invalid;
executed: return d ? d->state : QNetworkSession::Invalid;
Execution Count:997
997
448} -
449 -
450/*! -
451 Returns the type of error that last occurred. -
452 -
453 \sa state(), errorString() -
454*/ -
455QNetworkSession::SessionError QNetworkSession::error() const -
456{ -
457 return d ? d->error() : InvalidConfigurationError;
executed: return d ? d->error() : InvalidConfigurationError;
Execution Count:16
16
458} -
459 -
460/*! -
461 Returns a human-readable description of the last device error that -
462 occurred. -
463 -
464 \sa error() -
465*/ -
466QString QNetworkSession::errorString() const -
467{ -
468 return d ? d->errorString() : tr("Invalid configuration.");
executed: return d ? d->errorString() : tr("Invalid configuration.");
Execution Count:1
1
469} -
470 -
471/*! -
472 Returns the value for property \a key. -
473 -
474 A network session can have properties attached which may describe the session in more details. -
475 This function can be used to gain access to those properties. -
476 -
477 The following property keys are guaranteed to be specified on all platforms: -
478 -
479 \table -
480 \header -
481 \li Key \li Description -
482 \row -
483 \li ActiveConfiguration -
484 \li If the session \l isOpen() this property returns the identifier of the -
485 QNetworkConfiguration that is used by this session; otherwise an empty string. -
486 -
487 The main purpose of this key is to determine which Internet access point is used -
488 if the session is based on a \l{QNetworkConfiguration::ServiceNetwork}{ServiceNetwork}. -
489 The following code snippet highlights the difference: -
490 \code -
491 QNetworkConfigurationManager mgr; -
492 QNetworkConfiguration ap = mgr.defaultConfiguration(); -
493 QNetworkSession *session = new QNetworkSession(ap); -
494 ... //code activates session -
495 -
496 QString ident = session->sessionProperty("ActiveConfiguration").toString(); -
497 if ( ap.type() == QNetworkConfiguration::ServiceNetwork ) { -
498 Q_ASSERT( ap.identifier() != ident ); -
499 Q_ASSERT( ap.children().contains( mgr.configurationFromIdentifier(ident) ) ); -
500 } else if ( ap.type() == QNetworkConfiguration::InternetAccessPoint ) { -
501 Q_ASSERT( ap.identifier() == ident ); -
502 } -
503 \endcode -
504 \row -
505 \li UserChoiceConfiguration -
506 \li If the session \l isOpen() and is bound to a QNetworkConfiguration of type -
507 UserChoice, this property returns the identifier of the QNetworkConfiguration that the -
508 configuration resolved to when \l open() was called; otherwise an empty string. -
509 -
510 The purpose of this key is to determine the real QNetworkConfiguration that the -
511 session is using. This key is different from \e ActiveConfiguration in that -
512 this key may return an identifier for either a -
513 \l {QNetworkConfiguration::ServiceNetwork}{service network} or a -
514 \l {QNetworkConfiguration::InternetAccessPoint}{Internet access points} configurations, -
515 whereas \e ActiveConfiguration always returns identifiers to -
516 \l {QNetworkConfiguration::InternetAccessPoint}{Internet access points} configurations. -
517 \row -
518 \li ConnectInBackground -
519 \li Setting this property to \e true before calling \l open() implies that the connection attempt -
520 is made but if no connection can be established, the user is not connsulted and asked to select -
521 a suitable connection. This property is not set by default and support for it depends on the platform. -
522 -
523 \row -
524 \li AutoCloseSessionTimeout -
525 \li If the session requires polling to keep its state up to date, this property holds -
526 the timeout in milliseconds before the session will automatically close. If the -
527 value of this property is -1 the session will not automatically close. This property -
528 is set to -1 by default. -
529 -
530 The purpose of this property is to minimize resource use on platforms that use -
531 polling to update the state of the session. Applications can set the value of this -
532 property to the desired timeout before the session is closed. In response to the -
533 closed() signal the network session should be deleted to ensure that all polling is -
534 stopped. The session can then be recreated once it is required again. This property -
535 has no effect for sessions that do not require polling. -
536 \endtable -
537*/ -
538QVariant QNetworkSession::sessionProperty(const QString &key) const -
539{ -
540 if (!d || !d->publicConfig.isValid())
partially evaluated: !d
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:9
partially evaluated: !d->publicConfig.isValid()
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:9
0-9
541 return QVariant();
never executed: return QVariant();
0
542 -
543 if (key == QLatin1String("ActiveConfiguration"))
partially evaluated: key == QLatin1String("ActiveConfiguration")
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:9
0-9
544 return d->isOpen ? d->activeConfig.identifier() : QString();
never executed: return d->isOpen ? d->activeConfig.identifier() : QString();
0
545 -
546 if (key == QLatin1String("UserChoiceConfiguration")) {
partially evaluated: key == QLatin1String("UserChoiceConfiguration")
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:9
0-9
547 if (!d->isOpen || d->publicConfig.type() != QNetworkConfiguration::UserChoice)
never evaluated: !d->isOpen
never evaluated: d->publicConfig.type() != QNetworkConfiguration::UserChoice
0
548 return QString();
never executed: return QString();
0
549 -
550 if (d->serviceConfig.isValid())
never evaluated: d->serviceConfig.isValid()
0
551 return d->serviceConfig.identifier();
never executed: return d->serviceConfig.identifier();
0
552 else -
553 return d->activeConfig.identifier();
never executed: return d->activeConfig.identifier();
0
554 } -
555 -
556 return d->sessionProperty(key);
executed: return d->sessionProperty(key);
Execution Count:9
9
557} -
558 -
559/*! -
560 Sets the property \a value on the session. The property is identified using -
561 \a key. Removing an already set property can be achieved by passing an -
562 invalid QVariant. -
563 -
564 Note that the \e UserChoiceConfiguration and \e ActiveConfiguration -
565 properties are read only and cannot be changed using this method. -
566*/ -
567void QNetworkSession::setSessionProperty(const QString &key, const QVariant &value) -
568{ -
569 if (!d)
partially evaluated: !d
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7
0-7
570 return;
never executed: return;
0
571 -
572 if (key == QLatin1String("ActiveConfiguration") ||
partially evaluated: key == QLatin1String("ActiveConfiguration")
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7
0-7
573 key == QLatin1String("UserChoiceConfiguration")) {
partially evaluated: key == QLatin1String("UserChoiceConfiguration")
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7
0-7
574 return;
never executed: return;
0
575 } -
576 -
577 d->setSessionProperty(key, value);
executed (the execution status of this line is deduced): d->setSessionProperty(key, value);
-
578}
executed: }
Execution Count:7
7
579 -
580/*! -
581 Instructs the session to roam to the new access point. The old access point remains active -
582 until the application calls accept(). -
583 -
584 The newConfigurationActivated() signal is emitted once roaming has been completed. -
585 -
586 \sa accept() -
587*/ -
588void QNetworkSession::migrate() -
589{ -
590 if (d)
partially evaluated: d
TRUEFALSE
yes
Evaluation Count:1
no
Evaluation Count:0
0-1
591 d->migrate();
executed: d->migrate();
Execution Count:1
1
592}
executed: }
Execution Count:1
1
593 -
594/*! -
595 This function indicates that the application does not wish to roam the session. -
596 -
597 \sa migrate() -
598*/ -
599void QNetworkSession::ignore() -
600{ -
601 if (d)
partially evaluated: d
TRUEFALSE
yes
Evaluation Count:1
no
Evaluation Count:0
0-1
602 d->ignore();
executed: d->ignore();
Execution Count:1
1
603}
executed: }
Execution Count:1
1
604 -
605/*! -
606 Instructs the session to permanently accept the new access point. Once this function -
607 has been called the session may not return to the old access point. -
608 -
609 The old access point may be closed in the process if there are no other network sessions for it. -
610 Therefore any open socket that still uses the old access point -
611 may become unusable and should be closed before completing the migration. -
612*/ -
613void QNetworkSession::accept() -
614{ -
615 if (d)
partially evaluated: d
TRUEFALSE
yes
Evaluation Count:1
no
Evaluation Count:0
0-1
616 d->accept();
executed: d->accept();
Execution Count:1
1
617}
executed: }
Execution Count:1
1
618 -
619/*! -
620 The new access point is not suitable for the application. By calling this function the -
621 session returns to the previous access point/configuration. This action may invalidate -
622 any socket that has been created via the not desired access point. -
623 -
624 \sa accept() -
625*/ -
626void QNetworkSession::reject() -
627{ -
628 if (d)
partially evaluated: d
TRUEFALSE
yes
Evaluation Count:1
no
Evaluation Count:0
0-1
629 d->reject();
executed: d->reject();
Execution Count:1
1
630}
executed: }
Execution Count:1
1
631 -
632 -
633/*! -
634 Returns the amount of data sent in bytes; otherwise 0. -
635 -
636 This field value includes the usage across all open network -
637 sessions which use the same network interface. -
638 -
639 If the session is based on a service network configuration the number of -
640 sent bytes across all active member configurations are returned. -
641 -
642 This function may not always be supported on all platforms and returns 0. -
643 The platform capability can be detected via QNetworkConfigurationManager::DataStatistics. -
644 -
645 \note On some platforms this function may run the main event loop. -
646*/ -
647quint64 QNetworkSession::bytesWritten() const -
648{ -
649 return d ? d->bytesWritten() : Q_UINT64_C(0);
never executed: return d ? d->bytesWritten() : static_cast<unsigned long long>(0ULL);
0
650} -
651 -
652/*! -
653 Returns the amount of data received in bytes; otherwise 0. -
654 -
655 This field value includes the usage across all open network -
656 sessions which use the same network interface. -
657 -
658 If the session is based on a service network configuration the number of -
659 sent bytes across all active member configurations are returned. -
660 -
661 This function may not always be supported on all platforms and returns 0. -
662 The platform capability can be detected via QNetworkConfigurationManager::DataStatistics. -
663 -
664 \note On some platforms this function may run the main event loop. -
665*/ -
666quint64 QNetworkSession::bytesReceived() const -
667{ -
668 return d ? d->bytesReceived() : Q_UINT64_C(0);
never executed: return d ? d->bytesReceived() : static_cast<unsigned long long>(0ULL);
0
669} -
670 -
671/*! -
672 Returns the number of seconds that the session has been active. -
673*/ -
674quint64 QNetworkSession::activeTime() const -
675{ -
676 return d ? d->activeTime() : Q_UINT64_C(0);
never executed: return d ? d->activeTime() : static_cast<unsigned long long>(0ULL);
0
677} -
678 -
679/*! -
680 Returns the network usage policies currently in force by the system. -
681*/ -
682QNetworkSession::UsagePolicies QNetworkSession::usagePolicies() const -
683{ -
684 return d ? d->usagePolicies() : QNetworkSession::NoPolicy;
executed: return d ? d->usagePolicies() : QNetworkSession::NoPolicy;
Execution Count:3
3
685} -
686 -
687/*! -
688 \internal -
689 Change usage policies for unit testing. -
690 In normal use, the policies are published by the bearer plugin -
691*/ -
692void QNetworkSessionPrivate::setUsagePolicies(QNetworkSession &session, QNetworkSession::UsagePolicies policies) -
693{ -
694 if (!session.d)
partially evaluated: !session.d
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:2
0-2
695 return;
never executed: return;
0
696 session.d->setUsagePolicies(policies);
executed (the execution status of this line is deduced): session.d->setUsagePolicies(policies);
-
697}
executed: }
Execution Count:2
2
698 -
699/*! -
700 \internal -
701 -
702 This function is required to detect whether the client wants to control -
703 the roaming process. If he connects to preferredConfigurationChanged() signal -
704 he intends to influence it. Otherwise QNetworkSession always roams -
705 without registering this session as a stakeholder in the roaming process. -
706 -
707 For more details check the Forced vs ALR roaming section in the QNetworkSession -
708 class description. -
709*/ -
710void QNetworkSession::connectNotify(const QMetaMethod &signal) -
711{ -
712 QObject::connectNotify(signal);
executed (the execution status of this line is deduced): QObject::connectNotify(signal);
-
713 -
714 if (!d)
evaluated: !d
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:74
1-74
715 return;
executed: return;
Execution Count:1
1
716 -
717 //check for preferredConfigurationChanged() signal connect notification -
718 //This is not required on all platforms -
719 static const QMetaMethod preferredConfigurationChangedSignal = -
720 QMetaMethod::fromSignal(&QNetworkSession::preferredConfigurationChanged); -
721 if (signal == preferredConfigurationChangedSignal)
partially evaluated: signal == preferredConfigurationChangedSignal
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:74
0-74
722 d->setALREnabled(true);
never executed: d->setALREnabled(true);
0
723}
executed: }
Execution Count:74
74
724 -
725/*! -
726 \internal -
727 -
728 This function is called when the client disconnects from the -
729 preferredConfigurationChanged() signal. -
730 -
731 \sa connectNotify() -
732*/ -
733void QNetworkSession::disconnectNotify(const QMetaMethod &signal) -
734{ -
735 QObject::disconnectNotify(signal);
executed (the execution status of this line is deduced): QObject::disconnectNotify(signal);
-
736 -
737 if (!d)
evaluated: !d
TRUEFALSE
yes
Evaluation Count:1
yes
Evaluation Count:74
1-74
738 return;
executed: return;
Execution Count:1
1
739 -
740 //check for preferredConfigurationChanged() signal disconnect notification -
741 //This is not required on all platforms -
742 static const QMetaMethod preferredConfigurationChangedSignal = -
743 QMetaMethod::fromSignal(&QNetworkSession::preferredConfigurationChanged); -
744 if (signal == preferredConfigurationChangedSignal)
partially evaluated: signal == preferredConfigurationChangedSignal
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:74
0-74
745 d->setALREnabled(false);
never executed: d->setALREnabled(false);
0
746}
executed: }
Execution Count:74
74
747 -
748#include "moc_qnetworksession.cpp" -
749 -
750QT_END_NAMESPACE -
751 -
752#endif // QT_NO_BEARERMANAGEMENT -
753 -
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial