[gcr] gck: add gck_attributes_set() and gck_attributes_set_all() functions



commit 07ac51b4f1c7268d807370cf63ab7de9c02d8ac1
Author: Stef Walter <stefw collabora co uk>
Date:   Thu Nov 17 11:28:02 2011 +0100

    gck: add gck_attributes_set() and gck_attributes_set_all() functions

 docs/reference/gck/gck-sections.txt |    3 +
 gck/gck-attributes.c                |   77 +++++++++++++++++++++++
 gck/gck.h                           |    8 +++
 gck/gck.symbols                     |    3 +
 gck/tests/test-gck-attributes.c     |  114 ++++++++++++++++++++++++++++++++---
 5 files changed, 197 insertions(+), 8 deletions(-)
---
diff --git a/docs/reference/gck/gck-sections.txt b/docs/reference/gck/gck-sections.txt
index 266d286..3fbeba8 100644
--- a/docs/reference/gck/gck-sections.txt
+++ b/docs/reference/gck/gck-sections.txt
@@ -47,10 +47,13 @@ gck_attributes_add_string
 gck_attributes_add_date
 gck_attributes_add_ulong
 gck_attributes_add_all
+gck_attributes_dup
+gck_attributes_set
 gck_attributes_set_boolean
 gck_attributes_set_string
 gck_attributes_set_date
 gck_attributes_set_ulong
+gck_attributes_set_all
 gck_attributes_find
 gck_attributes_find_boolean
 gck_attributes_find_ulong
