[telepathy-gabble/telepathy-gabble-0.8] factor out capability URI extraction from messages

Dafydd Harries dafydd.harries at collabora.co.uk
Tue Jan 12 11:02:05 PST 2010


Then, make GabbleCapsChannelManager's parse_caps take the resulting gchar **.
---
 src/caps-channel-manager.c  |    4 ++--
 src/caps-channel-manager.h  |    4 ++--
 src/ft-manager.c            |   19 ++++---------------
 src/presence-cache.c        |   39 +++++++++++++++++++++++++++++++++++----
 src/private-tubes-factory.c |   35 +++++++++++++----------------------
 5 files changed, 56 insertions(+), 45 deletions(-)

diff --git a/src/caps-channel-manager.c b/src/caps-channel-manager.c
index e3039f6..f833d33 100644
--- a/src/caps-channel-manager.c
+++ b/src/caps-channel-manager.c
@@ -95,7 +95,7 @@ void gabble_caps_channel_manager_get_feature_list (
 
 gpointer gabble_caps_channel_manager_parse_capabilities (
     GabbleCapsChannelManager *caps_manager,
-    LmMessageNode *query_result)
+    gchar **uris)
 {
   GabbleCapsChannelManagerIface *iface =
     GABBLE_CAPS_CHANNEL_MANAGER_GET_INTERFACE (caps_manager);
@@ -103,7 +103,7 @@ gpointer gabble_caps_channel_manager_parse_capabilities (
 
   if (method != NULL)
     {
-      return method (caps_manager, query_result);
+      return method (caps_manager, uris);
     }
   /* ... else assume there is not caps for this kind of channels */
   return NULL;
diff --git a/src/caps-channel-manager.h b/src/caps-channel-manager.h
index bc4b230..f622e10 100644
--- a/src/caps-channel-manager.h
+++ b/src/caps-channel-manager.h
@@ -68,7 +68,7 @@ typedef void (*GabbleCapsChannelManagerGetFeatureListFunc) (
     GSList **features);
 
 typedef gpointer (*GabbleCapsChannelManagerParseCapsFunc) (
-    GabbleCapsChannelManager *manager, LmMessageNode *children);
+    GabbleCapsChannelManager *manager, gchar **uris);
 
 typedef void (*GabbleCapsChannelManagerFreeCapsFunc) (
     GabbleCapsChannelManager *manager, gpointer specific_caps);
@@ -95,7 +95,7 @@ void gabble_caps_channel_manager_get_feature_list (
     GSList **features);
 
 gpointer gabble_caps_channel_manager_parse_capabilities (
-    GabbleCapsChannelManager *manager, LmMessageNode *query_result);
+    GabbleCapsChannelManager *caps_manager, gchar **uris);
 
 void gabble_caps_channel_manager_free_capabilities (GabbleCapsChannelManager *manager,
     gpointer specific_caps);
