[evolution-data-server] [ECacheReaper] Recover data for private folders



commit b5ecb8749f54a98e72b2622d2ca7ba282ec2ac8a
Author: Milan Crha <mcrha redhat com>
Date:   Fri Nov 27 15:18:52 2015 +0100

    [ECacheReaper] Recover data for private folders
    
    When, for whatever reason, some 3rd-party plugin with its own private
    directory wasn't installed, its private directory was moved to trash,
    but never recovered, even when it was installed again.

 libebackend/e-cache-reaper.c |   61 ++++++++++++++++++++++++++----------------
 1 files changed, 38 insertions(+), 23 deletions(-)
---
diff --git a/libebackend/e-cache-reaper.c b/libebackend/e-cache-reaper.c
index ec8af5c..862f2bf 100644
--- a/libebackend/e-cache-reaper.c
+++ b/libebackend/e-cache-reaper.c
@@ -387,18 +387,15 @@ cache_reaper_move_to_trash (ECacheReaper *extension,
 
 static void
 cache_reaper_recover_from_trash (ECacheReaper *extension,
-                                 ESource *source,
+                                 const gchar *directory_uid,
                                  GFile *base_directory,
                                  GFile *trash_directory)
 {
        GFile *source_directory;
        GFile *target_directory;
-       const gchar *uid;
-
-       uid = e_source_get_uid (source);
 
-       source_directory = g_file_get_child (trash_directory, uid);
-       target_directory = g_file_get_child (base_directory, uid);
+       source_directory = g_file_get_child (trash_directory, directory_uid);
+       target_directory = g_file_get_child (base_directory, directory_uid);
 
        /* This is a no-op if the source directory does not exist. */
        cache_reaper_move_directory (source_directory, target_directory);
@@ -408,9 +405,34 @@ cache_reaper_recover_from_trash (ECacheReaper *extension,
 }
 
 static void
+cache_reaper_recover_for_uid (ECacheReaper *extension,
+                             const gchar *uid)
+{
+       guint ii;
+
+       /* The Cache Reaper is not too proud to dig through the
+        * trash on the off chance the newly-added source has a
+        * recoverable data or cache directory. */
+
+       for (ii = 0; ii < extension->n_data_directories; ii++)
+               cache_reaper_recover_from_trash (
+                       extension, uid,
+                       extension->data_directories[ii],
+                       extension->data_trash_directories[ii]);
+
+       for (ii = 0; ii < extension->n_cache_directories; ii++)
+               cache_reaper_recover_from_trash (
+                       extension, uid,
+                       extension->cache_directories[ii],
+                       extension->cache_trash_directories[ii]);
+}
+
+static void
 cache_reaper_files_loaded_cb (ESourceRegistryServer *server,
                               ECacheReaper *extension)
 {
+       GSList *link;
+
        cache_reaper_scan_data_directories (extension);
        cache_reaper_scan_cache_directories (extension);
 
@@ -422,6 +444,13 @@ cache_reaper_files_loaded_cb (ESourceRegistryServer *server,
                                cache_reaper_reap_trash_directories,
                                extension);
        }
+
+       for (link = extension->private_directories; link; link = g_slist_next (link)) {
+               const gchar *directory = link->data;
+
+               if (directory && *directory)
+                       cache_reaper_recover_for_uid (extension, directory);
+       }
 }
 
 static void
@@ -429,23 +458,7 @@ cache_reaper_source_added_cb (ESourceRegistryServer *server,
                               ESource *source,
                               ECacheReaper *extension)
 {
-       guint ii;
-
-       /* The Cache Reaper is not too proud to dig through the
-        * trash on the off chance the newly-added source has a
-        * recoverable data or cache directory. */
-
-       for (ii = 0; ii < extension->n_data_directories; ii++)
-               cache_reaper_recover_from_trash (
-                       extension, source,
-                       extension->data_directories[ii],
-                       extension->data_trash_directories[ii]);
-
-       for (ii = 0; ii < extension->n_cache_directories; ii++)
-               cache_reaper_recover_from_trash (
-                       extension, source,
-                       extension->cache_directories[ii],
-                       extension->cache_trash_directories[ii]);
+       cache_reaper_recover_for_uid (extension, e_source_get_uid (source));
 }
 
 static void
@@ -681,6 +694,8 @@ e_cache_reaper_add_private_directory (ECacheReaper *cache_reaper,
                return;
 
        cache_reaper->private_directories = g_slist_prepend (cache_reaper->private_directories, g_strdup 
(name));
+
+       cache_reaper_recover_for_uid (cache_reaper, name);
 }
 
 /**


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