[evolution] Remove mail-config, vfolder, and filter deps from mail-folder-cache



commit 0eef4618ca677cd11d54ce0ae8804b5b1ededf3b
Author: Jonathon Jongsma <jonathon quotidian org>
Date:   Fri Dec 11 11:51:55 2009 -0600

    Remove mail-config, vfolder, and filter deps from mail-folder-cache
    
    Instead of pushing the updates to the right places, the folder cache simply
    emits the appropriate signals and other objects are responsible for listening
    and handling them appropriately.  This allows us to cut down the dependencies of
    MailFolderCache significantly, which is a huge step towards allowing us to split
    it off for the backend.
    
    Another nice thing about this is that it allows us to trim a lot of 'public' api
    from the filter, vfolder, and config classes that were only used by the cache.
    Now that stuff can all be internal since they're pulling changes rather than
    having the changes pushed.
    
    The last remaining problematic dependency in MailFolderCache is
    EmFolderTreeModel.  That is next on the chopping block.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=604627

 mail/mail-config.c                  |  279 +++++++++++++++++++----------------
 mail/mail-config.h                  |    4 -
 mail/mail-folder-cache.c            |   20 +--
 mail/mail-vfolder.c                 |   41 +++++-
 mail/mail-vfolder.h                 |    9 -
 modules/mail/e-mail-shell-backend.c |   22 +++
 6 files changed, 212 insertions(+), 163 deletions(-)
---
diff --git a/mail/mail-config.c b/mail/mail-config.c
index 7f0fa42..41ac85a 100644
--- a/mail/mail-config.c
+++ b/mail/mail-config.c
@@ -58,12 +58,13 @@
 
 #include <libedataserverui/e-passwords.h>
 
-#include "mail-session.h"
+#include "e-mail-local.h"
+#include "em-utils.h"
 #include "mail-config.h"
+#include "mail-folder-cache.h"
 #include "mail-mt.h"
+#include "mail-session.h"
 #include "mail-tools.h"
-#include "em-utils.h"
-#include "e-mail-local.h"
 
 typedef struct {
 	GConfClient *gconf;
@@ -251,131 +252,6 @@ gconf_int_value_changed (GConfClient *client,
 	}
 }
 
