[telepathy-gabble/master] Add gabble_presence_peek_caps() to avoid copying

Will Thompson will.thompson at collabora.co.uk
Wed Oct 7 10:09:03 PDT 2009


---
 src/caps-hash.c      |    7 +++----
 src/connection.c     |   22 +++++++---------------
 src/presence-cache.c |   16 +++++++---------
 src/presence.c       |    7 +++++++
 src/presence.h       |    1 +
 5 files changed, 25 insertions(+), 28 deletions(-)

diff --git a/src/caps-hash.c b/src/caps-hash.c
index d771345..c42fb4e 100644
--- a/src/caps-hash.c
+++ b/src/caps-hash.c
@@ -365,7 +365,7 @@ gchar *
 caps_hash_compute_from_self_presence (GabbleConnection *self)
 {
   GabblePresence *presence = self->self_presence;
-  GabbleCapabilitySet *cap_set;
+  const GabbleCapabilitySet *cap_set;
   GPtrArray *features = g_ptr_array_new ();
   GPtrArray *identities = g_ptr_array_new ();
   GPtrArray *dataforms = g_ptr_array_new ();
@@ -376,10 +376,9 @@ caps_hash_compute_from_self_presence (GabbleConnection *self)
 
   /* Gabble does not use dataforms, let 'dataforms' be empty */
 
-  /* FIXME: somehow allow iteration over this without copying twice */
-  cap_set = gabble_presence_dup_caps (presence);
+  /* FIXME: allow iteration over the strings without copying */
+  cap_set = gabble_presence_peek_caps (presence);
   gabble_capability_set_foreach (cap_set, ptr_array_strdup, features);
-  gabble_capability_set_free (cap_set);
 
   str = caps_hash_compute (features, identities, dataforms);
 
diff --git a/src/connection.c b/src/connection.c
index 66d76d5..f2bad01 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -2155,7 +2155,7 @@ connection_iq_disco_cb (LmMessageHandler *handler,
   LmMessage *result;
   LmMessageNode *iq, *result_iq, *query, *result_query, *identity;
   const gchar *node, *suffix;
-  GabbleCapabilitySet *features;
+  const GabbleCapabilitySet *features;
   gchar *caps_hash;
 
   if (lm_message_get_sub_type (message) != LM_MESSAGE_SUB_TYPE_GET)
@@ -2207,15 +2207,12 @@ connection_iq_disco_cb (LmMessageHandler *handler,
   /* If node is not NULL, it can be either a caps bundle as defined in the
    * legacy XEP-0115 version 1.3 or an hash as defined in XEP-0115 version
    * 1.5. */
-  /* FIXME: We shouldn't have to copy the sets here */
   if (node == NULL || !tp_strdiff (suffix, caps_hash))
-    features = gabble_presence_dup_caps (self->self_presence);
+    features = gabble_presence_peek_caps (self->self_presence);
   else if (!tp_strdiff (suffix, BUNDLE_VOICE_V1))
-    features = gabble_capability_set_copy (
-        gabble_capabilities_get_bundle_voice_v1 ());
+    features = gabble_capabilities_get_bundle_voice_v1 ();
   else if (!tp_strdiff (suffix, BUNDLE_VIDEO_V1))
-    features = gabble_capability_set_copy (
-        gabble_capabilities_get_bundle_video_v1 ());
+    features = gabble_capabilities_get_bundle_video_v1 ();
   else
     features = NULL;
 
@@ -2239,8 +2236,6 @@ connection_iq_disco_cb (LmMessageHandler *handler,
         {
           DEBUG ("sending disco response failed");
         }
-
-      gabble_capability_set_free (features);
     }
 
   g_free (caps_hash);
@@ -2534,7 +2529,7 @@ gabble_connection_get_handle_contact_capabilities (
 {
   TpBaseConnection *base_conn = TP_BASE_CONNECTION (self);
   GabblePresence *p;
-  GabbleCapabilitySet *caps;
+  const GabbleCapabilitySet *caps;
   GPtrArray *arr;
 
   if (handle == base_conn->self_handle)
@@ -2548,9 +2543,8 @@ gabble_connection_get_handle_contact_capabilities (
       return NULL;
     }
 
-  caps = gabble_presence_dup_caps (p);
+  caps = gabble_presence_peek_caps (p);
   arr = gabble_connection_build_contact_caps (self, handle, caps);
-  gabble_capability_set_free (caps);
   return arr;
 }
 
@@ -2809,7 +2803,7 @@ gabble_connection_get_handle_capabilities (GabbleConnection *self,
 
   if (NULL != pres)
     {
-      GabbleCapabilitySet *cap_set = gabble_presence_dup_caps (pres);
+      const GabbleCapabilitySet *cap_set = gabble_presence_peek_caps (pres);
 
       for (ccd = capabilities_conversions; NULL != ccd->iface; ccd++)
         {
@@ -2835,8 +2829,6 @@ gabble_connection_get_handle_capabilities (GabbleConnection *self,
               g_ptr_array_add (arr, g_value_get_boxed (&monster));
             }
         }
-
-      gabble_capability_set_free (cap_set);
     }
 
   for (assumed = assumed_caps; NULL != *assumed; assumed++)
diff --git a/src/presence-cache.c b/src/presence-cache.c
index fb5c3b5..b99ec47 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -941,7 +941,7 @@ set_caps_for (DiscoWaiter *waiter,
 {
   GabblePresence *presence = gabble_presence_cache_get (cache, waiter->handle);
   GabbleCapabilitySet *old_cap_set;
-  GabbleCapabilitySet *new_cap_set;
+  const GabbleCapabilitySet *new_cap_set;
 
   if (presence == NULL)
     return;
@@ -954,12 +954,11 @@ set_caps_for (DiscoWaiter *waiter,
   gabble_presence_set_capabilities (presence, waiter->resource, cap_set,
       waiter->serial);
 
-  new_cap_set = gabble_presence_dup_caps (presence);
+  new_cap_set = gabble_presence_peek_caps (presence);
 
   emit_capabilities_update (cache, waiter->handle, old_cap_set, new_cap_set);
 
   gabble_capability_set_free (old_cap_set);
-  gabble_capability_set_free (new_cap_set);
 }
 
 static void
@@ -1278,7 +1277,8 @@ _process_caps (GabblePresenceCache *cache,
 
   if (presence)
     {
-      GabbleCapabilitySet *new_cap_set = gabble_presence_dup_caps (presence);
+      const GabbleCapabilitySet *new_cap_set =
+          gabble_presence_peek_caps (presence);
 
       if (DEBUGGING)
         {
@@ -1292,8 +1292,6 @@ _process_caps (GabblePresenceCache *cache,
         }
 
       emit_capabilities_update (cache, handle, old_cap_set, new_cap_set);
-
-      gabble_capability_set_free (new_cap_set);
     }
   else
     {
@@ -1579,7 +1577,8 @@ gabble_presence_cache_do_update (
       (TpBaseConnection *) priv->conn, TP_HANDLE_TYPE_CONTACT);
   const gchar *jid;
   GabblePresence *presence;
-  GabbleCapabilitySet *old_cap_set, *new_cap_set;
+  GabbleCapabilitySet *old_cap_set;
+  const GabbleCapabilitySet *new_cap_set;
   gboolean ret = FALSE;
 
   jid = tp_handle_inspect (contact_repo, handle);
@@ -1599,12 +1598,11 @@ gabble_presence_cache_do_update (
   ret = gabble_presence_update (presence, resource, presence_id,
       status_message, priority);
 
-  new_cap_set = gabble_presence_dup_caps (presence);
+  new_cap_set = gabble_presence_peek_caps (presence);
 
   emit_capabilities_update (cache, handle, old_cap_set, new_cap_set);
 
   gabble_capability_set_free (old_cap_set);
-  gabble_capability_set_free (new_cap_set);
 
   return ret;
 }
diff --git a/src/presence.c b/src/presence.c
index 8b3efba..19a1df1 100644
--- a/src/presence.c
+++ b/src/presence.c
@@ -166,6 +166,13 @@ gabble_presence_dup_caps (GabblePresence *presence)
   return gabble_capability_set_copy (presence->priv->cap_set);
 }
 
+const GabbleCapabilitySet *
+gabble_presence_peek_caps (GabblePresence *presence)
+{
+  g_return_val_if_fail (presence != NULL, NULL);
+  return presence->priv->cap_set;
+}
+
 const gchar *
 gabble_presence_pick_resource_by_caps (
     GabblePresence *presence,
diff --git a/src/presence.h b/src/presence.h
index b232245..b1422b2 100644
--- a/src/presence.h
+++ b/src/presence.h
@@ -85,6 +85,7 @@ void gabble_presence_set_capabilities (GabblePresence *presence,
 
 gboolean gabble_presence_has_cap (GabblePresence *presence, const gchar *ns);
 GabbleCapabilitySet *gabble_presence_dup_caps (GabblePresence *presence);
+const GabbleCapabilitySet *gabble_presence_peek_caps (GabblePresence *presence);
 
 const gchar *gabble_presence_pick_resource_by_caps (GabblePresence *presence,
     GabbleCapabilitySetPredicate predicate, gconstpointer user_data);
-- 
1.5.6.5




More information about the telepathy-commits mailing list