[gcr] gck: add gck_attributes_set() and gck_attributes_set_all() functions
- From: Stefan Walter <stefw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gcr] gck: add gck_attributes_set() and gck_attributes_set_all() functions
- Date: Thu, 24 Nov 2011 06:58:27 +0000 (UTC)
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]