X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgkeyfilesettingsbackend.c;h=8eb7681526f186289bff51652bd29db6c9d22698;hb=d9ad40b4eaf1a9197ab363de4346a8d84f45f5c1;hp=a53777f2c90d22889c4a8c20775c960eaa3e48d3;hpb=726e4dd6e7e12800db90a5159f5cb6fc3509e9e7;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c index a53777f..8eb7681 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,24 @@ 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); + g_assert (keys != 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 +531,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 +550,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 +573,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. * @@ -591,10 +588,10 @@ dir_changed (GFileMonitor *monitor, * "toplevel", then settings the key "/apps/example/enabled" to a value * of %TRUE will cause the following to appear in the keyfile: * - * + * |[ * [toplevel] - * foo=true - * + * enabled=true + * ]| * * If @root_group is %NULL then it is not permitted to store keys * directly below the @root_path. @@ -602,13 +599,13 @@ dir_changed (GFileMonitor *monitor, * For keys not stored directly below @root_path (ie: in a sub-path), * the name of the subpath (with the final slash stripped) is used as * the name of the keyfile group. To continue the example, if - * were stored in "/apps/example/profiles/default/font-size" were set to + * "/apps/example/profiles/default/font-size" were set to * 12 then the following would appear in the keyfile: * - * + * |[ * [profiles/default] * font-size=12 - * + * ]| * * The backend will refuse writes (and return writability as being * %FALSE) for keys outside of @root_path and, in the event that @@ -616,6 +613,13 @@ dir_changed (GFileMonitor *monitor, * Writes will also be refused if the backend detects that it has the * inability to rewrite the keyfile (ie: the containing directory is not * writable). + * + * There is no checking done for your key namespace clashing with the + * 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, @@ -638,8 +642,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); @@ -662,6 +666,3 @@ g_keyfile_settings_backend_new (const gchar *filename, return G_SETTINGS_BACKEND (kfsb); } - -#define __G_KEYFILE_SETTINGS_BACKEND_C__ -#include "gioaliasdef.c"