X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgsettings-mapping.c;h=12b7f34487770272b34585487d8aafcc74d88729;hb=51fac05d73f8363de821eb0d6940dedca13a8c0f;hp=6b17bfb52efdae560d16eec71d2ffd938f13079d;hpb=5e6e7cbadf2ee48c0e439a416e5fb74e8e5d8dee;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gsettings-mapping.c b/gio/gsettings-mapping.c index 6b17bfb..12b7f34 100644 --- a/gio/gsettings-mapping.c +++ b/gio/gsettings-mapping.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library; if not, see . * * Author: Vincent Untz */ @@ -346,7 +344,7 @@ g_settings_set_mapping (const GValue *value, if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTE)) { if (G_VALUE_HOLDS_CHAR (value)) - return g_variant_new_byte (g_value_get_char (value)); + return g_variant_new_byte (g_value_get_schar (value)); else return g_variant_new_byte (g_value_get_uchar (value)); } @@ -369,14 +367,65 @@ g_settings_set_mapping (const GValue *value, return NULL; else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_STRING)) return g_variant_new_string (g_value_get_string (value)); - else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE ("ay"))) - return g_variant_new_byte_array (g_value_get_string (value), -1); + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTESTRING)) + return g_variant_new_bytestring (g_value_get_string (value)); else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_OBJECT_PATH)) return g_variant_new_object_path (g_value_get_string (value)); else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_SIGNATURE)) return g_variant_new_signature (g_value_get_string (value)); } + else if (G_VALUE_HOLDS (value, G_TYPE_STRV)) + { + if (g_value_get_boxed (value) == NULL) + return NULL; + return g_variant_new_strv ((const gchar **) g_value_get_boxed (value), + -1); + } + + else if (G_VALUE_HOLDS_ENUM (value)) + { + GEnumValue *enumval; + GEnumClass *eclass; + + /* GParamSpecEnum holds a ref on the class so we just peek... */ + eclass = g_type_class_peek (G_VALUE_TYPE (value)); + enumval = g_enum_get_value (eclass, g_value_get_enum (value)); + + if (enumval) + return g_variant_new_string (enumval->value_nick); + else + return NULL; + } + + else if (G_VALUE_HOLDS_FLAGS (value)) + { + GVariantBuilder builder; + GFlagsValue *flagsval; + GFlagsClass *fclass; + guint flags; + + fclass = g_type_class_peek (G_VALUE_TYPE (value)); + flags = g_value_get_flags (value); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); + while (flags) + { + flagsval = g_flags_get_first_value (fclass, flags); + + if (flagsval == NULL) + { + g_variant_builder_clear (&builder); + return NULL; + } + + g_variant_builder_add (&builder, "s", flagsval->value_nick); + flags &= ~flagsval->value; + } + + return g_variant_builder_end (&builder); + } + type_string = g_variant_type_dup_string (expected_type); g_critical ("No GSettings bind handler for type \"%s\".", type_string); g_free (type_string); @@ -402,7 +451,7 @@ g_settings_get_mapping (GValue *value, if (G_VALUE_HOLDS_UCHAR (value)) g_value_set_uchar (value, g_variant_get_byte (variant)); else if (G_VALUE_HOLDS_CHAR (value)) - g_value_set_char (value, (gchar) g_variant_get_byte (variant)); + g_value_set_schar (value, (gint8)g_variant_get_byte (variant)); else return FALSE; return TRUE; @@ -426,12 +475,74 @@ g_settings_get_mapping (GValue *value, g_variant_is_of_type (variant, G_VARIANT_TYPE_OBJECT_PATH) || g_variant_is_of_type (variant, G_VARIANT_TYPE_SIGNATURE)) { - g_value_set_string (value, g_variant_get_string (variant, NULL)); - return TRUE; + if (G_VALUE_HOLDS_STRING (value)) + { + g_value_set_string (value, g_variant_get_string (variant, NULL)); + return TRUE; + } + + else if (G_VALUE_HOLDS_ENUM (value)) + { + GEnumClass *eclass; + GEnumValue *evalue; + const gchar *nick; + + /* GParamSpecEnum holds a ref on the class so we just peek... */ + eclass = g_type_class_peek (G_VALUE_TYPE (value)); + nick = g_variant_get_string (variant, NULL); + evalue = g_enum_get_value_by_nick (eclass, nick); + + if (evalue) + { + g_value_set_enum (value, evalue->value); + return TRUE; + } + + g_warning ("Unable to lookup enum nick '%s' via GType\n", nick); + return FALSE; + } + } + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("as"))) + { + if (G_VALUE_HOLDS (value, G_TYPE_STRV)) + { + g_value_take_boxed (value, g_variant_dup_strv (variant, NULL)); + return TRUE; + } + + else if (G_VALUE_HOLDS_FLAGS (value)) + { + GFlagsClass *fclass; + GFlagsValue *fvalue; + const gchar *nick; + GVariantIter iter; + guint flags = 0; + + fclass = g_type_class_peek (G_VALUE_TYPE (value)); + + g_variant_iter_init (&iter, variant); + while (g_variant_iter_next (&iter, "&s", &nick)) + { + fvalue = g_flags_get_value_by_nick (fclass, nick); + + if (fvalue) + flags |= fvalue->value; + + else + { + g_warning ("Unable to lookup flags nick '%s' via GType\n", + nick); + return FALSE; + } + } + + g_value_set_flags (value, flags); + return TRUE; + } } - else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("ay"))) + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTESTRING)) { - g_value_set_string (value, g_variant_get_byte_array (variant, NULL)); + g_value_set_string (value, g_variant_get_bytestring (variant)); return TRUE; } @@ -470,6 +581,12 @@ g_settings_mapping_is_compatible (GType gvalue_type, g_variant_type_equal (variant_type, G_VARIANT_TYPE ("ay")) || g_variant_type_equal (variant_type, G_VARIANT_TYPE_OBJECT_PATH) || g_variant_type_equal (variant_type, G_VARIANT_TYPE_SIGNATURE)); + else if (gvalue_type == G_TYPE_STRV) + ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as")); + else if (G_TYPE_IS_ENUM (gvalue_type)) + ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING); + else if (G_TYPE_IS_FLAGS (gvalue_type)) + ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as")); return ok; }