[telepathy-gabble/master] Add API for storing a set of capabilities

Will Thompson will.thompson at collabora.co.uk
Tue Sep 8 04:09:59 PDT 2009


Currently the capabilities are just strings; this will probably change
to be something like a quark.
---
 src/capabilities.c |  100 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/capabilities.h |   21 +++++++++++
 2 files changed, 121 insertions(+), 0 deletions(-)

diff --git a/src/capabilities.c b/src/capabilities.c
index 29f5d3f..2f17d40 100644
--- a/src/capabilities.c
+++ b/src/capabilities.c
@@ -221,3 +221,103 @@ const CapabilityConversionData capabilities_conversions[] =
   { NULL, NULL, NULL}
 };
 
+GabbleCapabilitySet *
+gabble_capability_set_new (void)
+{
+  return g_ptr_array_new ();
+}
+
+GabbleCapabilitySet *
+gabble_capability_set_copy (const GabbleCapabilitySet *caps)
+{
+  GabbleCapabilitySet *ret;
+
+  g_return_val_if_fail (caps != NULL, NULL);
+
+  ret = gabble_capability_set_new ();
+
+  gabble_capability_set_update (ret, caps);
+
+  return ret;
+}
+
+void
+gabble_capability_set_update (GabbleCapabilitySet *target,
+    const GabbleCapabilitySet *source)
+{
+  guint i;
+
+  g_return_if_fail (target != NULL);
+  g_return_if_fail (source != NULL);
+
+  for (i = 0; i < source->len; i++)
+    gabble_capability_set_add (target, g_ptr_array_index (source, i));
+}
+
+void
+gabble_capability_set_add (GabbleCapabilitySet *caps,
+    const gchar *cap)
+{
+  g_return_if_fail (caps != NULL);
+  g_return_if_fail (cap != NULL);
+
+  if (!gabble_capability_set_has (caps, cap))
+    g_ptr_array_add (caps, g_strdup (cap));
+}
+
+void
+gabble_capability_set_clear (GabbleCapabilitySet *caps)
+{
+  guint i;
+
+  g_return_if_fail (caps != NULL);
+
+  for (i = 0; i < caps->len; i++)
+    g_free (g_ptr_array_index (caps, i));
+
+  g_ptr_array_set_size (caps, 0);
+}
+
+void
+gabble_capability_set_free (GabbleCapabilitySet *caps)
+{
+  g_return_if_fail (caps != NULL);
+
+  gabble_capability_set_clear (caps);
+  g_ptr_array_free (caps, TRUE);
+}
+
+gboolean
+gabble_capability_set_has (const GabbleCapabilitySet *caps,
+    const gchar *cap)
+{
+  guint i;
+
+  g_return_val_if_fail (caps != NULL, FALSE);
+  g_return_val_if_fail (cap != NULL, FALSE);
+
+  for (i = 0; i < caps->len; i++)
+    if (!strcmp (g_ptr_array_index (caps, i), cap))
+      return TRUE;
+
+  return FALSE;
+}
+
+gboolean
+gabble_capability_set_equals (const GabbleCapabilitySet *a,
+    const GabbleCapabilitySet *b)
+{
+  guint i;
+
+  g_return_val_if_fail (a != NULL, FALSE);
+  g_return_val_if_fail (b != NULL, FALSE);
+
+  if (a->len != b->len)
+    return FALSE;
+
+  for (i = 0; i < a->len; i++)
+    if (!gabble_capability_set_has (b, g_ptr_array_index (a, i)))
+      return FALSE;
+
+  return TRUE;
+}
diff --git a/src/capabilities.h b/src/capabilities.h
index 5794133..37289eb 100644
--- a/src/capabilities.h
+++ b/src/capabilities.h
@@ -50,6 +50,27 @@ struct _Feature
   GabblePresenceCapabilities caps;
 };
 
+/**
+ * GabbleCapabilitySet:
+ *
+ * A GPtrArray of gchar *, treated as a set.
+ */
+typedef GPtrArray GabbleCapabilitySet;
+
+GabbleCapabilitySet *gabble_capability_set_new (void);
+GabbleCapabilitySet *gabble_capability_set_copy (
+    const GabbleCapabilitySet *caps);
+void gabble_capability_set_update (GabbleCapabilitySet *target,
+    const GabbleCapabilitySet *source);
+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_equals (const GabbleCapabilitySet *a,
+    const GabbleCapabilitySet *b);
+void gabble_capability_set_clear (GabbleCapabilitySet *caps);
+void gabble_capability_set_free (GabbleCapabilitySet *caps);
+
 /*
  * capabilities_get_features
  *
-- 
1.5.6.5




More information about the telepathy-commits mailing list