diff options
Diffstat (limited to 'libmate-desktop')
-rw-r--r-- | libmate-desktop/mate-gsettings.c | 67 | ||||
-rw-r--r-- | libmate-desktop/mate-gsettings.h | 3 |
2 files changed, 70 insertions, 0 deletions
diff --git a/libmate-desktop/mate-gsettings.c b/libmate-desktop/mate-gsettings.c index 2fb5921..e37bc91 100644 --- a/libmate-desktop/mate-gsettings.c +++ b/libmate-desktop/mate-gsettings.c @@ -54,6 +54,73 @@ mate_gsettings_schema_exists (const gchar* schema) return schema_exists; } +/* (copied from gnome-panel) + * Adapted from is_valid_keyname() in glib (gio/glib-compile-schemas.c) + * Differences: + * - gettext support removed (we don't need translations here) + * - remove support for allow_any_name + */ +gboolean +mate_gsettings_is_valid_keyname (const gchar *key, + GError **error) +{ + gint i; + + if (key[0] == '\0') + { + g_set_error_literal (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "empty names are not permitted"); + return FALSE; + } + + if (!g_ascii_islower (key[0])) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "invalid name '%s': names must begin " + "with a lowercase letter", key); + return FALSE; + } + + for (i = 1; key[i]; i++) + { + if (key[i] != '-' && + !g_ascii_islower (key[i]) && + !g_ascii_isdigit (key[i])) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "invalid name '%s': invalid character '%c'; " + "only lowercase letters, numbers and dash ('-') " + "are permitted.", key, key[i]); + return FALSE; + } + + if (key[i] == '-' && key[i + 1] == '-') + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "invalid name '%s': two successive dashes ('--') " + "are not permitted.", key); + return FALSE; + } + } + + if (key[i - 1] == '-') + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "invalid name '%s': the last character may not be a " + "dash ('-').", key); + return FALSE; + } + + if (i > 32) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "invalid name '%s': maximum length is 32", key); + return FALSE; + } + + return TRUE; +} + gboolean mate_gsettings_append_strv (GSettings *settings, const gchar *key, diff --git a/libmate-desktop/mate-gsettings.h b/libmate-desktop/mate-gsettings.h index 8b6dd30..1cc1ba0 100644 --- a/libmate-desktop/mate-gsettings.h +++ b/libmate-desktop/mate-gsettings.h @@ -32,6 +32,9 @@ G_BEGIN_DECLS gboolean mate_gsettings_schema_exists (const gchar* schema); +gboolean mate_gsettings_is_valid_keyname (const gchar *key, + GError **error); + gboolean mate_gsettings_append_strv (GSettings *settings, const gchar *key, const gchar *value); |