-/* Config struct routines */
-void
-mail_config_init (void)
-{
-	GConfClientNotifyFunc func;
-	const gchar *key;
-
-	if (config)
-		return;
-
-	config = g_new0 (MailConfig, 1);
-	config->gconf = gconf_client_get_default ();
-	config->gtkrc = g_build_filename (
-		e_get_user_data_dir (), "mail",
-		"config", "gtkrc-mail-fonts", NULL);
-
-	mail_config_clear ();
-
-	gtk_rc_parse (config->gtkrc);
-
-	/* Composer Configuration */
-
-	gconf_client_add_dir (
-		config->gconf, "/apps/evolution/mail/composer",
-		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-
-	key = "/apps/evolution/mail/composer/spell_color";
-	func = (GConfClientNotifyFunc) gconf_style_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func, NULL, NULL, NULL);
-
-	key = "/apps/evolution/mail/composer/outlook_filenames";
-	func = (GConfClientNotifyFunc) gconf_outlook_filenames_changed;
-	gconf_outlook_filenames_changed (config->gconf, 0, NULL, NULL);
-	gconf_client_notify_add (
-		config->gconf, key, func, NULL, NULL, NULL);
-
-	/* Display Configuration */
-
-	gconf_client_add_dir (
-		config->gconf, "/apps/evolution/mail/display",
-		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-
-	key = "/apps/evolution/mail/display/address_compress";
-	func = (GConfClientNotifyFunc) gconf_bool_value_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func,
-		&config->address_compress, NULL, NULL);
-	config->address_compress =
-		gconf_client_get_bool (config->gconf, key, NULL);
-
-	key = "/apps/evolution/mail/display/address_count";
-	func = (GConfClientNotifyFunc) gconf_int_value_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func,
-		&config->address_count, NULL, NULL);
-	config->address_count =
-		gconf_client_get_int (config->gconf, key, NULL);
-
-	key = "/apps/evolution/mail/display/citation_colour";
-	func = (GConfClientNotifyFunc) gconf_style_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func, NULL, NULL, NULL);
-
-	key = "/apps/evolution/mail/display/mark_citations";
-	func = (GConfClientNotifyFunc) gconf_style_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func, NULL, NULL, NULL);
-
-	/* Font Configuration */
-
-	gconf_client_add_dir (
-		config->gconf, "/apps/evolution/mail/display/fonts",
-		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-
-	key = "/apps/evolution/mail/display/fonts";
-	func = (GConfClientNotifyFunc) gconf_style_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func, NULL, NULL, NULL);
-
-	/* Junk Configuration */
-
-	gconf_client_add_dir (
-		config->gconf, "/apps/evolution/mail/junk",
-		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-
-	key = "/apps/evolution/mail/junk/check_custom_header";
-	func = (GConfClientNotifyFunc) gconf_jh_check_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func, NULL, NULL, NULL);
-	config->jh_check =
-		gconf_client_get_bool (config->gconf, key, NULL);
-
-	key = "/apps/evolution/mail/junk/custom_header";
-	func = (GConfClientNotifyFunc) gconf_jh_headers_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func, NULL, NULL, NULL);
-
-	key = "/apps/evolution/mail/junk/lookup_addressbook";
-	func = (GConfClientNotifyFunc) gconf_bool_value_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func,
-		&config->book_lookup, NULL, NULL);
-	config->book_lookup =
-		gconf_client_get_bool (config->gconf, key, NULL);
-
-	key = "/apps/evolution/mail/junk/lookup_addressbook_local_only";
-	func = (GConfClientNotifyFunc) gconf_bool_value_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func,
-		&config->book_lookup_local_only, NULL, NULL);
-	config->book_lookup_local_only =
-		gconf_client_get_bool (config->gconf, key, NULL);
-
-	key = "/desktop/gnome/lockdown/disable_command_line";
-	func = (GConfClientNotifyFunc) gconf_bool_value_changed;
-	gconf_client_notify_add (
-		config->gconf, key, func,
-		&config->scripts_disabled, NULL, NULL);
-	config->scripts_disabled =
-		gconf_client_get_bool (config->gconf, key, NULL);
-
-	gconf_jh_check_changed (config->gconf, 0, NULL, config);
-}
-
 void
 mail_config_clear (void)
 {
@@ -578,7 +454,7 @@ uri_to_evname (const gchar *uri, const gchar *prefix)
 	return tmp;
 }
 
