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



commit f18686ff502ce8b5ba2088e85df9b8ac1c3d1aff
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 |   56 +++++++++++++++++++++++++++------------
 1 files changed, 39 insertions(+), 17 deletions(-)
---
diff --git a/gio/gregistrysettingsbackend.c b/gio/gregistrysettingsbackend.c
index 14f9c79..81885d6 100644
--- a/gio/gregistrysettingsbackend.c
+++ b/gio/gregistrysettingsbackend.c
@@ -1196,14 +1196,41 @@ registry_cache_destroy_tree (GNode            *node,
   g_node_destroy (node);
 }
 
+/* One of these is sent down the pipe when something happens in the registry. */
+typedef struct
+{
+  GRegistryBackend *self;
+  gchar *prefix;          /* prefix is a gsettings path, all items are subkeys of this. */
+  GPtrArray *items;       /* each item is a subkey below prefix that has changed. */
+} RegistryEvent;
+
+static void
+mark_item_keys_as_changed (GNode    *node,
+                           gpointer  data)
+{
+  RegistryCacheItem *item = node->data;
+  RegistryEvent *event = data;
+
+  /* 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 (event->items, g_strdup (item->name));
+}
+
 static void
 registry_cache_remove_deleted (GNode    *node,
                                gpointer  data)
 {
   RegistryCacheItem *item = node->data;
+  RegistryEvent *event = data;
 
   if (!item->readable)
-    registry_cache_destroy_tree (node, data);
+    {
+      mark_item_keys_as_changed (node, data);
+      registry_cache_destroy_tree (node, event->self->watch);
+    }
 }
 
 /* Update cache from registry, and optionally report on the changes.
@@ -1226,15 +1253,16 @@ registry_cache_update (GRegistryBackend *self,
                        const gchar      *prefix,
                        const gchar      *partial_key_name,
                        GNode            *cache_node,
-                       int               n_watches, 
-                       GPtrArray        *changes)
+                       int               n_watches,
+                       RegistryEvent    *event)
 {
   gchar buffer[MAX_KEY_NAME_LENGTH + 1];
   gchar *key_name;
   gint i;
   LONG result;
+  RegistryCacheItem *item;
 
-  RegistryCacheItem *item = cache_node->data;
+  item = cache_node->data;
 
   if (item->subscription_count > 0)
     n_watches++;
@@ -1278,7 +1306,7 @@ registry_cache_update (GRegistryBackend *self,
             }
 
           registry_cache_update (self, hsubpath, prefix, buffer, subkey_node,
-                                 n_watches, changes);
+                                 n_watches, event);
           child_item = subkey_node->data;
           child_item->readable = TRUE;
 
@@ -1336,14 +1364,16 @@ registry_cache_update (GRegistryBackend *self,
 
       child_item = cache_child_node->data;
       child_item->readable = TRUE;
-      if (changed == TRUE && changes != NULL)
+      if (changed && event != NULL)
         {
           gchar *item;
+
           if (partial_key_name == NULL)
             item = g_strdup (buffer);
           else
             item = g_build_path ("/", partial_key_name, buffer, NULL);
-          g_ptr_array_add (changes, item);
+
+          g_ptr_array_add (event->items, item);
         }
     }
 
@@ -1352,7 +1382,7 @@ registry_cache_update (GRegistryBackend *self,
 
   /* Any nodes now left unreadable must have been deleted, remove them from cache */
   g_node_children_foreach (cache_node, G_TRAVERSE_ALL,
-                           registry_cache_remove_deleted, self->watch);
+                           registry_cache_remove_deleted, event);
 
   trace ("registry cache update complete.\n");
   g_free (key_name);
@@ -1372,14 +1402,6 @@ registry_watch_key (HKEY   hpath,
                                   event, TRUE);
 }
 
-/* One of these is sent down the pipe when something happens in the registry. */
-typedef struct
-{
-  GRegistryBackend *self;
-  gchar *prefix;          /* prefix is a gsettings path, all items are subkeys of this. */
-  GPtrArray *items;       /* each item is a subkey below prefix that has changed. */
-} RegistryEvent;
-
 /* This handler runs in the main thread to emit the changed signals */
 static gboolean
 watch_handler (RegistryEvent *event)
@@ -1656,7 +1678,7 @@ watch_thread_function (LPVOID parameter)
 
           EnterCriticalSection (G_REGISTRY_BACKEND (self->owner)->cache_lock);
           registry_cache_update (G_REGISTRY_BACKEND (self->owner), hpath,
-                                 prefix, NULL, cache_node, 0, event->items);
+                                 prefix, NULL, cache_node, 0, event);
           LeaveCriticalSection (G_REGISTRY_BACKEND (self->owner)->cache_lock);
 
           if (event->items->len > 0)


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