summaryrefslogtreecommitdiff
path: root/gio
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-01-21 22:55:45 -0500
committerMatthias Clasen <mclasen@redhat.com>2019-01-22 11:11:24 -0500
commite6574b228ebeb31e52ca86d866955d2f4df49446 (patch)
treeed781c315e964807e4c9843e38066c7eaf88688f /gio
parent5506de3b92fbf85dcae95632dd08e63ea56d5371 (diff)
downloadglib-keyfile-backend-strings.tar.gz
keyfile settings: Accept unquoted stringskeyfile-backend-strings
It is hard for users to remember that strings have to be explicitly quoted in the keyfile. Be lenient and accept strings that lack those quotes.
Diffstat (limited to 'gio')
-rw-r--r--gio/gkeyfilesettingsbackend.c19
-rw-r--r--gio/tests/gsettings.c17
2 files changed, 36 insertions, 0 deletions
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
index 398cb053a..d5796b706 100644
--- a/gio/gkeyfilesettingsbackend.c
+++ b/gio/gkeyfilesettingsbackend.c
@@ -225,6 +225,25 @@ get_from_keyfile (GKeyfileSettingsBackend *kfsb,
if (str)
{
return_value = g_variant_parse (type, str, NULL, NULL, NULL);
+ if (return_value == NULL &&
+ g_variant_type_equal (type, G_VARIANT_TYPE_STRING) &&
+ str[0] != '\"')
+ {
+ GString *s = g_string_sized_new (strlen (str) + 2);
+ char *p = str;
+
+ g_string_append_c (s, '\"');
+ while (*p)
+ {
+ if (*p == '\"')
+ g_string_append_c (s, '\\');
+ g_string_append_c (s, *p);
+ p++;
+ }
+ g_string_append_c (s, '\"');
+ return_value = g_variant_parse (type, s->str, NULL, NULL, NULL);
+ g_string_free (s, TRUE);
+ }
g_free (str);
}
diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c
index 58217e982..fb19e5156 100644
--- a/gio/tests/gsettings.c
+++ b/gio/tests/gsettings.c
@@ -1770,6 +1770,23 @@ test_keyfile (void)
g_assert_cmpstr (str, ==, "howdy");
g_free (str);
+ /* Now check setting a string without quotes */
+ called = FALSE;
+ g_signal_connect (settings, "changed::greeting", G_CALLBACK (key_changed_cb), &called);
+
+ g_key_file_set_string (keyfile, "tests", "greeting", "he\"l🤗uń");
+ g_free (data);
+ data = g_key_file_to_data (keyfile, &len, NULL);
+ g_file_set_contents ("keyfile/gsettings.store", data, len, &error);
+ g_assert_no_error (error);
+ while (!called)
+ g_main_context_iteration (NULL, FALSE);
+ g_signal_handlers_disconnect_by_func (settings, key_changed_cb, &called);
+
+ str = g_settings_get_string (settings, "greeting");
+ g_assert_cmpstr (str, ==, "he\"l🤗uń");
+ g_free (str);
+
g_settings_set (settings, "farewell", "s", "cheerio");
called = FALSE;