summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorAaron McCarthy <aaron.mccarthy@nokia.com>2010-02-03 23:16:19 (GMT)
committerAaron McCarthy <aaron.mccarthy@nokia.com>2010-02-08 07:45:07 (GMT)
commit68d510148615b5fb4d3b6ce5faa516c110c53d58 (patch)
treec7890b19e909c4d488eaa43307c19899f84692ce /src/network
parent92eac408783fd4b1e2db2759c3212b580ff24205 (diff)
downloadQt-68d510148615b5fb4d3b6ce5faa516c110c53d58.zip
Qt-68d510148615b5fb4d3b6ce5faa516c110c53d58.tar.gz
Qt-68d510148615b5fb4d3b6ce5faa516c110c53d58.tar.bz2
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.
Diffstat (limited to 'src/network')
-rw-r--r--src/network/access/qnetworkaccessbackend.cpp5
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp63
-rw-r--r--src/network/access/qnetworkaccessmanager_p.h2
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp16
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<QSslError> &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<QNetworkReply *>(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.";