From 9614076737ee88c092af209485d1d65d2269f4ad Mon Sep 17 00:00:00 2001 From: Tsuyoshi Horo Date: Thu, 18 Aug 2011 11:48:30 -0400 Subject: [PATCH] Fix for ibus_serializable_{get,set}_attachment. TEST=Linux desktop Review URL: http://codereview.appspot.com/4905054 Patch from Tsuyoshi Horo . --- src/ibusserializable.c | 18 +++++++++--------- src/ibusserializable.h | 3 +-- src/tests/ibus-serializable.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/ibusserializable.c b/src/ibusserializable.c index 2e4b21f..ed89534 100644 --- a/src/ibusserializable.c +++ b/src/ibusserializable.c @@ -164,7 +164,7 @@ _g_value_serialize (GValue *value) { \ g##_type v; \ v = g_value_get_##_type (value); \ - return g_variant_new ("v", g_variant_new (signature, v)); \ + return g_variant_new (signature, v); \ } CASE_ENTRY(CHAR, char, "y"); CASE_ENTRY(BOOLEAN, boolean, "b"); @@ -198,14 +198,14 @@ _g_value_deserialize (GVariant *variant) } typedef gchar *gstring; -#define IF_ENTRY(TYPE, _type, signature) \ - if (type == G_VARIANT_TYPE_##TYPE) { \ - g##_type v; \ - g_variant_get (variant, signature, &v); \ - value = g_slice_new0 (GValue); \ - g_value_init (value, G_TYPE_##TYPE); \ - g_value_set_##_type (value, v); \ - return value; \ +#define IF_ENTRY(TYPE, _type, signature) \ + if (g_variant_type_equal(type, G_VARIANT_TYPE_##TYPE)) { \ + g##_type v; \ + g_variant_get (variant, signature, &v); \ + value = g_slice_new0 (GValue); \ + g_value_init (value, G_TYPE_##TYPE); \ + g_value_set_##_type (value, v); \ + return value; \ } #define G_VARIANT_TYPE_CHAR G_VARIANT_TYPE_BYTE IF_ENTRY(CHAR, char, "y"); diff --git a/src/ibusserializable.h b/src/ibusserializable.h index 358af32..8fd9f8a 100644 --- a/src/ibusserializable.h +++ b/src/ibusserializable.h @@ -87,12 +87,11 @@ * ibus_serializable_get_attachment: * @o: An IBusSerializable. * @k: String formatted key for indexing value. - * @v: Value to be attached. Should be also serializable. * * Get a value from attachment of an IBusSerializable. * This macro is an convenient wrapper of ibus_serializable_get_qattachment(). */ -#define ibus_serializable_get_attachment(o, k, v) \ +#define ibus_serializable_get_attachment(o, k) \ ibus_serializable_get_qattachment (o, g_quark_from_string (k)) /** diff --git a/src/tests/ibus-serializable.c b/src/tests/ibus-serializable.c index c2a7529..e2541ec 100644 --- a/src/tests/ibus-serializable.c +++ b/src/tests/ibus-serializable.c @@ -128,6 +128,39 @@ test_property (void) g_variant_type_info_assert_no_infos (); } +static void +test_attachment (void) +{ + IBusText *text = ibus_text_new_from_string ("main text"); + + GValue value1 = { 0 }; + g_value_init(&value1, G_TYPE_INT); + g_value_set_int(&value1, 100); + ibus_serializable_set_attachment ((IBusSerializable *)text, "key1", &value1); + + GValue value2 = { 0 }; + g_value_init(&value2, G_TYPE_STRING); + g_value_set_string(&value2, "value string"); + ibus_serializable_set_attachment ((IBusSerializable *)text, "key2", &value2); + + GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text); + g_object_unref ((IBusSerializable *)text); + + IBusSerializable *object = (IBusSerializable *) ibus_serializable_deserialize (variant); + g_variant_unref (variant); + + g_assert_cmpstr (((IBusText *)object)->text, ==, "main text"); + + const GValue *newvalue1 = ibus_serializable_get_attachment (object, "key1"); + g_assert (newvalue1 != NULL); + g_assert (g_value_get_int (newvalue1) == 100); + + const GValue *newvalue2 = ibus_serializable_get_attachment (object, "key2"); + g_assert (newvalue2 != NULL); + g_assert_cmpstr (g_value_get_string (newvalue2), ==, "value string"); + + g_variant_type_info_assert_no_infos (); +} gint main (gint argc, @@ -142,6 +175,7 @@ main (gint argc, g_test_add_func ("/ibus/enginedesc", test_engine_desc); g_test_add_func ("/ibus/lookuptable", test_lookup_table); g_test_add_func ("/ibus/property", test_property); + g_test_add_func ("/ibus/attachment", test_attachment); return g_test_run (); } -- 2.7.4