diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-01-21 22:55:45 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-01-22 11:11:24 -0500 |
commit | e6574b228ebeb31e52ca86d866955d2f4df49446 (patch) | |
tree | ed781c315e964807e4c9843e38066c7eaf88688f /gio | |
parent | 5506de3b92fbf85dcae95632dd08e63ea56d5371 (diff) | |
download | glib-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.c | 19 | ||||
-rw-r--r-- | gio/tests/gsettings.c | 17 |
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; |