[telepathy-gabble/master] Add gabble_capability_set_at_least () and GabbleCapabilitySetPredicate typedef

Simon McVittie simon.mcvittie at collabora.co.uk
Tue Sep 8 04:10:03 PDT 2009


gabble_capability_set_at_least (A, B) == (A ⊇ B).

GabbleCapabilitySetPredicate is a generic test of whether a cap set meets
some parameterized criterion; g_c_s_has and g_c_s_at_least are suitable,
so add macros that cast them to GabbleCapabilitySetPredicate for
convenience.
---
 src/capabilities.c |   24 ++++++++++++++++++++++++
 src/capabilities.h |   12 ++++++++++++
 2 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/src/capabilities.c b/src/capabilities.c
index 52b7848..35c4dcc 100644
--- a/src/capabilities.c
+++ b/src/capabilities.c
@@ -379,6 +379,7 @@ gabble_capability_set_free (GabbleCapabilitySet *caps)
   g_slice_free (GabbleCapabilitySet, caps);
 }
 
+/* By design, this function can be used as a GabbleCapabilitySetPredicate */
 gboolean
 gabble_capability_set_has (const GabbleCapabilitySet *caps,
     const gchar *cap)
@@ -399,6 +400,29 @@ gabble_capability_set_has (const GabbleCapabilitySet *caps,
   return tp_handle_set_is_member (caps->handles, handle);
 }
 
+/* By design, this function can be used as a GabbleCapabilitySetPredicate */
+gboolean
+gabble_capability_set_at_least (const GabbleCapabilitySet *caps,
+    const GabbleCapabilitySet *query)
+{
+  TpIntSetIter iter;
+
+  g_return_val_if_fail (caps != NULL, FALSE);
+  g_return_val_if_fail (query != NULL, FALSE);
+
+  tp_intset_iter_init (&iter, tp_handle_set_peek (query->handles));
+
+  while (tp_intset_iter_next (&iter))
+    {
+      if (!tp_handle_set_is_member (caps->handles, iter.element))
+        {
+          return FALSE;
+        }
+    }
+
+  return TRUE;
+}
+
 gboolean
 gabble_capability_set_equals (const GabbleCapabilitySet *a,
     const GabbleCapabilitySet *b)
diff --git a/src/capabilities.h b/src/capabilities.h
index 491eba4..74972a8 100644
--- a/src/capabilities.h
+++ b/src/capabilities.h
@@ -60,6 +60,8 @@ void gabble_capability_set_add (GabbleCapabilitySet *caps,
     const gchar *cap);
 gboolean gabble_capability_set_has (const GabbleCapabilitySet *caps,
     const gchar *cap);
+gboolean gabble_capability_set_at_least (const GabbleCapabilitySet *caps,
+    const GabbleCapabilitySet *query);
 gboolean gabble_capability_set_equals (const GabbleCapabilitySet *a,
     const GabbleCapabilitySet *b);
 void gabble_capability_set_clear (GabbleCapabilitySet *caps);
@@ -67,6 +69,16 @@ void gabble_capability_set_free (GabbleCapabilitySet *caps);
 void gabble_capability_set_foreach (const GabbleCapabilitySet *caps,
     GFunc func, gpointer user_data);
 
+/* A predicate used by the presence code to select suitable resources */
+typedef gboolean (*GabbleCapabilitySetPredicate) (
+    const GabbleCapabilitySet *set, gpointer user_data);
+/* These two functions are compatible with GabbleCapabilitySetPredicate;
+ * pass in the desired capabilities as the user_data */
+#define gabble_capability_set_predicate_has \
+  ((GabbleCapabilitySetPredicate) gabble_capability_set_has)
+#define gabble_capability_set_predicate_at_least \
+  ((GabbleCapabilitySetPredicate) gabble_capability_set_at_least)
+
 /* XEP-0115 version 1.3:
  *
  * "The names of the feature bundles MUST NOT be used for semantic purposes:
-- 
1.5.6.5




More information about the telepathy-commits mailing list