diff --git a/src/ft-manager.c b/src/ft-manager.c
index 8c8d9de..8fee5b9 100644
--- a/src/ft-manager.c
+++ b/src/ft-manager.c
@@ -705,24 +705,13 @@ gabble_ft_manager_get_feature_list (
 
 static gpointer
 gabble_ft_manager_parse_caps (GabbleCapsChannelManager *manager,
-                              LmMessageNode *query_result)
+                              gchar **uris)
 {
-  NodeIter i;
+  gchar **i;
 
-  for (i = node_iter (query_result); i; i = node_iter_next (i))
+  for (i = uris; *i; i++)
     {
-      LmMessageNode *child = node_iter_data (i);
-      const gchar *var;
-
-      if (0 != strcmp (child->name, "feature"))
-        continue;
-
-      var = lm_message_node_get_attribute (child, "var");
-
-      if (NULL == var)
-        continue;
-
-      if (!tp_strdiff (var, NS_FILE_TRANSFER))
+      if (!tp_strdiff (*i, NS_FILE_TRANSFER))
         return SOME_NON_NULL_POINTER;
     }
 
diff --git a/src/presence-cache.c b/src/presence-cache.c
index 191594b..df24821 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -1013,9 +1013,36 @@ find_matching_waiter (GSList *waiters,
   return NULL;
 }
 
+static gchar **
+extract_capability_namespaces (LmMessageNode *query_result)
+{
+  GPtrArray *uris = g_ptr_array_new ();
+  NodeIter i;
+
+  for (i = node_iter (query_result); i; i = node_iter_next (i))
+    {
+      LmMessageNode *child = node_iter_data (i);
+      const gchar *var;
+
+      if (0 != strcmp (child->name, "feature"))
+        continue;
+
+      var = lm_message_node_get_attribute (child, "var");
+
+      if (NULL == var)
+        continue;
+
+      g_ptr_array_add (uris, g_strdup (var));
+    }
+
+  g_ptr_array_add (uris, NULL);
+  return (gchar **) g_ptr_array_free (uris, FALSE);
+}
+
 static GHashTable *
-parse_contact_caps (TpBaseConnection *base_conn,
-    LmMessageNode *query_result)
+parse_contact_caps (
+    TpBaseConnection *base_conn,
+    gchar **uris)
 {
   GHashTable *per_channel_manager_caps = g_hash_table_new (NULL, NULL);
   TpChannelManagerIter iter;
@@ -1031,7 +1058,7 @@ parse_contact_caps (TpBaseConnection *base_conn,
       g_assert (GABBLE_IS_CAPS_CHANNEL_MANAGER (manager));
 
       factory_caps = gabble_caps_channel_manager_parse_capabilities (
-          GABBLE_CAPS_CHANNEL_MANAGER (manager), query_result);
+          GABBLE_CAPS_CHANNEL_MANAGER (manager), uris);
 
       if (factory_caps != NULL)
         g_hash_table_insert (per_channel_manager_caps,
@@ -1120,6 +1147,7 @@ _caps_disco_cb (GabbleDisco *disco,
   TpBaseConnection *base_conn;
   gchar *resource;
   gboolean jid_is_valid;
+  gchar **uris = NULL;
 
   cache = GABBLE_PRESENCE_CACHE (user_data);
   priv = GABBLE_PRESENCE_CACHE_PRIV (cache);
@@ -1165,7 +1193,8 @@ _caps_disco_cb (GabbleDisco *disco,
     }
 
   caps = capabilities_parse (query_result);
-  per_channel_manager_caps = parse_contact_caps (base_conn, query_result);
+  uris = extract_capability_namespaces (query_result);
+  per_channel_manager_caps = parse_contact_caps (base_conn, uris);
 
   /* Only 'sha-1' is mandatory to implement by XEP-0115. If the remote contact
    * uses another hash algorithm, don't check the hash and fallback to the old
@@ -1260,6 +1289,8 @@ _caps_disco_cb (GabbleDisco *disco,
     }
 
 OUT:
+  g_strfreev (uris);
+
   if (handle)
     tp_handle_unref (contact_repo, handle);
 }
diff --git a/src/private-tubes-factory.c b/src/private-tubes-factory.c
index 67cf433..1607fae 100644
--- a/src/private-tubes-factory.c
+++ b/src/private-tubes-factory.c
@@ -661,10 +661,10 @@ gabble_private_tubes_factory_free_feat (gpointer data)
 static gpointer
 gabble_private_tubes_factory_parse_caps (
     GabbleCapsChannelManager *manager,
-    LmMessageNode *query_result)
+    gchar **uris)
 {
   TubesCapabilities *caps;
-  NodeIter i;
+  gchar **i;
 
   caps = g_new0 (TubesCapabilities, 1);
   caps->stream_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal,
@@ -672,41 +672,32 @@ gabble_private_tubes_factory_parse_caps (
   caps->dbus_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal,
       g_free, gabble_private_tubes_factory_free_feat);
 
-  for (i = node_iter (query_result); i; i = node_iter_next (i))
+  for (i = uris; *i; i++)
     {
-      LmMessageNode *child = node_iter_data (i);
-      const gchar *var;
+      const gchar *uri = *i;
 
-      if (0 != strcmp (child->name, "feature"))
-        continue;
-
-      var = lm_message_node_get_attribute (child, "var");
-
-      if (NULL == var)
-        continue;
-
-      if (!g_str_has_prefix (var, NS_TUBES))
+      if (!g_str_has_prefix (uri, NS_TUBES))
         continue;
 
       /* tubes generic cap or service specific */
       caps->tubes_supported = TRUE;
 
-      if (g_str_has_prefix (var, NS_TUBES "/"))
+      if (g_str_has_prefix (uri, NS_TUBES "/"))
         {
           /* http://telepathy.freedesktop.org/xmpp/tubes/$type#$service */
-          var += strlen (NS_TUBES "/");
-          if (g_str_has_prefix (var, "stream#"))
+          uri += strlen (NS_TUBES "/");
+          if (g_str_has_prefix (uri, "stream#"))
             {
               gchar *service;
-              var += strlen ("stream#");
-              service = g_strdup (var);
+              uri += strlen ("stream#");
+              service = g_strdup (uri);
               g_hash_table_insert (caps->stream_tube_caps, service, NULL);
             }
-          else if (g_str_has_prefix (var, "dbus#"))
+          else if (g_str_has_prefix (uri, "dbus#"))
             {
               gchar *service;
-              var += strlen ("dbus#");
-              service = g_strdup (var);
+              uri += strlen ("dbus#");
+              service = g_strdup (uri);
               g_hash_table_insert (caps->dbus_tube_caps, service, NULL);
             }
         }
-- 
1.5.6.5




More information about the telepathy-commits mailing list