diff options
author | Shane Kearns <ext-shane.2.kearns@nokia.com> | 2012-04-13 18:05:33 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-19 19:46:07 +0200 |
commit | af100dbd7e23076f8873f9ee8847d1ac90bb1700 (patch) | |
tree | d22ffeea04285d446bfecbd7fee89dad510bef30 /src/network/access/qnetworkreplyimpl.cpp | |
parent | ddf040eccb56098db4f81a72fd9db0010697da94 (diff) |
Abort background requests if policy changes to disallow them
Using the policy change signal from QNetworkSession.
If the new policy disallows background requests and this is a
background request, then generate an error.
This results in a TCP RST on the socket, and a
BackgroundRequestNotAllowedError on the QNetworkReply.
If the reply is already finished, no action is taken.
Change-Id: I4ff5c681a8b7b852727bb95f03664d666f4efe07
Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
Diffstat (limited to 'src/network/access/qnetworkreplyimpl.cpp')
-rw-r--r-- | src/network/access/qnetworkreplyimpl.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index c9efcbb1fe..d535cbda65 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,12 +112,8 @@ void QNetworkReplyImplPrivate::_q_startOperation() state = WaitingForSession; if (session) { - Q_Q(QNetworkReplyImpl); - QObject::connect(session.data(), SIGNAL(error(QNetworkSession::SessionError)), q, SLOT(_q_networkSessionFailed())); - QObject::connect(session.data(), SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)), - q, SLOT(_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies))); if (!session->isOpen()) { session->setSessionProperty(QStringLiteral("ConnectInBackground"), isBackground); @@ -138,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); @@ -321,9 +325,20 @@ void QNetworkReplyImplPrivate::_q_networkSessionFailed() } } -void QNetworkReplyImplPrivate::_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies) +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 |