diff --git a/gck/gck-attributes.c b/gck/gck-attributes.c
index bb3d513..b0d2738 100644
--- a/gck/gck-attributes.c
+++ b/gck/gck-attributes.c
@@ -893,6 +893,36 @@ gck_attributes_add (GckAttributes *attrs, GckAttribute *attr)
 }
 
 /**
+ * gck_attributes_set:
+ * @attrs: attributes array to add to
+ * @attr: attribute to set
+ *
+ * Set an attribute on the array.
+ *
+ * The value stored in the attribute will be copied.
+ *
+ * Returns: (transfer none): the attribute that was added
+ **/
+void
+gck_attributes_set (GckAttributes *attrs,
+                    GckAttribute *attr)
+{
+	GckAttribute *orig;
+
+	g_return_if_fail (attrs != NULL);
+	g_return_if_fail (!attrs->locked);
+	g_return_if_fail (attr != NULL);
+
+	orig = gck_attributes_find (attrs, attr->type);
+	if (orig == NULL) {
+		gck_attributes_add (attrs, attr);
+	} else {
+		attribute_clear (orig, attrs->allocator);
+		attribute_init_copy (orig, attr, attrs->allocator);
+	}
+}
+
+/**
  * gck_attributes_add_data:
  * @attrs: The attributes array to add to.
  * @attr_type: The type of attribute to add.
@@ -1186,6 +1216,31 @@ gck_attributes_add_all (GckAttributes *attrs, GckAttributes *from)
 	}
 }
 
+
+/**
+ * gck_attributes_set_all:
+ * @attrs: set of attributes
+ * @from: attributes to add
+ *
+ * Set all attributes in @from on @attrs.
+ */
+void
+gck_attributes_set_all (GckAttributes *attrs,
+                        GckAttributes *from)
+{
+	GckAttribute *attr;
+	guint i;
+
+	g_return_if_fail (attrs && attrs->array);
+	g_return_if_fail (from && from->array);
+	g_return_if_fail (!attrs->locked);
+
+	for (i = 0; i < from->array->len; ++i) {
+		attr = &g_array_index (from->array, GckAttribute, i);
+		gck_attributes_set (attrs, attr);
+	}
+}
+
 /**
  * gck_attributes_count:
  * @attrs: The attributes array to count.
@@ -1395,6 +1450,28 @@ gck_attributes_unref (gpointer attrs)
 }
 
 /**
+ * gck_attributes_dup:
+ * @attrs: an attribute array
+ *
+ * Make a complete copy of the attributes and all values.
+ *
+ * Returns: (transfer full): the copy
+ */
+GckAttributes *
+gck_attributes_dup (GckAttributes *attrs)
+{
+	GckAttributes *copy;
+
+	if (!attrs)
+		return NULL;
+
+	copy = gck_attributes_new_full (attrs->allocator);
+	gck_attributes_add_all (copy, attrs);
+
+	return copy;
+}
+
+/**
  * gck_attributes_contains:
  * @attrs: The attributes to check
  * @match: The attribute to find
diff --git a/gck/gck.h b/gck/gck.h
index ee6eacd..e8fe4ab 100644
--- a/gck/gck.h
+++ b/gck/gck.h
@@ -255,6 +255,9 @@ gboolean            gck_attributes_find_date                (GckAttributes *attr
                                                              gulong attr_type,
                                                              GDate *value);
 
+void                gck_attributes_set                      (GckAttributes *attrs,
+                                                             GckAttribute *attr);
+
 void                gck_attributes_set_boolean              (GckAttributes *attrs,
                                                              gulong attr_type,
                                                              gboolean value);
@@ -271,6 +274,9 @@ void                gck_attributes_set_date                 (GckAttributes *attr
                                                              gulong attr_type,
                                                              const GDate *value);
 
+void                gck_attributes_set_all                  (GckAttributes *attrs,
+                                                             GckAttributes *from);
+
 gulong              gck_attributes_count                    (GckAttributes *attrs);
 
 GckAttributes*      gck_attributes_ref                      (GckAttributes *attrs);
@@ -280,6 +286,8 @@ void                gck_attributes_unref                    (gpointer attrs);
 gboolean            gck_attributes_contains                 (GckAttributes *attrs,
                                                              GckAttribute *match);
 
+GckAttributes *     gck_attributes_dup                      (GckAttributes *attrs);
+
 void                gck_attributes_dump                     (GckAttributes *attrs);
 
 /* -------------------------------------------------------------------------
diff --git a/gck/gck.symbols b/gck/gck.symbols
index ceff776..7e87aa1 100644
--- a/gck/gck.symbols
+++ b/gck/gck.symbols
@@ -42,6 +42,7 @@ gck_attributes_at
 gck_attributes_contains
 gck_attributes_count
 gck_attributes_dump
+gck_attributes_dup
 gck_attributes_find
 gck_attributes_find_boolean
 gck_attributes_find_date
@@ -53,6 +54,8 @@ gck_attributes_new
 gck_attributes_new_empty
 gck_attributes_new_full
 gck_attributes_ref
+gck_attributes_set
+gck_attributes_set_all
 gck_attributes_set_boolean
 gck_attributes_set_date
 gck_attributes_set_string
diff --git a/gck/tests/test-gck-attributes.c b/gck/tests/test-gck-attributes.c
index 504844e..06a8b60 100644
--- a/gck/tests/test-gck-attributes.c
+++ b/gck/tests/test-gck-attributes.c
@@ -27,6 +27,7 @@
 #include <string.h>
 
 #include "gck/gck.h"
+#include "gck/gck-test.h"
 
 #define ATTR_TYPE 55
 #define ATTR_DATA "TEST DATA"
@@ -384,15 +385,17 @@ test_new_attributes (void)
 }
 
 static void
-test_attributes_contents (GckAttributes *attrs, gboolean extras)
+test_attributes_contents (GckAttributes *attrs,
+                          gboolean extras,
+                          gint count)
 {
 	GckAttribute *attr;
 	gchar *value;
 	GDate date, *check;
-	guint count;
 
 	g_assert (attrs != NULL);
-	count = extras ? 7 : 5;
+	if (count < 0)
+		count = extras ? 7 : 5;
 	g_assert_cmpuint (gck_attributes_count (attrs), ==, count);
 
 	attr = gck_attributes_at (attrs, 0);
@@ -401,7 +404,7 @@ test_attributes_contents (GckAttributes *attrs, gboolean extras)
 
 	attr = gck_attributes_at (attrs, 1);
 	g_assert (attr->type == 101);
-	g_assert (gck_attribute_get_ulong (attr) == 888);
+	gck_assert_cmpulong (gck_attribute_get_ulong (attr), ==, 888);
 
 	attr = gck_attributes_at (attrs, 2);
 	g_assert (attr->type == 202);
@@ -468,7 +471,7 @@ test_add_data_attributes (void)
 	gck_attributes_add_data (attrs, 404UL, (const guchar *)ATTR_DATA, N_ATTR_DATA);
 	gck_attributes_add_invalid (attrs, 505UL);
 	gck_attributes_add_empty (attrs, 606UL);
-	test_attributes_contents (attrs, TRUE);
+	test_attributes_contents (attrs, TRUE, -1);
 	gck_attributes_unref (attrs);
 }
 
@@ -509,7 +512,7 @@ test_add_attributes (void)
 	gck_attributes_add (attrs, &attr);
 	gck_attribute_clear (&attr);
 
-	test_attributes_contents (attrs, TRUE);
+	test_attributes_contents (attrs, TRUE, -1);
 	gck_attributes_unref (attrs);
 }
 
@@ -520,7 +523,6 @@ test_add_all_attributes (void)
 	GckAttributes *copy;
 	GDate *date = g_date_new_dmy (11, 12, 2008);
 	attrs = gck_attributes_new ();
-	gck_attributes_add_boolean (attrs, 0UL, TRUE);
 	gck_attributes_add_ulong (attrs, 101UL, 888);
 	gck_attributes_add_string (attrs, 202UL, "string");
 	gck_attributes_add_date (attrs, 303UL, date);
@@ -528,15 +530,108 @@ test_add_all_attributes (void)
 	gck_attributes_add_data (attrs, 404UL, (const guchar *)ATTR_DATA, N_ATTR_DATA);
 	gck_attributes_add_invalid (attrs, 505UL);
 	gck_attributes_add_empty (attrs, 606UL);
+	gck_attributes_add_boolean (attrs, 0UL, FALSE);
 
 	copy = gck_attributes_new ();
+	gck_attributes_add_boolean (copy, 0UL, TRUE); /* shouldn't be overriden */
 	gck_attributes_add_all (copy, attrs);