-void
+static void
 mail_config_uri_renamed (GCompareFunc uri_cmp, const gchar *old, const gchar *new)
 {
 	EAccountList *account_list;
@@ -633,7 +509,7 @@ mail_config_uri_renamed (GCompareFunc uri_cmp, const gchar *old, const gchar *ne
 		mail_config_write ();
 }
 
-void
+static void
 mail_config_uri_deleted (GCompareFunc uri_cmp, const gchar *uri)
 {
 	EAccountList *account_list;
@@ -737,3 +613,146 @@ mail_config_get_lookup_book_local_only (void)
 
 	return config->book_lookup_local_only;
 }
+
+static void
+folder_deleted_cb (MailFolderCache *cache, CamelStore *store, const gchar *uri, gpointer user_data)
+{
+	mail_config_uri_deleted(CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->compare_folder_name, uri);
+}
+
+static void
+folder_renamed_cb (MailFolderCache *cache, CamelStore *store, const gchar *olduri, const gchar *newuri, gpointer user_data)
+{
+	mail_config_uri_renamed(CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->compare_folder_name,
+				olduri, newuri);
+}
+
+/* Config struct routines */
+void
+mail_config_init (void)
+{
+	GConfClientNotifyFunc func;
+	const gchar *key;
+
+	if (config)
+		return;
+
+	config = g_new0 (MailConfig, 1);
+	config->gconf = gconf_client_get_default ();
+	config->gtkrc = g_build_filename (
+		e_get_user_data_dir (), "mail",
+		"config", "gtkrc-mail-fonts", NULL);
+
+	mail_config_clear ();
+
+	gtk_rc_parse (config->gtkrc);
+
+	/* Composer Configuration */
+
+	gconf_client_add_dir (
+		config->gconf, "/apps/evolution/mail/composer",
+		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+
+	key = "/apps/evolution/mail/composer/spell_color";
+	func = (GConfClientNotifyFunc) gconf_style_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func, NULL, NULL, NULL);
+
+	key = "/apps/evolution/mail/composer/outlook_filenames";
+	func = (GConfClientNotifyFunc) gconf_outlook_filenames_changed;
+	gconf_outlook_filenames_changed (config->gconf, 0, NULL, NULL);
+	gconf_client_notify_add (
+		config->gconf, key, func, NULL, NULL, NULL);
+
+	/* Display Configuration */
+
+	gconf_client_add_dir (
+		config->gconf, "/apps/evolution/mail/display",
+		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+
+	key = "/apps/evolution/mail/display/address_compress";
+	func = (GConfClientNotifyFunc) gconf_bool_value_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func,
+		&config->address_compress, NULL, NULL);
+	config->address_compress =
+		gconf_client_get_bool (config->gconf, key, NULL);
+
+	key = "/apps/evolution/mail/display/address_count";
+	func = (GConfClientNotifyFunc) gconf_int_value_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func,
+		&config->address_count, NULL, NULL);
+	config->address_count =
+		gconf_client_get_int (config->gconf, key, NULL);
+
+	key = "/apps/evolution/mail/display/citation_colour";
+	func = (GConfClientNotifyFunc) gconf_style_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func, NULL, NULL, NULL);
+
+	key = "/apps/evolution/mail/display/mark_citations";
+	func = (GConfClientNotifyFunc) gconf_style_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func, NULL, NULL, NULL);
+
+	/* Font Configuration */
+
+	gconf_client_add_dir (
+		config->gconf, "/apps/evolution/mail/display/fonts",
+		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+
+	key = "/apps/evolution/mail/display/fonts";
+	func = (GConfClientNotifyFunc) gconf_style_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func, NULL, NULL, NULL);
+
+	/* Junk Configuration */
+
+	gconf_client_add_dir (
+		config->gconf, "/apps/evolution/mail/junk",
+		GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+
+	key = "/apps/evolution/mail/junk/check_custom_header";
+	func = (GConfClientNotifyFunc) gconf_jh_check_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func, NULL, NULL, NULL);
+	config->jh_check =
+		gconf_client_get_bool (config->gconf, key, NULL);
+
+	key = "/apps/evolution/mail/junk/custom_header";
+	func = (GConfClientNotifyFunc) gconf_jh_headers_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func, NULL, NULL, NULL);
+
+	key = "/apps/evolution/mail/junk/lookup_addressbook";
+	func = (GConfClientNotifyFunc) gconf_bool_value_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func,
+		&config->book_lookup, NULL, NULL);
+	config->book_lookup =
+		gconf_client_get_bool (config->gconf, key, NULL);
+
+	key = "/apps/evolution/mail/junk/lookup_addressbook_local_only";
+	func = (GConfClientNotifyFunc) gconf_bool_value_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func,
+		&config->book_lookup_local_only, NULL, NULL);
+	config->book_lookup_local_only =
+		gconf_client_get_bool (config->gconf, key, NULL);
+
+	key = "/desktop/gnome/lockdown/disable_command_line";
+	func = (GConfClientNotifyFunc) gconf_bool_value_changed;
+	gconf_client_notify_add (
+		config->gconf, key, func,
+		&config->scripts_disabled, NULL, NULL);
+	config->scripts_disabled =
+		gconf_client_get_bool (config->gconf, key, NULL);
+
+	gconf_jh_check_changed (config->gconf, 0, NULL, config);
+
+	g_signal_connect (mail_folder_cache_get_default (), "folder-deleted",
+			  (GCallback) folder_deleted_cb, NULL);
+	g_signal_connect (mail_folder_cache_get_default (), "folder-renamed",
+			  (GCallback) folder_renamed_cb, NULL);
+}
diff --git a/mail/mail-config.h b/mail/mail-config.h
index 6f127ec..dc55403 100644
--- a/mail/mail-config.h
+++ b/mail/mail-config.h
@@ -85,10 +85,6 @@ gint mail_config_get_address_count (void);
 
 EAccountService  *mail_config_get_default_transport (void);
 
-/* uri's got changed by the store, etc */
-void mail_config_uri_renamed (GCompareFunc uri_cmp, const gchar *old, const gchar *new);
-void mail_config_uri_deleted (GCompareFunc uri_cmp, const gchar *uri);
-
 /* static utility functions */
 gchar *mail_config_folder_to_cachename (CamelFolder *folder, const gchar *prefix);
 gchar *mail_config_folder_to_safe_url (CamelFolder *folder);
diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c
index 9d9a9b4..769fa1d 100644
--- a/mail/mail-folder-cache.c
+++ b/mail/mail-folder-cache.c
@@ -58,9 +58,6 @@
 #include "mail-tools.h"
 
 /* For notifications of changes */
-#include "mail-vfolder.h"
-#include "mail-autofilter.h"
-#include "mail-config.h"
 #include "em-folder-tree-model.h"
 
 #include "em-event.h"
@@ -187,26 +184,17 @@ real_flush_updates (gpointer o, gpointer event_data, gpointer data)
 		g_mutex_unlock (self->priv->stores_mutex);
 
 		if (up->remove) {
-			/* XXX: what's going on here? */
 			if (up->delete) {
-				mail_vfolder_delete_uri(up->store, up->uri);
-				mail_filter_delete_uri(up->store, up->uri);
-				mail_config_uri_deleted(CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(up->store))->compare_folder_name, up->uri);
-
+				g_signal_emit (self, signals[FOLDER_DELETED], 0, up->store, up->uri);
 			} else
-				mail_vfolder_notify_uri_unavailable (up->store, up->uri);
+				g_signal_emit (self, signals[FOLDER_UNAVAILABLE], 0, up->store, up->uri);
 		} else {
-			/* We can tell the vfolder code though */
 			if (up->olduri && up->add) {
-				d(printf("renaming folder '%s' to '%s'\n", up->olduri, up->uri));
-				mail_vfolder_rename_uri(up->store, up->olduri, up->uri);
-				mail_filter_rename_uri(up->store, up->olduri, up->uri);
-				mail_config_uri_renamed(CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(up->store))->compare_folder_name,
-							up->olduri, up->uri);
+				g_signal_emit (self, signals[FOLDER_RENAMED], 0, up->store, up->olduri, up->uri);
 			}
 
 			if (!up->olduri && up->add)
-				mail_vfolder_notify_uri_available (up->store, up->uri);
+				g_signal_emit (self, signals[FOLDER_AVAILABLE], 0, up->store, up->uri);
 		}
 
 		/* update unread counts */
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
index 9380922..b4a8330 100644
--- a/mail/mail-vfolder.c
+++ b/mail/mail-vfolder.c
@@ -550,7 +550,7 @@ done:
  * uri.  This function has a transient effect and does not permanently modify
  * the vfolder filter rules on disk.
  */
-void
+static void
 mail_vfolder_notify_uri_available (CamelStore *store, const gchar *uri)
 {
 	mail_vfolder_add_uri (store, uri, FALSE);
@@ -565,7 +565,7 @@ mail_vfolder_notify_uri_available (CamelStore *store, const gchar *uri)
  * uri.  This function has a transient effect and does not permanently modify
  * the vfolder filter rules on disk.
  */
-void
+static void
 mail_vfolder_notify_uri_unavailable (CamelStore *store, const gchar *uri)
 {
 	mail_vfolder_add_uri (store, uri, TRUE);
@@ -588,7 +588,7 @@ mail_vfolder_notify_uri_unavailable (CamelStore *store, const gchar *uri)
  *
  * NOTE: This function must be called from the main thread.
  */
-void
+static void
 mail_vfolder_delete_uri(CamelStore *store, const gchar *curi)
 {
 	EFilterRule *rule;
@@ -679,7 +679,7 @@ done:
 }
 
 /* called when a uri is renamed in a store */
-void
+static void
 mail_vfolder_rename_uri(CamelStore *store, const gchar *cfrom, const gchar *cto)
 {
 	EFilterRule *rule;
@@ -972,6 +972,30 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data)
 	}
 }
 
