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"