[telepathy-gabble/master] Return an array from get_handle_ccs and build_contact_caps

Will Thompson will.thompson at collabora.co.uk
Wed Sep 30 05:51:22 PDT 2009


Creating a new array and passing it in to be filled with caps was pretty
weird, and made it hard to distinguish between "no caps" and "don't
know".
---
 src/connection.c |   59 ++++++++++++++++++++++++-----------------------------
 1 files changed, 27 insertions(+), 32 deletions(-)

diff --git a/src/connection.c b/src/connection.c
index 4eaf13d..0f982f9 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -2410,18 +2410,19 @@ static void gabble_free_enhanced_contact_capabilities (GPtrArray *caps);
  * gabble_connection_build_contact_caps:
  * @handle: a contact
  * @caps: @handle's XMPP capabilities
- * @arr: an array to fill with the channel classes corresponding to @caps.
+ *
+ * Returns: an array containing the channel classes corresponding to @caps.
  */
-static void
+static GPtrArray *
 gabble_connection_build_contact_caps (
     GabbleConnection *self,
     TpHandle handle,
-    const GabbleCapabilitySet *caps,
-    GPtrArray *arr)
+    const GabbleCapabilitySet *caps)
 {
   TpBaseConnection *base_conn = TP_BASE_CONNECTION (self);
   TpChannelManagerIter iter;
   TpChannelManager *manager;
+  GPtrArray *ret = g_ptr_array_new ();
 
   tp_base_connection_channel_manager_iter_init (&iter, base_conn);
 
@@ -2431,8 +2432,10 @@ gabble_connection_build_contact_caps (
       g_assert (GABBLE_IS_CAPS_CHANNEL_MANAGER (manager));
 
       gabble_caps_channel_manager_get_contact_capabilities (
-          GABBLE_CAPS_CHANNEL_MANAGER (manager), handle, caps, arr);
+          GABBLE_CAPS_CHANNEL_MANAGER (manager), handle, caps, ret);
     }
+
+  return ret;
 }
 
 static void
@@ -2503,10 +2506,7 @@ _emit_capabilities_changed (GabbleConnection *conn,
   g_ptr_array_free (caps_arr, TRUE);
 
   /* o.f.T.C.ContactCapabilities */
-
-  caps_arr = g_ptr_array_new ();
-
-  gabble_connection_build_contact_caps (conn, handle, new_set, caps_arr);
+  caps_arr = gabble_connection_build_contact_caps (conn, handle, new_set);
 
   hash = g_hash_table_new (NULL, NULL);
   g_hash_table_insert (hash, GUINT_TO_POINTER (handle), caps_arr);
@@ -2519,17 +2519,20 @@ _emit_capabilities_changed (GabbleConnection *conn,
 }
 
 /**
- * gabble_connection_get_handle_contact_capabilities
+ * gabble_connection_get_handle_contact_capabilities:
  *
- * Add capabilities of handle to the given GPtrArray
+ * Returns: a set of channel classes representing @handle's capabilities, or
+ *          %NULL if unknown.
  */
-static void
-gabble_connection_get_handle_contact_capabilities (GabbleConnection *self,
-  TpHandle handle, GPtrArray *arr)
+static GPtrArray *
+gabble_connection_get_handle_contact_capabilities (
+    GabbleConnection *self,
+    TpHandle handle)
 {
   TpBaseConnection *base_conn = TP_BASE_CONNECTION (self);
   GabblePresence *p;
   GabbleCapabilitySet *caps;
+  GPtrArray *arr;
 
   if (handle == base_conn->self_handle)
     p = self->self_presence;
@@ -2539,14 +2542,13 @@ gabble_connection_get_handle_contact_capabilities (GabbleConnection *self,
   if (p == NULL)
     {
       DEBUG ("don't know %u's presence; no caps for them.", handle);
-      return;
+      return NULL;
     }
 
   caps = gabble_presence_dup_caps (p);
-
-  gabble_connection_build_contact_caps (self, handle, caps, arr);
-
+  arr = gabble_connection_build_contact_caps (self, handle, caps);
   gabble_capability_set_free (caps);
+  return arr;
 }
 
 static void
@@ -2910,18 +2912,15 @@ conn_contact_capabilities_fill_contact_attributes (GObject *obj,
 {
   GabbleConnection *self = GABBLE_CONNECTION (obj);
   guint i;
-  GPtrArray *array = NULL;
 
   for (i = 0; i < contacts->len; i++)
     {
       TpHandle handle = g_array_index (contacts, TpHandle, i);
+      GPtrArray *array;
 
-      if (array == NULL)
-        array = g_ptr_array_new ();
-
-      gabble_connection_get_handle_contact_capabilities (self, handle, array);
+      array = gabble_connection_get_handle_contact_capabilities (self, handle);
 
-      if (array->len > 0)
+      if (array != NULL)
         {
           GValue *val =  tp_g_value_slice_new (
             TP_ARRAY_TYPE_REQUESTABLE_CHANNEL_CLASS_LIST);
@@ -2931,13 +2930,8 @@ conn_contact_capabilities_fill_contact_attributes (GObject *obj,
               handle,
               TP_IFACE_CONNECTION_INTERFACE_CONTACT_CAPABILITIES"/caps",
               val);
-
-          array = NULL;
         }
     }
-
-    if (array != NULL)
-      g_ptr_array_free (array, TRUE);
 }
 
 /**
@@ -3023,12 +3017,13 @@ gabble_connection_get_contact_capabilities (
 
   for (i = 0; i < handles->len; i++)
     {
-      GPtrArray *arr = g_ptr_array_new ();
+      GPtrArray *arr;
       TpHandle handle = g_array_index (handles, TpHandle, i);
 
-      gabble_connection_get_handle_contact_capabilities (self, handle, arr);
+      arr = gabble_connection_get_handle_contact_capabilities (self, handle);
 
-      g_hash_table_insert (ret, GUINT_TO_POINTER (handle), arr);
+      if (arr != NULL)
+        g_hash_table_insert (ret, GUINT_TO_POINTER (handle), arr);
     }
 
   tp_svc_connection_interface_contact_capabilities_return_from_get_contact_capabilities
-- 
1.5.6.5




More information about the telepathy-commits mailing list