summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2015-11-27 15:18:52 +0100
committerMilan Crha <mcrha@redhat.com>2015-11-27 15:22:07 +0100
commit56838bfcdbc1e3a8c646ca214a1a650f34d5e80d (patch)
treec45cb3a8f590819b6ad604273c50bc317b4061d0
parent50ce9f5828ca14e22a54e2f56b240b2fcd25a682 (diff)
downloadevolution-data-server-56838bfcdbc1e3a8c646ca214a1a650f34d5e80d.tar.gz
[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.
-rw-r--r--libebackend/e-cache-reaper.c61
1 files changed, 38 insertions, 23 deletions
diff --git a/libebackend/e-cache-reaper.c b/libebackend/e-cache-reaper.c
index ec8af5c60..862f2bf30 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);
}
/**