diff options
Diffstat (limited to 'src/network/access/qnetworkreplyimpl.cpp')
-rw-r--r-- | src/network/access/qnetworkreplyimpl.cpp | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index 79e922387c..c5f26df4b8 100644 --- a/src/network/access/qnetworkreplyimpl.cpp +++ b/src/network/access/qnetworkreplyimpl.cpp @@ -73,6 +73,8 @@ inline QNetworkReplyImplPrivate::QNetworkReplyImplPrivate() void QNetworkReplyImplPrivate::_q_startOperation() { + Q_Q(QNetworkReplyImpl); + // ensure this function is only being called once if (state == Working || state == Finished) { qDebug("QNetworkReplyImpl::_q_startOperation was called more than once"); @@ -110,8 +112,6 @@ void QNetworkReplyImplPrivate::_q_startOperation() state = WaitingForSession; if (session) { - Q_Q(QNetworkReplyImpl); - QObject::connect(session.data(), SIGNAL(error(QNetworkSession::SessionError)), q, SLOT(_q_networkSessionFailed())); @@ -136,6 +136,12 @@ void QNetworkReplyImplPrivate::_q_startOperation() return; } + if (session) { + //get notification of policy changes. + QObject::connect(session.data(), SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)), + q, SLOT(_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies))); + } + if (backend && backend->isSynchronous()) { state = Finished; q_func()->setFinished(true); @@ -318,6 +324,22 @@ void QNetworkReplyImplPrivate::_q_networkSessionFailed() finished(); } } + +void QNetworkReplyImplPrivate::_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies newPolicies) +{ + if (backend->request().attribute(QNetworkRequest::BackgroundRequestAttribute).toBool()) { + if (newPolicies & QNetworkSession::NoBackgroundTrafficPolicy) { + // Abort waiting and working replies. + if (state == WaitingForSession || state == Working) { + state = Working; + error(QNetworkReply::BackgroundRequestNotAllowedError, + QCoreApplication::translate("QNetworkReply", "Background request not allowed.")); + finished(); + } + // ### if backend->canResume(), then we could resume automatically, however no backend supports resuming + } + } +} #endif void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const QNetworkRequest &req, @@ -468,10 +490,7 @@ void QNetworkReplyImplPrivate::createCache() { // check if we can save and if we're allowed to if (!networkCache() - || !request.attribute(QNetworkRequest::CacheSaveControlAttribute, true).toBool() - || request.attribute(QNetworkRequest::CacheLoadControlAttribute, - QNetworkRequest::PreferNetwork).toInt() - == QNetworkRequest::AlwaysNetwork) + || !request.attribute(QNetworkRequest::CacheSaveControlAttribute, true).toBool()) return; cacheEnabled = true; } @@ -679,7 +698,7 @@ char* QNetworkReplyImplPrivate::getDownloadBuffer(qint64 size) downloadBuffer = new char[downloadBufferMaximumSize]; // throws if allocation fails downloadBufferPointer = QSharedPointer<char>(downloadBuffer, downloadBufferDeleter); - q->setAttribute(QNetworkRequest::DownloadBufferAttribute, qVariantFromValue<QSharedPointer<char> > (downloadBufferPointer)); + q->setAttribute(QNetworkRequest::DownloadBufferAttribute, QVariant::fromValue<QSharedPointer<char> > (downloadBufferPointer)); } } @@ -694,7 +713,7 @@ void QNetworkReplyImplPrivate::setDownloadBuffer(QSharedPointer<char> sp, qint64 downloadBuffer = downloadBufferPointer.data(); downloadBufferCurrentSize = 0; downloadBufferMaximumSize = size; - q->setAttribute(QNetworkRequest::DownloadBufferAttribute, qVariantFromValue<QSharedPointer<char> > (downloadBufferPointer)); + q->setAttribute(QNetworkRequest::DownloadBufferAttribute, QVariant::fromValue<QSharedPointer<char> > (downloadBufferPointer)); } |