X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgsettings-mapping.c;h=12b7f34487770272b34585487d8aafcc74d88729;hb=feec280b7c5c7b9198e34b10b4f5764c9c3c4505;hp=52a9b218fd51965b9e124d99bf073ced8e6e21cd;hpb=ab1111b8bbb7a6057248658013eb23d80f4721cf;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gsettings-mapping.c b/gio/gsettings-mapping.c index 52a9b21..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,22 @@ 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; @@ -392,6 +398,34 @@ g_settings_set_mapping (const GValue *value, 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); @@ -417,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; @@ -447,8 +481,7 @@ g_settings_get_mapping (GValue *value, return TRUE; } - else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING) && - G_VALUE_HOLDS_ENUM (value)) + else if (G_VALUE_HOLDS_ENUM (value)) { GEnumClass *eclass; GEnumValue *evalue; @@ -469,9 +502,47 @@ g_settings_get_mapping (GValue *value, return FALSE; } } - else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("ay"))) + 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_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; } @@ -510,8 +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; }