diff --git a/libgimpconfig/gimpconfig-deserialize.c b/libgimpconfig/gimpconfig-deserialize.c index d197c54415..88c4c2cafe 100644 --- a/libgimpconfig/gimpconfig-deserialize.c +++ b/libgimpconfig/gimpconfig-deserialize.c @@ -98,6 +98,9 @@ static GTokenType gimp_config_deserialize_file_value (GValue *value, static GTokenType gimp_config_deserialize_parasite_value (GValue *value, GParamSpec *prop_spec, GScanner *scanner); +static GTokenType gimp_config_deserialize_bytes (GValue *value, + GParamSpec *prop_spec, + GScanner *scanner); static GTokenType gimp_config_deserialize_any (GValue *value, GParamSpec *prop_spec, GScanner *scanner); @@ -389,6 +392,10 @@ gimp_config_deserialize_value (GValue *value, { return gimp_config_deserialize_parasite_value (value, prop_spec, scanner); } + else if (prop_spec->value_type == G_TYPE_BYTES) + { + return gimp_config_deserialize_bytes (value, prop_spec, scanner); + } /* This fallback will only work for value_types that * can be transformed from a string value. @@ -1030,6 +1037,28 @@ gimp_config_deserialize_parasite_value (GValue *value, return G_TOKEN_RIGHT_PAREN; } +static GTokenType +gimp_config_deserialize_bytes (GValue *value, + GParamSpec *prop_spec, + GScanner *scanner) +{ + GBytes *bytes; + guint8 *data; + gint data_length; + + if (! gimp_scanner_parse_int (scanner, &data_length)) + return G_TOKEN_INT; + + if (! gimp_scanner_parse_data (scanner, data_length, &data)) + return G_TOKEN_STRING; + + bytes = g_bytes_new (data, data_length); + + g_value_take_boxed (value, bytes); + + return G_TOKEN_RIGHT_PAREN; +} + static GTokenType gimp_config_deserialize_any (GValue *value, GParamSpec *prop_spec, diff --git a/libgimpconfig/gimpconfig-serialize.c b/libgimpconfig/gimpconfig-serialize.c index e5d21d6c70..5f22b3511f 100644 --- a/libgimpconfig/gimpconfig-serialize.c +++ b/libgimpconfig/gimpconfig-serialize.c @@ -270,6 +270,30 @@ gimp_config_serialize_property (GimpConfig *config, success = TRUE; } + if (success) + gimp_config_writer_close (writer); + else + gimp_config_writer_revert (writer); + } + else if (G_VALUE_TYPE (&value) == G_TYPE_BYTES) + { + GBytes *bytes = g_value_get_boxed (&value); + + gimp_config_writer_open (writer, param_spec->name); + + if (bytes) + { + gconstpointer data; + gsize data_length; + + data = g_bytes_get_data (bytes, &data_length); + + gimp_config_writer_printf (writer, "%lu", data_length); + gimp_config_writer_data (writer, data_length, data); + + success = TRUE; + } + if (success) gimp_config_writer_close (writer); else