[glib/wip/nacho/registry-writable: 1/3] registrybackend: handle readability of the keys



commit 653084c685e63bdf1d3baba725ab711fabf32f43
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Tue Feb 2 13:12:22 2016 +0100

    registrybackend: handle readability of the keys
    
    If a key is removed or it cannot be read anymore we should
    notify the backend about it so it fallbacks to the default
    value.

 gio/gregistrysettingsbackend.c |   46 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 45 insertions(+), 1 deletions(-)
---
diff --git a/gio/gregistrysettingsbackend.c b/gio/gregistrysettingsbackend.c
index 2b57a83..b9d838e 100644
--- a/gio/gregistrysettingsbackend.c
+++ b/gio/gregistrysettingsbackend.c
@@ -1223,6 +1223,41 @@ typedef struct
   GPtrArray *items;       /* each item is a subkey below prefix that has changed. */
 } RegistryEvent;
 
+typedef struct
+{
+  RegistryEvent *event;
+  gchar *current_key_name;
+} DeletedItemData;
+
+static void
+mark_item_keys_as_changed (GNode    *node,
+                           gpointer  data)
+{
+  RegistryCacheItem *item = node->data;
+  DeletedItemData *item_data = data;
+
+  if (item_data->current_key_name == NULL)
+    item_data->current_key_name = g_strdup (item->name);
+  else
+    {
+      gchar *name;
+
+      name = g_build_path ("/", item_data->current_key_name, item->name, NULL);
+      g_free (item_data->current_key_name);
+      item_data->current_key_name = name;
+    }
+
+  /* Iterate until we find an item that is a value */
+  if (item->value.type == REG_NONE)
+    g_node_children_foreach (node, G_TRAVERSE_ALL,
+                             mark_item_keys_as_changed, data);
+  else
+    {
+      g_ptr_array_add (item_data->event->items, item_data->current_key_name);
+      g_slice_free (DeletedItemData, item_data);
+    }
+}
+
 static void
 registry_cache_remove_deleted (GNode    *node,
                                gpointer  data)
@@ -1231,7 +1266,16 @@ registry_cache_remove_deleted (GNode    *node,
   RegistryEvent *event = data;
 
   if (!item->readable)
-    registry_cache_destroy_tree (node, event->self->watch);
+    {
+      DeletedItemData *item_data;
+
+      item_data = g_slice_new (DeletedItemData);
+      item_data->event = event;
+      item_data->current_key_name = NULL;
+
+      mark_item_keys_as_changed (node, item_data);
+      registry_cache_destroy_tree (node, event->self->watch);
+    }
 }
 
 /* Update cache from registry, and optionally report on the changes.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]