X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgkeyfilesettingsbackend.c;h=0dd802b4f94326ad24a7c47c5b516b6a652d3be7;hb=e608ec7b2e47d29fa189fca6e97f484f41c115a4;hp=94cccedbab5aeb927dc6df21dc3cfc1ce9649bb8;hpb=887d9d83aa232058b8446eafb7f0681db4219a77;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c index 94ccced..0dd802b 100644 --- a/gio/gkeyfilesettingsbackend.c +++ b/gio/gkeyfilesettingsbackend.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library; if not, see . * * Authors: Vincent Untz * Ryan Lortie @@ -32,7 +30,6 @@ #include "gsimplepermission.h" #include "gsettingsbackend.h" -#include "gioalias.h" #define G_TYPE_KEYFILE_SETTINGS_BACKEND (g_keyfile_settings_backend_get_type ()) #define G_KEYFILE_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ @@ -169,7 +166,7 @@ convert_path (GKeyfileSettingsBackend *kfsb, return TRUE; } -gboolean +static gboolean path_is_valid (GKeyfileSettingsBackend *kfsb, const gchar *path) { @@ -294,7 +291,7 @@ g_keyfile_settings_backend_check_one (gpointer key, } static gboolean -g_keyfile_settings_backend_write_many (GSettingsBackend *backend, +g_keyfile_settings_backend_write_tree (GSettingsBackend *backend, GTree *tree, gpointer origin_tag) { @@ -340,19 +337,6 @@ g_keyfile_settings_backend_write (GSettingsBackend *backend, } static void -g_keyfile_settings_backend_reset_path (GSettingsBackend *backend, - const gchar *path, - gpointer origin_tag) -{ - GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (backend); - - if (set_to_keyfile (kfsb, path, NULL)) - g_keyfile_settings_backend_keyfile_write (kfsb); - - g_settings_backend_path_changed (backend, path, origin_tag); -} - -static void g_keyfile_settings_backend_reset (GSettingsBackend *backend, const gchar *key, gpointer origin_tag) @@ -400,12 +384,23 @@ keyfile_to_tree (GKeyfileSettingsBackend *kfsb, gint j; is_root_group = g_strcmp0 (kfsb->root_group, groups[i]) == 0; + + /* reject group names that will form invalid key names */ + if (!is_root_group && + (g_str_has_prefix (groups[i], "/") || + g_str_has_suffix (groups[i], "/") || strstr (groups[i], "//"))) + continue; + keys = g_key_file_get_keys (keyfile, groups[i], NULL, NULL); for (j = 0; keys[j]; j++) { gchar *path, *value; + /* reject key names with slashes in them */ + if (strchr (keys[j], '/')) + continue; + if (is_root_group) path = g_strdup_printf ("%s%s", kfsb->prefix, keys[j]); else @@ -535,14 +530,14 @@ g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class) class->read = g_keyfile_settings_backend_read; class->write = g_keyfile_settings_backend_write; - class->write_keys = g_keyfile_settings_backend_write_many; + class->write_tree = g_keyfile_settings_backend_write_tree; class->reset = g_keyfile_settings_backend_reset; - class->reset_path = g_keyfile_settings_backend_reset_path; class->get_writable = g_keyfile_settings_backend_get_writable; class->get_permission = g_keyfile_settings_backend_get_permission; /* No need to implement subscribed/unsubscribe: the only point would be to * stop monitoring the file when there's no GSettings anymore, which is no - * big win. */ + * big win. + */ } static void @@ -554,7 +549,9 @@ file_changed (GFileMonitor *monitor, { GKeyfileSettingsBackend *kfsb = user_data; - g_keyfile_settings_backend_keyfile_reload (kfsb); + /* Ignore file deletions, let the GKeyFile content remain in tact. */ + if (event_type != G_FILE_MONITOR_EVENT_DELETED) + g_keyfile_settings_backend_keyfile_reload (kfsb); } static void @@ -575,7 +572,6 @@ dir_changed (GFileMonitor *monitor, * @root_path: the path under which all settings keys appear * @root_group: (allow-none): the group name corresponding to * @root_path, or %NULL - * Returns: a keyfile-backed #GSettingsBackend * * Creates a keyfile-backed #GSettingsBackend. * @@ -621,6 +617,8 @@ dir_changed (GFileMonitor *monitor, * syntax of the key file format. For example, if you have '[' or ']' * characters in your path names or '=' in your key names you may be in * trouble. + * + * Returns: (transfer full): a keyfile-backed #GSettingsBackend **/ GSettingsBackend * g_keyfile_settings_backend_new (const gchar *filename, @@ -643,8 +641,8 @@ g_keyfile_settings_backend_new (const gchar *filename, kfsb->dir = g_file_get_parent (kfsb->file); g_file_make_directory_with_parents (kfsb->dir, NULL, NULL); - kfsb->file_monitor = g_file_monitor_file (kfsb->file, 0, NULL, NULL); - kfsb->dir_monitor = g_file_monitor_file (kfsb->dir, 0, NULL, NULL); + kfsb->file_monitor = g_file_monitor (kfsb->file, 0, NULL, NULL); + kfsb->dir_monitor = g_file_monitor (kfsb->dir, 0, NULL, NULL); kfsb->prefix_len = strlen (root_path); kfsb->prefix = g_strdup (root_path); @@ -667,6 +665,3 @@ g_keyfile_settings_backend_new (const gchar *filename, return G_SETTINGS_BACKEND (kfsb); } - -#define __G_KEYFILE_SETTINGS_BACKEND_C__ -#include "gioaliasdef.c"