+static void
+folder_available_cb (MailFolderCache *cache, CamelStore *store, const gchar *uri, gpointer user_data)
+{
+	mail_vfolder_notify_uri_available (store, uri);
+}
+
+static void
+folder_unavailable_cb (MailFolderCache *cache, CamelStore *store, const gchar *uri, gpointer user_data)
+{
+	mail_vfolder_notify_uri_unavailable (store, uri);
+}
+
+static void
+folder_deleted_cb (MailFolderCache *cache, CamelStore *store, const gchar *uri, gpointer user_data)
+{
+	mail_vfolder_delete_uri (store, uri);
+}
+
+static void
+folder_renamed_cb (MailFolderCache *cache, CamelStore *store, const gchar *olduri, const gchar *newuri, gpointer user_data)
+{
+	mail_vfolder_rename_uri (store, olduri, newuri);
+}
+
 void
 vfolder_load_storage(void)
 {
@@ -1049,6 +1073,15 @@ vfolder_load_storage(void)
 	gconf = mail_config_get_gconf_client();
 	if (!gconf_client_get_bool (gconf, "/apps/evolution/mail/display/enable_vfolders", NULL))
 		gconf_client_set_bool (gconf, "/apps/evolution/mail/display/enable_vfolders", TRUE, NULL);
+
+	g_signal_connect (mail_folder_cache_get_default (), "folder-available",
+			  (GCallback) folder_available_cb, NULL);
+	g_signal_connect (mail_folder_cache_get_default (), "folder-unavailable",
+			  (GCallback) folder_unavailable_cb, NULL);
+	g_signal_connect (mail_folder_cache_get_default (), "folder-deleted",
+			  (GCallback) folder_deleted_cb, NULL);
+	g_signal_connect (mail_folder_cache_get_default (), "folder-renamed",
+			  (GCallback) folder_renamed_cb, NULL);
 }
 
 void
diff --git a/mail/mail-vfolder.h b/mail/mail-vfolder.h
index 8e44ec4..a70cdd8 100644
--- a/mail/mail-vfolder.h
+++ b/mail/mail-vfolder.h
@@ -44,15 +44,6 @@ void vfolder_gui_add_from_address (CamelInternetAddress *addr, gint flags, const
 GList * mail_vfolder_get_sources_local (void);
 GList * mail_vfolder_get_sources_remote (void);
 
-void mail_vfolder_notify_uri_available(CamelStore *store, const gchar *uri);
-void mail_vfolder_notify_uri_unavailable(CamelStore *store, const gchar *uri);
-
-/* note that a folder has changed name (uri) */
-void mail_vfolder_rename_uri(CamelStore *store, const gchar *from, const gchar *to);
-
-/* remove a uri that should be removed from vfolders permanently */
-void mail_vfolder_delete_uri(CamelStore *store, const gchar *uri);
-
 /* close up, clean up */
 void mail_vfolder_shutdown (void);
 
diff --git a/modules/mail/e-mail-shell-backend.c b/modules/mail/e-mail-shell-backend.c
index f1a85a8..be6bd1d 100644
--- a/modules/mail/e-mail-shell-backend.c
+++ b/modules/mail/e-mail-shell-backend.c
@@ -56,7 +56,9 @@
 #include "em-mailer-prefs.h"
 #include "em-network-prefs.h"
 #include "em-utils.h"
+#include "mail-autofilter.h"
 #include "mail-config.h"
+#include "mail-folder-cache.h"
 #include "mail-ops.h"
 #include "mail-send-recv.h"
 #include "mail-session.h"
@@ -768,6 +770,18 @@ mail_shell_backend_window_created_cb (EShell *shell,
 }
 
 static void
+folder_deleted_cb (MailFolderCache *cache, CamelStore *store, const gchar *uri, gpointer user_data)
+{
+	mail_filter_delete_uri(store, uri);
+}
+
+static void
+folder_renamed_cb (MailFolderCache *cache, CamelStore *store, const gchar *olduri, const gchar *newuri, gpointer user_data)
+{
+	mail_filter_rename_uri(store, olduri, newuri);
+}
+
+static void
 mail_shell_backend_constructed (GObject *object)
 {
 	EMailShellBackendPrivate *priv;
@@ -833,6 +847,14 @@ mail_shell_backend_constructed (GObject *object)
 		G_CALLBACK (mail_shell_backend_window_created_cb),
 		shell_backend);
 
+	g_signal_connect (
+		mail_folder_cache_get_default (), "folder-deleted",
+		G_CALLBACK (folder_deleted_cb), NULL);
+
+	g_signal_connect (
+		mail_folder_cache_get_default (), "folder-renamed",
+		G_CALLBACK (folder_renamed_cb), NULL);
+
 	mail_config_init ();
 	mail_msg_init ();
 



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