[telepathy-gabble/master] Construct contact capabilities from caps sets

Will Thompson will.thompson at collabora.co.uk
Tue Sep 8 04:10:01 PDT 2009


Modify gabble_caps_channel_manager_get_contact_capabilities () to be in
terms of GabbleCapabilitySets, ignoring the per_channel_manager_caps
hash table, and update the GetContactCapabilities and
ContactCapabilitiesChanged implementations accordingly.
---
 src/caps-channel-manager.c  |    7 ++--
 src/caps-channel-manager.h  |    8 +++-
 src/connection.c            |   14 +++++++-
 src/ft-manager.c            |   33 ++++-------------
 src/im-factory.c            |    6 ++--
 src/private-tubes-factory.c |   81 ++++++++++++------------------------------
 6 files changed, 57 insertions(+), 92 deletions(-)

diff --git a/src/caps-channel-manager.c b/src/caps-channel-manager.c
index f6cc60d..fac86aa 100644
--- a/src/caps-channel-manager.c
+++ b/src/caps-channel-manager.c
@@ -60,10 +60,11 @@ gabble_caps_channel_manager_get_type (void)
 
 /* Virtual-method wrappers */
 
-void gabble_caps_channel_manager_get_contact_capabilities (
+void
+gabble_caps_channel_manager_get_contact_capabilities (
     GabbleCapsChannelManager *caps_manager,
-    GabbleConnection *conn,
     TpHandle handle,
+    const GabbleCapabilitySet *caps,
     GPtrArray *arr)
 {
   GabbleCapsChannelManagerIface *iface =
@@ -72,7 +73,7 @@ void gabble_caps_channel_manager_get_contact_capabilities (
 
   if (method != NULL)
     {
-      method (caps_manager, conn, handle, arr);
+      method (caps_manager, handle, caps, arr);
     }
   /* ... else assume there is not caps for this kind of channels */
 }
diff --git a/src/caps-channel-manager.h b/src/caps-channel-manager.h
index 75b2e9a..80298be 100644
--- a/src/caps-channel-manager.h
+++ b/src/caps-channel-manager.h
@@ -56,7 +56,9 @@ typedef struct _GabbleCapsChannelManagerIface GabbleCapsChannelManagerIface;
 
 /* May be moved to TpChannelManager later */
 typedef void (*GabbleCapsChannelManagerGetContactCapsFunc) (
-    GabbleCapsChannelManager *manager, GabbleConnection *conn, TpHandle handle,
+    GabbleCapsChannelManager *manager,
+    TpHandle handle,
+    const GabbleCapabilitySet *caps,
     GPtrArray *arr);
 
 typedef void (*GabbleCapsChannelManagerAddCapFunc) (
@@ -88,7 +90,9 @@ typedef gboolean (*GabbleCapsChannelManagerCapsDiffFunc) (
 
 
 void gabble_caps_channel_manager_get_contact_capabilities (
-    GabbleCapsChannelManager *manager, GabbleConnection *conn, TpHandle handle,
+    GabbleCapsChannelManager *caps_manager,
+    TpHandle handle,
+    const GabbleCapabilitySet *caps,
     GPtrArray *arr);
 
 void gabble_caps_channel_manager_get_feature_list (
diff --git a/src/connection.c b/src/connection.c
index c06d5bb..6b7a0f4 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -2336,18 +2336,30 @@ gabble_connection_get_handle_contact_capabilities (GabbleConnection *self,
   TpHandle handle, GPtrArray *arr)
 {
   TpBaseConnection *base_conn = TP_BASE_CONNECTION (self);
+  GabblePresence *p;
+  GabbleCapabilitySet *caps;
   TpChannelManagerIter iter;
   TpChannelManager *manager;
 
+  if (handle == base_conn->self_handle)
+    p = self->self_presence;
+  else
+    p = gabble_presence_cache_get (self->presence_cache, handle);
+
+  caps = gabble_presence_get_caps (p);
+
   tp_base_connection_channel_manager_iter_init (&iter, base_conn);
+
   while (tp_base_connection_channel_manager_iter_next (&iter, &manager))
     {
       /* all channel managers must implement the capability interface */
       g_assert (GABBLE_IS_CAPS_CHANNEL_MANAGER (manager));
 
       gabble_caps_channel_manager_get_contact_capabilities (
-          GABBLE_CAPS_CHANNEL_MANAGER (manager), self, handle, arr);
+          GABBLE_CAPS_CHANNEL_MANAGER (manager), handle, caps, arr);
     }
+
+  gabble_capability_set_free (caps);
 }
 
 static void
diff --git a/src/ft-manager.c b/src/ft-manager.c
index a0d5d40..13abe9c 100644
--- a/src/ft-manager.c
+++ b/src/ft-manager.c
@@ -642,35 +642,18 @@ add_file_transfer_channel_class (GPtrArray *arr,
 
 static void
 gabble_ft_manager_get_contact_caps (GabbleCapsChannelManager *manager,
-                                    GabbleConnection *conn,
-                                    TpHandle handle,
-                                    GPtrArray *arr)
+    TpHandle handle,
+    const GabbleCapabilitySet *caps,
+    GPtrArray *arr)
 {
-  TpBaseConnection *base = (TpBaseConnection *) conn;
-  GabblePresence *presence;
+  GabbleFtManager *self = GABBLE_FT_MANAGER (manager);
 
   g_assert (handle != 0);
 
-  if (handle == base->self_handle)
-    {
-      /* We support file transfer */
-      add_file_transfer_channel_class (arr, handle);
-      return;
-    }
-
- presence = gabble_presence_cache_get (conn->presence_cache, handle);
- if (presence == NULL)
-   return;
-
- if (presence->per_channel_manager_caps == NULL)
-   return;
-
- if (!GPOINTER_TO_INT (g_hash_table_lookup (presence->per_channel_manager_caps,
-         manager)))
-   return;
-
-  /* FT is supported */
-  add_file_transfer_channel_class (arr, handle);
+  /* We always support file transfer */
+  if (handle == self->priv->connection->parent.self_handle ||
+      gabble_capability_set_has (caps, NS_FILE_TRANSFER))
+    add_file_transfer_channel_class (arr, handle);
 }
 
 static gpointer
diff --git a/src/im-factory.c b/src/im-factory.c
index 0f09a88..8f5cccc 100644
--- a/src/im-factory.c
+++ b/src/im-factory.c
@@ -451,9 +451,9 @@ connection_status_changed_cb (GabbleConnection *conn,
 
 static void
 gabble_im_factory_get_contact_caps (GabbleCapsChannelManager *manager,
-                                    GabbleConnection *conn,
-                                    TpHandle handle,
-                                    GPtrArray *arr)
+    TpHandle handle,
+    const GabbleCapabilitySet *caps,
+    GPtrArray *arr)
 {
   /* We don't need to check this contact's capabilities, we assume every
    * contact support text channels. */
diff --git a/src/private-tubes-factory.c b/src/private-tubes-factory.c
index f23a291..c751100 100644
--- a/src/private-tubes-factory.c
+++ b/src/private-tubes-factory.c
@@ -416,7 +416,7 @@ gabble_private_tubes_factory_close_all (GabblePrivateTubesFactory *fac)
 }
 
 static void
-add_service_to_array (gchar *service,
+add_service_to_array (const gchar *service,
                       GPtrArray *arr,
                       TpTubeType type,
                       TpHandle handle)
@@ -545,77 +545,42 @@ add_generic_tube_caps (GPtrArray *arr)
   g_ptr_array_add (arr, g_value_get_boxed (&monster2));
 }
 
+#define STREAM_CAP_PREFIX (NS_TUBES "/stream#")
+#define DBUS_CAP_PREFIX (NS_TUBES "/dbus#")
+
 static void
 gabble_private_tubes_factory_get_contact_caps (
     GabbleCapsChannelManager *manager,
-    GabbleConnection *conn,
     TpHandle handle,
+    const GabbleCapabilitySet *caps,
     GPtrArray *arr)
 {
-  TpBaseConnection *base = (TpBaseConnection *) conn;
-  TubesCapabilities *caps;
-  GHashTable *stream_tube_caps;
-  GHashTable *dbus_tube_caps;
-  GabblePresence *presence;
-  GHashTableIter tube_caps_iter;
-  gpointer service;
-
-  g_assert (handle != 0);
-
-  if (handle == base->self_handle)
-    presence = conn->self_presence;
-  else
-    presence = gabble_presence_cache_get (conn->presence_cache, handle);
+  GabblePrivateTubesFactory *self = GABBLE_PRIVATE_TUBES_FACTORY (manager);
+  gboolean supports_tubes;
+  guint i;
 
-  if (presence == NULL)
-    return;
+  /* Always claim that we support tubes. */
+  supports_tubes = (handle == self->priv->conn->parent.self_handle);
 
-  if (handle == base->self_handle &&
-      (presence->per_channel_manager_caps == NULL ||
-       g_hash_table_lookup (presence->per_channel_manager_caps, manager)
-       == NULL))
+  for (i = 0; i < caps->len; i++)
     {
-      /* No tubes capabilities have been set but we always support at
-       * least generic tubes caps */
-      add_generic_tube_caps (arr);
-      return;
-    }
+      const gchar *ns = g_ptr_array_index (caps, i);
 
-  if (presence->per_channel_manager_caps == NULL)
-    return;
-
-  caps = g_hash_table_lookup (presence->per_channel_manager_caps, manager);
-
-  if (caps == NULL)
-    return;
-
-  if (!caps->tubes_supported)
-    return;
+      if (!g_str_has_prefix (ns, NS_TUBES))
+        continue;
 
-  add_generic_tube_caps (arr);
+      supports_tubes = TRUE;
 
-  stream_tube_caps = caps->stream_tube_caps;
-  dbus_tube_caps = caps->dbus_tube_caps;
-
-  if (stream_tube_caps != NULL)
-    {
-      g_hash_table_iter_init (&tube_caps_iter, stream_tube_caps);
-      while (g_hash_table_iter_next (&tube_caps_iter, &service,
-            NULL))
-        {
-          add_service_to_array (service, arr, TP_TUBE_TYPE_STREAM, handle);
-        }
+      if (g_str_has_prefix (ns, STREAM_CAP_PREFIX))
+        add_service_to_array (ns + strlen (STREAM_CAP_PREFIX), arr,
+            TP_TUBE_TYPE_STREAM, handle);
+      else if (g_str_has_prefix (ns, DBUS_CAP_PREFIX))
+        add_service_to_array (ns + strlen (DBUS_CAP_PREFIX), arr,
+            TP_TUBE_TYPE_DBUS, handle);
     }
 
-  if (dbus_tube_caps != NULL)
-    {
-      g_hash_table_iter_init (&tube_caps_iter, dbus_tube_caps);
-      while (g_hash_table_iter_next (&tube_caps_iter, &service,
-            NULL))
-        {
-          add_service_to_array (service, arr, TP_TUBE_TYPE_DBUS, handle);
-        }
-    }
+  if (supports_tubes)
+    add_generic_tube_caps (arr);
 }
 
 static void
-- 
1.5.6.5




More information about the telepathy-commits mailing list