[glib/mcatanzaro/glib-2-56-rhel8: 18/45] keyfile settings: Accept unquoted strings
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/mcatanzaro/glib-2-56-rhel8: 18/45] keyfile settings: Accept unquoted strings
- Date: Wed, 10 Nov 2021 22:05:59 +0000 (UTC)
commit 491106478b5a065fdd0607aaee88c98829d3d063
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Jan 21 22:55:45 2019 -0500
keyfile settings: Accept unquoted 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.
gio/gkeyfilesettingsbackend.c | 19 +++++++++++++++++++
gio/tests/gsettings.c | 17 +++++++++++++++++
2 files changed, 36 insertions(+)
---
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
index b05eefd90..a8995e329 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 acdeead4c..65c607467 100644
--- a/gio/tests/gsettings.c
+++ b/gio/tests/gsettings.c
@@ -1716,6 +1716,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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]