summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/network/access/qnetworkaccessbackend.cpp11
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp56
-rw-r--r--src/network/access/qnetworkaccessmanager_p.h5
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp8
4 files changed, 49 insertions, 31 deletions
diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp
index db2243c..41b0b4e 100644
--- a/src/network/access/qnetworkaccessbackend.cpp
+++ b/src/network/access/qnetworkaccessbackend.cpp
@@ -370,13 +370,14 @@ bool QNetworkAccessBackend::start()
{
#ifndef QT_NO_BEARERMANAGEMENT
// For bearer, check if session start is required
- if (manager->networkSession) {
+ QSharedPointer<QNetworkSession> networkSession(manager->getNetworkSession());
+ if (networkSession) {
// session required
- if (manager->networkSession->isOpen() &&
- manager->networkSession->state() == QNetworkSession::Connected) {
+ if (networkSession->isOpen() &&
+ networkSession->state() == QNetworkSession::Connected) {
// Session is already open and ready to use.
// copy network session down to the backend
- setProperty("_q_networksession", QVariant::fromValue(manager->networkSession));
+ setProperty("_q_networksession", QVariant::fromValue(networkSession));
} else {
// Session not ready, but can skip for loopback connections
@@ -399,7 +400,7 @@ bool QNetworkAccessBackend::start()
#ifndef QT_NO_BEARERMANAGEMENT
// Get the proxy settings from the network session (in the case of service networks,
// the proxy settings change depending which AP was activated)
- QNetworkSession *session = manager->networkSession.data();
+ QNetworkSession *session = networkSession.data();
QNetworkConfiguration config;
if (session) {
QNetworkConfigurationManager configManager;
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 768c135..92ece46 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -772,8 +772,9 @@ QNetworkConfiguration QNetworkAccessManager::configuration() const
{
Q_D(const QNetworkAccessManager);
- if (d->networkSession)
- return d->networkSession->configuration();
+ QSharedPointer<QNetworkSession> session(d->getNetworkSession());
+ if (session)
+ return session->configuration();
else
return QNetworkConfiguration();
}
@@ -797,11 +798,12 @@ QNetworkConfiguration QNetworkAccessManager::activeConfiguration() const
{
Q_D(const QNetworkAccessManager);
- if (d->networkSession) {
+ QSharedPointer<QNetworkSession> networkSession(d->getNetworkSession());
+ if (networkSession) {
QNetworkConfigurationManager manager;
return manager.configurationFromIdentifier(
- d->networkSession->sessionProperty(QLatin1String("ActiveConfiguration")).toString());
+ networkSession->sessionProperty(QLatin1String("ActiveConfiguration")).toString());
} else {
return QNetworkConfiguration();
}
@@ -836,7 +838,8 @@ QNetworkAccessManager::NetworkAccessibility QNetworkAccessManager::networkAccess
{
Q_D(const QNetworkAccessManager);
- if (d->networkSession) {
+ QSharedPointer<QNetworkSession> networkSession(d->getNetworkSession());
+ if (networkSession) {
// d->online holds online/offline state of this network session.
if (d->online)
return d->networkAccessible;
@@ -848,6 +851,13 @@ QNetworkAccessManager::NetworkAccessibility QNetworkAccessManager::networkAccess
}
}
+QSharedPointer<QNetworkSession> QNetworkAccessManagerPrivate::getNetworkSession() const
+{
+ if (networkSessionStrongRef)
+ return networkSessionStrongRef;
+ return networkSessionWeakRef.toStrongRef();
+}
+
#endif // QT_NO_BEARERMANAGEMENT
/*!
@@ -937,7 +947,7 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
return new QDisabledNetworkReply(this, req, op);
}
- if (!d->networkSession && (d->initializeSession || !d->networkConfiguration.isEmpty())) {
+ if (!d->networkSessionStrongRef && (d->initializeSession || !d->networkConfiguration.isEmpty())) {
QNetworkConfigurationManager manager;
if (!d->networkConfiguration.isEmpty()) {
d->createSession(manager.configurationFromIdentifier(d->networkConfiguration));
@@ -1015,8 +1025,8 @@ void QNetworkAccessManagerPrivate::_q_replyFinished()
// It will not be destroyed immediately, but rather when the connection cache is flushed
// after 2 minutes.
activeReplyCount--;
- if (networkSession && activeReplyCount == 0)
- networkSession.clear();
+ if (networkSessionStrongRef && activeReplyCount == 0)
+ networkSessionStrongRef.clear();
#endif
}
@@ -1178,25 +1188,29 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
initializeSession = false;
+ //resurrect weak ref if possible
+ networkSessionStrongRef = networkSessionWeakRef.toStrongRef();
+
QSharedPointer<QNetworkSession> newSession;
if (config.isValid())
newSession = QSharedNetworkSessionManager::getSession(config);
- if (networkSession) {
+ if (networkSessionStrongRef) {
//do nothing if new and old session are the same
- if (networkSession == newSession)
+ if (networkSessionStrongRef == newSession)
return;
//disconnect from old session
- QObject::disconnect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
- QObject::disconnect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
- QObject::disconnect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
+ QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()));
+ QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
+ QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(stateChanged(QNetworkSession::State)),
q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
}
//switch to new session (null if config was invalid)
- networkSession = newSession;
+ networkSessionStrongRef = newSession;
+ networkSessionWeakRef = networkSessionStrongRef.toWeakRef();
- if (!networkSession) {
+ if (!networkSessionStrongRef) {
online = false;
if (networkAccessible == QNetworkAccessManager::NotAccessible)
@@ -1208,18 +1222,19 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
}
//connect to new session
- QObject::connect(networkSession.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()), Qt::QueuedConnection);
+ QObject::connect(networkSessionStrongRef.data(), SIGNAL(opened()), q, SIGNAL(networkSessionConnected()), Qt::QueuedConnection);
//QueuedConnection is used to avoid deleting the networkSession inside its closed signal
- QObject::connect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()), Qt::QueuedConnection);
- QObject::connect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
+ QObject::connect(networkSessionStrongRef.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()), Qt::QueuedConnection);
+ QObject::connect(networkSessionStrongRef.data(), SIGNAL(stateChanged(QNetworkSession::State)),
q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)), Qt::QueuedConnection);
- _q_networkSessionStateChanged(networkSession->state());
+ _q_networkSessionStateChanged(networkSessionStrongRef->state());
}
void QNetworkAccessManagerPrivate::_q_networkSessionClosed()
{
Q_Q(QNetworkAccessManager);
+ QSharedPointer<QNetworkSession> networkSession(getNetworkSession());
if (networkSession) {
networkConfiguration = networkSession->configuration().identifier();
@@ -1228,7 +1243,8 @@ void QNetworkAccessManagerPrivate::_q_networkSessionClosed()
QObject::disconnect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed()));
QObject::disconnect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)),
q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State)));
- networkSession.clear();
+ networkSessionStrongRef.clear();
+ networkSessionWeakRef.clear();
}
}
diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h
index ddacf68..8d03c37 100644
--- a/src/network/access/qnetworkaccessmanager_p.h
+++ b/src/network/access/qnetworkaccessmanager_p.h
@@ -78,7 +78,6 @@ public:
proxyFactory(0),
#endif
#ifndef QT_NO_BEARERMANAGEMENT
- networkSession(0),
lastSessionState(QNetworkSession::Invalid),
networkAccessible(QNetworkAccessManager::Accessible),
activeReplyCount(0),
@@ -113,6 +112,7 @@ public:
#ifndef QT_NO_BEARERMANAGEMENT
void createSession(const QNetworkConfiguration &config);
+ QSharedPointer<QNetworkSession> getNetworkSession() const;
void _q_networkSessionClosed();
void _q_networkSessionNewConfigurationActivated();
@@ -137,7 +137,8 @@ public:
#endif
#ifndef QT_NO_BEARERMANAGEMENT
- QSharedPointer<QNetworkSession> networkSession;
+ QSharedPointer<QNetworkSession> networkSessionStrongRef;
+ QWeakPointer<QNetworkSession> networkSessionWeakRef;
QNetworkSession::State lastSessionState;
QString networkConfiguration;
QNetworkAccessManager::NetworkAccessibility networkAccessible;
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index b0e81e9..6f885d1 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -97,12 +97,12 @@ void QNetworkReplyImplPrivate::_q_startOperation()
// state changes.
state = WaitingForSession;
- QNetworkSession *session = manager->d_func()->networkSession.data();
+ QSharedPointer<QNetworkSession> session(manager->d_func()->getNetworkSession());
if (session) {
Q_Q(QNetworkReplyImpl);
- QObject::connect(session, SIGNAL(error(QNetworkSession::SessionError)),
+ QObject::connect(session.data(), SIGNAL(error(QNetworkSession::SessionError)),
q, SLOT(_q_networkSessionFailed()), Qt::QueuedConnection);
if (!session->isOpen())
@@ -268,7 +268,7 @@ void QNetworkReplyImplPrivate::_q_networkSessionConnected()
if (manager.isNull())
return;
- QNetworkSession *session = manager->d_func()->networkSession.data();
+ QSharedPointer<QNetworkSession> session = manager->d_func()->getNetworkSession();
if (!session)
return;
@@ -746,7 +746,7 @@ void QNetworkReplyImplPrivate::finished()
if (!manager.isNull()) {
#ifndef QT_NO_BEARERMANAGEMENT
- QNetworkSession *session = manager->d_func()->networkSession.data();
+ QSharedPointer<QNetworkSession> session (manager->d_func()->getNetworkSession());
if (session && session->state() == QNetworkSession::Roaming &&
state == Working && errorCode != QNetworkReply::OperationCanceledError) {
// only content with a known size will fail with a temporary network failure error