Define usagePolicies API in QNetworkSession
authorShane Kearns <ext-shane.2.kearns@nokia.com>
Wed, 4 Apr 2012 17:11:42 +0000 (18:11 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 11 Apr 2012 20:19:21 +0000 (22:19 +0200)
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 <lars.knoll@nokia.com>
src/network/bearer/qnetworksession.cpp
src/network/bearer/qnetworksession.h
src/network/bearer/qnetworksession_p.h
src/plugins/bearer/qnetworksession_impl.cpp
src/plugins/bearer/qnetworksession_impl.h

index ccf7946..1a3c25a 100644 (file)
@@ -149,6 +149,17 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+    \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)
 
     This signal is emitted whenever the state of the network session changes.
@@ -222,6 +233,12 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+    \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.
 
     \sa QNetworkConfiguration
@@ -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<QNetworkSession::State>();
     qRegisterMetaType<QNetworkSession::SessionError>();
+    qRegisterMetaType<QNetworkSession::UsagePolicies>();
 }
 
 /*!
@@ -654,6 +674,26 @@ quint64 QNetworkSession::activeTime() const
 }
 
 /*!
+    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
 
     This function is required to detect whether the client wants to control 
index 21d568c..d72fe0e 100644 (file)
@@ -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
 
index 0eea06b..4d036d6 100644 (file)
@@ -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;
index 68d6007..31cea0b 100644 (file)
@@ -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;
index 7e48ec3..babc59b 100644 (file)
@@ -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;
 };