From 68d510148615b5fb4d3b6ce5faa516c110c53d58 Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Thu, 4 Feb 2010 09:16:19 +1000 Subject: Only create session when valid configuration is available. Only create a network session when a valid configuration is available. Don't execute session code if a network session has not been created. --- src/network/access/qnetworkaccessbackend.cpp | 5 +++ src/network/access/qnetworkaccessmanager.cpp | 63 +++++++++++++++++++--------- src/network/access/qnetworkaccessmanager_p.h | 2 + src/network/access/qnetworkreplyimpl.cpp | 16 ++++--- 4 files changed, 62 insertions(+), 24 deletions(-) diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp index bab6d14..0bfeb3b 100644 --- a/src/network/access/qnetworkaccessbackend.cpp +++ b/src/network/access/qnetworkaccessbackend.cpp @@ -349,6 +349,11 @@ void QNetworkAccessBackend::sslErrors(const QList &errors) */ bool QNetworkAccessBackend::start() { + if (!manager->session) { + open(); + return true; + } + // This is not ideal. const QString host = reply->url.host(); if (host == QLatin1String("localhost") || diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 4e28641..e17beb9 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -350,18 +350,7 @@ QNetworkAccessManager::QNetworkAccessManager(QObject *parent) ensureInitialized(); QNetworkConfigurationManager manager; - d_func()->session = new QNetworkSession(manager.defaultConfiguration(), this); - - connect(d_func()->session, SIGNAL(opened()), this, SLOT(_q_sessionOpened())); - connect(d_func()->session, SIGNAL(closed()), this, SLOT(_q_sessionClosed())); - connect(d_func()->session, SIGNAL(stateChanged(QNetworkSession::State)), - this, SLOT(_q_sessionStateChanged(QNetworkSession::State))); - connect(d_func()->session, SIGNAL(error(QNetworkSession::SessionError)), - this, SLOT(_q_sessionError(QNetworkSession::SessionError))); - connect(d_func()->session, SIGNAL(newConfigurationActivated()), - this, SLOT(_q_sessionNewConfigurationActivated())); - connect(d_func()->session, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)), - this, SLOT(_q_sessionPreferredConfigurationChanged(QNetworkConfiguration,bool))); + d_func()->createSession(manager.defaultConfiguration()); } /*! @@ -689,8 +678,7 @@ QNetworkReply *QNetworkAccessManager::deleteResource(const QNetworkRequest &requ */ void QNetworkAccessManager::setConfiguration(const QNetworkConfiguration &config) { - delete d_func()->session; - d_func()->session = new QNetworkSession(config, this); + d_func()->createSession(config); } /*! @@ -702,7 +690,12 @@ void QNetworkAccessManager::setConfiguration(const QNetworkConfiguration &config */ QNetworkConfiguration QNetworkAccessManager::configuration() const { - return d_func()->session->configuration(); + Q_D(const QNetworkAccessManager); + + if (d->session) + return d->session->configuration(); + else + return QNetworkConfiguration(); } /*! @@ -714,11 +707,16 @@ QNetworkConfiguration QNetworkAccessManager::configuration() const */ QNetworkConfiguration QNetworkAccessManager::activeConfiguration() const { - QNetworkConfigurationManager manager; + Q_D(const QNetworkAccessManager); - return manager.configurationFromIdentifier( - d_func()->session->sessionProperty(QLatin1String("ActiveConfiguration")).toString()); + if (d->session) { + QNetworkConfigurationManager manager; + return manager.configurationFromIdentifier( + d->session->sessionProperty(QLatin1String("ActiveConfiguration")).toString()); + } else { + return QNetworkConfiguration(); + } } /*! @@ -800,11 +798,12 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera void QNetworkAccessManagerPrivate::_q_replyFinished() { Q_Q(QNetworkAccessManager); + QNetworkReply *reply = qobject_cast(q->sender()); if (reply) emit q->finished(reply); - if (deferredMigration) { + if (session && deferredMigration) { foreach (QObject *child, q->children()) { if (child == reply) continue; @@ -1076,6 +1075,32 @@ QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() { } +void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &config) +{ + Q_Q(QNetworkAccessManager); + + if (session) + delete session; + + if (!config.isValid()) { + session = 0; + return; + } + + session = new QNetworkSession(config, q); + + QObject::connect(session, SIGNAL(opened()), q, SLOT(_q_sessionOpened())); + QObject::connect(session, SIGNAL(closed()), q, SLOT(_q_sessionClosed())); + QObject::connect(session, SIGNAL(stateChanged(QNetworkSession::State)), + q, SLOT(_q_sessionStateChanged(QNetworkSession::State))); + QObject::connect(session, SIGNAL(error(QNetworkSession::SessionError)), + q, SLOT(_q_sessionError(QNetworkSession::SessionError))); + QObject::connect(session, SIGNAL(newConfigurationActivated()), + q, SLOT(_q_sessionNewConfigurationActivated())); + QObject::connect(session, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)), + q, SLOT(_q_sessionPreferredConfigurationChanged(QNetworkConfiguration,bool))); +} + void QNetworkAccessManagerPrivate::_q_sessionOpened() { Q_Q(QNetworkAccessManager); diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h index b9e3964..92b2782 100644 --- a/src/network/access/qnetworkaccessmanager_p.h +++ b/src/network/access/qnetworkaccessmanager_p.h @@ -108,6 +108,8 @@ public: emit q->debugMessage(message); } + void createSession(const QNetworkConfiguration &config); + void _q_sessionOpened(); void _q_sessionClosed(); void _q_sessionError(QNetworkSession::SessionError error); diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index fbe90ef..72c378a 100644 --- a/src/network/access/qnetworkreplyimpl.cpp +++ b/src/network/access/qnetworkreplyimpl.cpp @@ -89,13 +89,18 @@ void QNetworkReplyImplPrivate::_q_startOperation() // state changes. state = WaitingForSession; - if (!manager->d_func()->session->isOpen()) - manager->d_func()->session->open(); + QNetworkSession *session = manager->d_func()->session; + + if (session) { + if (!session->isOpen()) + session->open(); + } else { + qWarning("Backend is waiting for QNetworkSession to connect, but there is none!"); + } return; } - //backend->open(); if (state != Finished) { if (operation == QNetworkAccessManager::GetOperation) pendingNotifications.append(NotifyDownstreamReadyWrite); @@ -516,8 +521,9 @@ void QNetworkReplyImplPrivate::finished() pauseNotificationHandling(); QVariant totalSize = cookedHeaders.value(QNetworkRequest::ContentLengthHeader); - if (state == Working && errorCode != QNetworkReply::OperationCanceledError && - manager->d_func()->session->state() == QNetworkSession::Roaming) { + QNetworkSession *session = manager->d_func()->session; + 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 if (!totalSize.isNull()) { qDebug() << "Connection broke during download."; -- cgit v0.12