-	test_attributes_contents (copy, TRUE);
+	test_attributes_contents (copy, TRUE, 8);
 
 	gck_attributes_unref (attrs);
 	gck_attributes_unref (copy);
 }
 
+static void
+test_set_attributes (void)
+{
+	GckAttributes *attrs;
+	GckAttribute attr;
+
+	GDate *date = g_date_new_dmy (11, 12, 2008);
+	attrs = gck_attributes_new ();
+	gck_attributes_add_boolean (attrs, 0UL, FALSE);
+	gck_attributes_add_ulong (attrs, 101UL, 999);
+	gck_attributes_add_string (attrs, 202UL, "invalid");
+
+	gck_attribute_init_boolean (&attr, 0UL, TRUE);
+	gck_attributes_set (attrs, &attr);
+	gck_attribute_clear (&attr);
+
+	gck_attribute_init_ulong (&attr, 101UL, 888);
+	gck_attributes_set (attrs, &attr);
+	gck_attribute_clear (&attr);
+	gck_attribute_init_string (&attr, 202UL, "string");
+	gck_attributes_set (attrs, &attr);
+	gck_attribute_clear (&attr);
+
+	gck_attribute_init_date (&attr, 303UL, date);
+	gck_attributes_set (attrs, &attr);
+	gck_attribute_clear (&attr);
+	g_date_free (date);
+
+	gck_attribute_init (&attr, 404UL, (const guchar *)ATTR_DATA, N_ATTR_DATA);
+	gck_attributes_set (attrs, &attr);
+	gck_attribute_clear (&attr);
+
+	gck_attribute_init_invalid (&attr, 505UL);
+	gck_attributes_set (attrs, &attr);
+	gck_attribute_clear (&attr);
+
+	gck_attribute_init_empty (&attr, 606UL);
+	gck_attributes_set (attrs, &attr);
+	gck_attribute_clear (&attr);
+
+	test_attributes_contents (attrs, TRUE, -1);
+	gck_attributes_unref (attrs);
+}
+
+static void
+test_set_all_attributes (void)
+{
+	GckAttributes *attrs;
+	GckAttributes *copy;
+	GDate *date = g_date_new_dmy (11, 12, 2008);
+	attrs = gck_attributes_new ();
+	gck_attributes_add_boolean (attrs, 0UL, TRUE);
+	gck_attributes_add_ulong (attrs, 101UL, 888);
+	gck_attributes_add_string (attrs, 202UL, "string");
+	gck_attributes_add_date (attrs, 303UL, date);
+	g_date_free (date);
+	gck_attributes_add_data (attrs, 404UL, (const guchar *)ATTR_DATA, N_ATTR_DATA);
+	gck_attributes_add_invalid (attrs, 505UL);
+	gck_attributes_add_empty (attrs, 606UL);
+
+	copy = gck_attributes_new ();
+	gck_attributes_add_ulong (copy, 0UL, TRUE); /* should be overridden */
+	gck_attributes_set_all (copy, attrs);
+	test_attributes_contents (copy, TRUE, 7);
+
+	gck_attributes_unref (attrs);
+	gck_attributes_unref (copy);
+}
+
+static void
+test_dup_attributes (void)
+{
+	GckAttributes *attrs;
+	GckAttributes *copy;
+	GDate *date = g_date_new_dmy (11, 12, 2008);
+	attrs = gck_attributes_new ();
+	gck_attributes_add_boolean (attrs, 0UL, TRUE);
+	gck_attributes_add_ulong (attrs, 101UL, 888);
+	gck_attributes_add_string (attrs, 202UL, "string");
+	gck_attributes_add_date (attrs, 303UL, date);
+	g_date_free (date);
+	gck_attributes_add_data (attrs, 404UL, (const guchar *)ATTR_DATA, N_ATTR_DATA);
+	gck_attributes_add_invalid (attrs, 505UL);
+	gck_attributes_add_empty (attrs, 606UL);
+
+	copy = gck_attributes_dup (attrs);
+	gck_attributes_unref (attrs);
+
+	test_attributes_contents (copy, TRUE, -1);
+	gck_attributes_unref (copy);
+}
 
 static void
 test_find_attributes (void)
@@ -613,6 +708,9 @@ main (int argc, char **argv)
 	g_test_add_func ("/gck/attributes/add_data_attributes", test_add_data_attributes);
 	g_test_add_func ("/gck/attributes/add_attributes", test_add_attributes);
 	g_test_add_func ("/gck/attributes/add_all_attributes", test_add_all_attributes);
+	g_test_add_func ("/gck/attributes/set_attributes", test_set_attributes);
+	g_test_add_func ("/gck/attributes/set_all_attributes", test_set_all_attributes);
+	g_test_add_func ("/gck/attributes/dup_attributes", test_dup_attributes);
 	g_test_add_func ("/gck/attributes/find_attributes", test_find_attributes);
 
 	return g_test_run ();



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]