[telepathy-gabble/master] gabble_capability_set_intersect: add

Simon McVittie simon.mcvittie at collabora.co.uk
Mon Aug 24 11:20:54 PDT 2009


---
 src/capabilities.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 src/capabilities.h |    2 ++
 2 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/src/capabilities.c b/src/capabilities.c
index a4bd6fd..0ce3565 100644
--- a/src/capabilities.c
+++ b/src/capabilities.c
@@ -439,6 +439,48 @@ gabble_capability_set_update (GabbleCapabilitySet *target,
   tp_handle_set_update (target->handles, tp_handle_set_peek (source->handles));
 }
 
+typedef struct {
+    GSList *deleted;
+    TpHandleSet *intersect_with;
+} IntersectHelper;
+
+static void
+intersect_helper (TpHandleSet *unused G_GNUC_UNUSED,
+    TpHandle handle,
+    gpointer p)
+{
+  IntersectHelper *data = p;
+
+  if (!tp_handle_set_is_member (data->intersect_with, handle))
+    data->deleted = g_slist_prepend (data->deleted, GUINT_TO_POINTER (handle));
+}
+
+void
+gabble_capability_set_intersect (GabbleCapabilitySet *target,
+    const GabbleCapabilitySet *source)
+{
+  IntersectHelper data = { NULL, NULL };
+
+  g_return_if_fail (target != NULL);
+  g_return_if_fail (source != NULL);
+
+  if (target == source)
+    return;
+
+  data.intersect_with = source->handles;
+
+  tp_handle_set_foreach (target->handles, intersect_helper, &data);
+
+  while (data.deleted != NULL)
+    {
+      DEBUG ("dropping %s", tp_handle_inspect (feature_handles,
+            GPOINTER_TO_UINT (data.deleted->data)));
+      tp_handle_set_remove (target->handles,
+          GPOINTER_TO_UINT (data.deleted->data));
+      data.deleted = g_slist_delete_link (data.deleted, data.deleted);
+    }
+}
+
 static void
 remove_from_set (TpHandleSet *unused G_GNUC_UNUSED,
     TpHandle handle,
diff --git a/src/capabilities.h b/src/capabilities.h
index 2f11e88..b834422 100644
--- a/src/capabilities.h
+++ b/src/capabilities.h
@@ -69,6 +69,8 @@ gboolean gabble_capability_set_remove (GabbleCapabilitySet *caps,
     const gchar *cap);
 void gabble_capability_set_exclude (GabbleCapabilitySet *caps,
     const GabbleCapabilitySet *removed);
+void gabble_capability_set_intersect (GabbleCapabilitySet *target,
+    const GabbleCapabilitySet *source);
 gboolean gabble_capability_set_has (const GabbleCapabilitySet *caps,
     const gchar *cap);
 gboolean gabble_capability_set_has_one (const GabbleCapabilitySet *caps,
-- 
1.5.6.5




More information about the telepathy-commits mailing list