[telepathy-sofiasip/master] Make keepalive-interval parameter a uint32 with saner semantics

Mikhail Zabaluev mikhail.zabaluev at nokia.com
Thu Jun 18 04:32:02 PDT 2009


---
 src/sip-connection-helpers.c |   19 ++++++---------
 src/sip-connection-manager.c |    6 ++--
 src/sip-connection-private.h |    3 +-
 src/sip-connection.c         |   50 +++++++++++++++++++++++++++++------------
 4 files changed, 48 insertions(+), 30 deletions(-)

diff --git a/src/sip-connection-helpers.c b/src/sip-connection-helpers.c
index 1b58511..6d590b2 100644
--- a/src/sip-connection-helpers.c
+++ b/src/sip-connection-helpers.c
@@ -379,8 +379,8 @@ tpsip_conn_update_nua_outbound (TpsipConnection *conn)
 static void
 priv_sanitize_keepalive_interval (TpsipConnectionPrivate *priv)
 {
-  gint minimum_interval;
-  if (priv->keepalive_interval > 0)
+  guint minimum_interval;
+  if (priv->keepalive_interval != 0)
     {
       minimum_interval =
               (priv->keepalive_mechanism == TPSIP_CONNECTION_KEEPALIVE_REGISTER)
@@ -388,7 +388,7 @@ priv_sanitize_keepalive_interval (TpsipConnectionPrivate *priv)
               : TPSIP_CONNECTION_MINIMUM_KEEPALIVE_INTERVAL;
       if (priv->keepalive_interval < minimum_interval)
         {
-          g_warning ("keepalive interval is too low, pushing to %d", minimum_interval);
+          g_warning ("keepalive interval is too low, pushing to %u", minimum_interval);
           priv->keepalive_interval = minimum_interval;
         }
     }
@@ -400,14 +400,11 @@ tpsip_conn_update_nua_keepalive_interval (TpsipConnection *conn)
   TpsipConnectionPrivate *priv = TPSIP_CONNECTION_GET_PRIVATE (conn);
   long keepalive_interval;
 
-  if (priv->keepalive_interval < 0)
+  if (!priv->keepalive_interval_specified)
     return;
 
   if (priv->keepalive_mechanism == TPSIP_CONNECTION_KEEPALIVE_NONE)
     keepalive_interval = 0;
-  else if (priv->keepalive_interval == 0)
-    /* XXX: figure out proper default timeouts depending on transport */
-    keepalive_interval = TPSIP_CONNECTION_DEFAULT_KEEPALIVE_INTERVAL;
   else
     {
       priv_sanitize_keepalive_interval (priv);
@@ -432,13 +429,13 @@ tpsip_conn_update_nua_contact_features (TpsipConnection *conn)
   if (priv->keepalive_mechanism != TPSIP_CONNECTION_KEEPALIVE_REGISTER)
     return;
 
-  if (priv->keepalive_interval < 0)
+  if (priv->keepalive_interval == 0)
     return;
 
   priv_sanitize_keepalive_interval (priv);
-  timeout = (priv->keepalive_interval > 0)
-        ? priv->keepalive_interval
-        : TPSIP_CONNECTION_DEFAULT_KEEPALIVE_INTERVAL;
+  timeout = priv->keepalive_interval_specified
+      ? priv->keepalive_interval
+      : TPSIP_CONNECTION_DEFAULT_KEEPALIVE_INTERVAL;
   contact_features = g_strdup_printf ("expires=%u", timeout);
   nua_set_params(priv->sofia_nua,
 		 NUTAG_M_FEATURES(contact_features),
diff --git a/src/sip-connection-manager.c b/src/sip-connection-manager.c
index 4e190fe..0a01bdf 100644
--- a/src/sip-connection-manager.c
+++ b/src/sip-connection-manager.c
@@ -58,7 +58,7 @@ typedef struct {
     gboolean loose_routing;
     gboolean discover_binding;
     gchar *keepalive_mechanism;
-    gint keepalive_interval;
+    guint keepalive_interval;
     gboolean discover_stun;
     gchar *stun_server;
     guint stun_port;
@@ -162,8 +162,8 @@ static const TpCMParamSpec tpsip_params[] = {
     /* Mechanism used for connection keepalive maintenance */
     { "keepalive-mechanism", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING,
       0, NULL, G_STRUCT_OFFSET (TpsipConnParams, keepalive_mechanism) },
-    /* KA interval */
-    { "keepalive-interval", DBUS_TYPE_INT32_AS_STRING, G_TYPE_INT,
+    /* Keep-alive interval */
+    { "keepalive-interval", DBUS_TYPE_UINT32_AS_STRING, G_TYPE_UINT,
       0, NULL, G_STRUCT_OFFSET (TpsipConnParams, keepalive_interval) },
     /* Use SRV DNS lookup to discover STUN server */
     { "discover-stun", DBUS_TYPE_BOOLEAN_AS_STRING, G_TYPE_BOOLEAN,
diff --git a/src/sip-connection-private.h b/src/sip-connection-private.h
index f26bf22..4344322 100644
--- a/src/sip-connection-private.h
+++ b/src/sip-connection-private.h
@@ -47,7 +47,7 @@ struct _TpsipConnectionPrivate
   gchar *alias;
   gchar *transport;
   TpsipConnectionKeepaliveMechanism keepalive_mechanism;
-  gint keepalive_interval;
+  guint keepalive_interval;
   gboolean discover_stun;
   gchar *stun_host;
   guint stun_port;
@@ -57,6 +57,7 @@ struct _TpsipConnectionPrivate
   gchar *extra_auth_password;
   gboolean loose_routing;
   gboolean discover_binding;
+  gboolean keepalive_interval_specified;
 
   gboolean dispose_has_run;
 };
diff --git a/src/sip-connection.c b/src/sip-connection.c
index 40bdc2b..66efa15 100644
--- a/src/sip-connection.c
+++ b/src/sip-connection.c
@@ -229,19 +229,37 @@ tpsip_connection_set_property (GObject      *object,
     break;
   }
   case PROP_KEEPALIVE_MECHANISM: {
-    priv->keepalive_mechanism = g_value_get_enum (value);
-    if (priv->sofia_nua) {
-      tpsip_conn_update_nua_outbound (self);
-      tpsip_conn_update_nua_keepalive_interval (self);
-    }
+    TpsipConnectionKeepaliveMechanism mech = g_value_get_enum (value);
+    if (priv->keepalive_interval_specified && priv->keepalive_interval == 0)
+      {
+        if (mech != TPSIP_CONNECTION_KEEPALIVE_NONE
+            && mech != TPSIP_CONNECTION_KEEPALIVE_AUTO)
+          g_warning ("keep-alive mechanism selection is ignored when interval is 0");
+      }
+    else
+      {
+        priv->keepalive_mechanism = mech;
+        if (priv->sofia_nua != NULL)
+          {
+            tpsip_conn_update_nua_outbound (self);
+            tpsip_conn_update_nua_keepalive_interval (self);
+          }
+      }
     break;
   }
   case PROP_KEEPALIVE_INTERVAL: {
-    priv->keepalive_interval = g_value_get_int (value);
-    if (priv->sofia_nua
-	&& priv->keepalive_mechanism != TPSIP_CONNECTION_KEEPALIVE_NONE) {
-      tpsip_conn_update_nua_keepalive_interval(self);
-    }
+    priv->keepalive_interval = g_value_get_uint (value);
+    priv->keepalive_interval_specified = TRUE;
+    if (priv->keepalive_interval == 0)
+      {
+        priv->keepalive_mechanism = TPSIP_CONNECTION_KEEPALIVE_NONE;
+        if (priv->sofia_nua != NULL)
+          tpsip_conn_update_nua_outbound (self);
+      }
+    if (priv->sofia_nua)
+      {
+        tpsip_conn_update_nua_keepalive_interval(self);
+      }
     break;
   }
   case PROP_DISCOVER_BINDING: {
@@ -339,7 +357,9 @@ tpsip_connection_get_property (GObject      *object,
     break;
   }
   case PROP_KEEPALIVE_INTERVAL: {
-    g_value_set_int (value, priv->keepalive_interval);
+    /* FIXME: get the keepalive interval from NUA in case anything
+     * really retrieves this property */
+    g_value_set_uint (value, priv->keepalive_interval);
     break;
   }
   case PROP_DISCOVER_BINDING: {
@@ -492,10 +512,10 @@ tpsip_connection_class_init (TpsipConnectionClass *klass)
       G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
   INST_PROP(PROP_KEEPALIVE_MECHANISM);
 
-  param_spec = g_param_spec_int ("keepalive-interval", "Keepalive interval",
-      "Interval between keepalives in seconds "
-      "(0 = internal default, -1 = let the stack decide)",
-      -1, G_MAXINT32, -1,
+  param_spec = g_param_spec_uint ("keepalive-interval", "Keepalive interval",
+      "Interval between keepalive probes in seconds "
+      "(0 = disabled, unset = use a default interval)",
+      0, G_MAXUINT32, 0,
       G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
   INST_PROP(PROP_KEEPALIVE_INTERVAL);
 
-- 
1.5.6.5



More information about the telepathy-commits mailing list