From 6957b8d1ede105c88c22045685e3b9ce845c3c0c Mon Sep 17 00:00:00 2001 From: Shane Kearns Date: Wed, 4 Apr 2012 18:11:42 +0100 Subject: Define usagePolicies API in QNetworkSession This allows the system to publish usage restrictions to applications related to the network in use. Currently there is only one restriction defined: NoBackgroundTrafficPolicy, which means that non user initiated traffic should be avoided (e.g. background downloads). For example this policy could be applied to save battery or data transfer charges. Change-Id: I49e26c0f3650d2b92f4ec51981aae9435b717b49 Reviewed-by: Lars Knoll --- src/network/bearer/qnetworksession.cpp | 40 +++++++++++++++++++++++++++++ src/network/bearer/qnetworksession.h | 13 +++++++++- src/network/bearer/qnetworksession_p.h | 5 ++++ src/plugins/bearer/qnetworksession_impl.cpp | 13 ++++++++++ src/plugins/bearer/qnetworksession_impl.h | 6 ++++- 5 files changed, 75 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp index ccf794633d..1a3c25a97f 100644 --- a/src/network/bearer/qnetworksession.cpp +++ b/src/network/bearer/qnetworksession.cpp @@ -148,6 +148,17 @@ QT_BEGIN_NAMESPACE current configuration. */ +/*! + \enum QNetworkSession::UsagePolicies + + These flags allow the system to inform the application of network usage restrictions that + may be in place. + + \value NoPolicy No policy in force, usage is unrestricted. + \value NoBackgroundTrafficPolicy Background network traffic (not user initiated) should be avoided + for example to save battery or data charges +*/ + /*! \fn void QNetworkSession::stateChanged(QNetworkSession::State state) @@ -221,6 +232,12 @@ QT_BEGIN_NAMESPACE This signal is emitted when the network session has been closed. */ +/*! + \fn void QNetworkSession::usagePoliciesChanged(UsagePolicies) + + This signal is emitted when the usage policies in force are changed by the system. +*/ + /*! Constructs a session based on \a connectionConfig with the given \a parent. @@ -247,6 +264,8 @@ QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig, this, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool))); connect(d, SIGNAL(newConfigurationActivated()), this, SIGNAL(newConfigurationActivated())); + connect(d, SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)), + this, SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies))); break; } } @@ -254,6 +273,7 @@ QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig, qRegisterMetaType(); qRegisterMetaType(); + qRegisterMetaType(); } /*! @@ -653,6 +673,26 @@ quint64 QNetworkSession::activeTime() const return d ? d->activeTime() : Q_UINT64_C(0); } +/*! + Returns the network usage policies currently in force by the system. +*/ +QNetworkSession::UsagePolicies QNetworkSession::usagePolicies() const +{ + return d ? d->usagePolicies() : QNetworkSession::NoPolicy; +} + +/*! + \internal + Change usage policies for unit testing. + In normal use, the policies are published by the bearer plugin +*/ +void QNetworkSessionPrivate::setUsagePolicies(QNetworkSession &session, QNetworkSession::UsagePolicies policies) +{ + if (!session.d) + return; + session.d->setUsagePolicies(policies); +} + /*! \internal diff --git a/src/network/bearer/qnetworksession.h b/src/network/bearer/qnetworksession.h index 21d568ca13..d72fe0e759 100644 --- a/src/network/bearer/qnetworksession.h +++ b/src/network/bearer/qnetworksession.h @@ -83,6 +83,13 @@ public: InvalidConfigurationError }; + enum UsagePolicy { + NoPolicy = 0, + NoBackgroundTrafficPolicy = 1 + }; + + Q_DECLARE_FLAGS(UsagePolicies, UsagePolicy) + explicit QNetworkSession(const QNetworkConfiguration &connConfig, QObject *parent = 0); virtual ~QNetworkSession(); @@ -101,7 +108,9 @@ public: quint64 bytesWritten() const; quint64 bytesReceived() const; quint64 activeTime() const; - + + QNetworkSession::UsagePolicies usagePolicies() const; + bool waitForOpened(int msecs = 30000); public Q_SLOTS: @@ -122,6 +131,7 @@ Q_SIGNALS: void error(QNetworkSession::SessionError); void preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless); void newConfigurationActivated(); + void usagePoliciesChanged(QNetworkSession::UsagePolicies); protected: virtual void connectNotify(const char *signal); @@ -136,6 +146,7 @@ private: QT_END_NAMESPACE Q_DECLARE_METATYPE(QNetworkSession::State) Q_DECLARE_METATYPE(QNetworkSession::SessionError) +Q_DECLARE_METATYPE(QNetworkSession::UsagePolicies) QT_END_HEADER diff --git a/src/network/bearer/qnetworksession_p.h b/src/network/bearer/qnetworksession_p.h index 0eea06b085..4d036d601d 100644 --- a/src/network/bearer/qnetworksession_p.h +++ b/src/network/bearer/qnetworksession_p.h @@ -103,6 +103,10 @@ public: virtual quint64 bytesReceived() const = 0; virtual quint64 activeTime() const = 0; + virtual QNetworkSession::UsagePolicies usagePolicies() const = 0; + virtual void setUsagePolicies(QNetworkSession::UsagePolicies) = 0; + + static void setUsagePolicies(QNetworkSession&, QNetworkSession::UsagePolicies); //for unit testing protected: inline QNetworkConfigurationPrivatePointer privateConfiguration(const QNetworkConfiguration &config) const { @@ -124,6 +128,7 @@ Q_SIGNALS: void closed(); void newConfigurationActivated(); void preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless); + void usagePoliciesChanged(QNetworkSession::UsagePolicies); protected: QNetworkSession *q; diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp index 68d6007bdc..31cea0bfc3 100644 --- a/src/plugins/bearer/qnetworksession_impl.cpp +++ b/src/plugins/bearer/qnetworksession_impl.cpp @@ -293,6 +293,19 @@ quint64 QNetworkSessionPrivateImpl::activeTime() const return Q_UINT64_C(0); } +QNetworkSession::UsagePolicies QNetworkSessionPrivateImpl::usagePolicies() const +{ + return currentPolicies; +} + +void QNetworkSessionPrivateImpl::setUsagePolicies(QNetworkSession::UsagePolicies newPolicies) +{ + if (newPolicies != currentPolicies) { + currentPolicies = newPolicies; + emit usagePoliciesChanged(currentPolicies); + } +} + void QNetworkSessionPrivateImpl::updateStateFromServiceNetwork() { QNetworkSession::State oldState = state; diff --git a/src/plugins/bearer/qnetworksession_impl.h b/src/plugins/bearer/qnetworksession_impl.h index 7e48ec3a9f..babc59b420 100644 --- a/src/plugins/bearer/qnetworksession_impl.h +++ b/src/plugins/bearer/qnetworksession_impl.h @@ -70,7 +70,7 @@ class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate public: QNetworkSessionPrivateImpl() - : startTime(0), sessionTimeout(-1) + : engine(0), startTime(0), lastError(QNetworkSession::UnknownSessionError), sessionTimeout(-1), currentPolicies(QNetworkSession::NoPolicy), opened(false) {} ~QNetworkSessionPrivateImpl() {} @@ -102,6 +102,9 @@ public: quint64 bytesReceived() const; quint64 activeTime() const; + QNetworkSession::UsagePolicies usagePolicies() const; + void setUsagePolicies(QNetworkSession::UsagePolicies); + private Q_SLOTS: void networkConfigurationsChanged(); void configurationChanged(QNetworkConfigurationPrivatePointer config); @@ -121,6 +124,7 @@ private: QNetworkSession::SessionError lastError; int sessionTimeout; + QNetworkSession::UsagePolicies currentPolicies; bool opened; }; -- cgit v1.2.3