[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