From 418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 28 Jun 2001 17:06:05 +0000 Subject: After finding a folder, attach to its "folder_changed" and * mail-tools.c (mail_tool_uri_to_folder): After finding a folder, attach to its "folder_changed" and "message_changed" signals. (update_unread_count, update_unread_count_main): Moved here from folder-browser but basically unchanged. Doing this here lets us get folder tree updates for folders that have had messages moved/copied/filtered into them, but which don't yet have a view associated with them. * folder-browser.c (update_unread_count, update_unread_count_main, etc): Moved to mail-tools.c svn path=/trunk/; revision=10567 --- mail/mail-tools.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 109 insertions(+), 7 deletions(-) (limited to 'mail/mail-tools.c') diff --git a/mail/mail-tools.c b/mail/mail-tools.c index 7a1a9e7607..5c458e0b2a 100644 --- a/mail/mail-tools.c +++ b/mail/mail-tools.c @@ -43,6 +43,7 @@ #include "mail.h" /*session*/ #include "mail-tools.h" #include "mail-local.h" +#include "mail-mt.h" #include "e-util/e-html-utils.h" /* **************************************** */ @@ -244,6 +245,90 @@ mail_tool_make_message_attachment (CamelMimeMessage *message) return part; } +struct folder_cache_info { + char *uri; + CamelFolder *folder; + int unread; +}; + +static void +update_unread_count_main (CamelObject *object, gpointer event_data, + gpointer user_data) +{ + CamelFolder *folder = (CamelFolder *)object; + struct folder_cache_info *fci = user_data; + EvolutionStorage *storage; + char *name; + + storage = mail_lookup_storage (folder->parent_store); + if (fci->unread == 0) + name = g_strdup (camel_folder_get_name (folder)); + else + name = g_strdup_printf ("%s (%d)", camel_folder_get_name (folder), fci->unread); + + evolution_storage_update_folder_by_uri (storage, fci->uri, name, + fci->unread != 0); + g_free (name); + gtk_object_unref (GTK_OBJECT (storage)); +} + +static void +update_unread_count (CamelObject *object, gpointer event_data, + gpointer user_data) +{ + CamelFolder *folder = (CamelFolder *)object; + struct folder_cache_info *fci = user_data; + int unread; + + unread = camel_folder_get_unread_message_count (folder); + if (unread == fci->unread) + return; + fci->unread = unread; + mail_proxy_event (update_unread_count_main, object, event_data, user_data); +} + +static GHashTable *folders = NULL; +static GStaticMutex folders_lock = G_STATIC_MUTEX_INIT; + +static void +uncache_folder (CamelObject *folder, gpointer event_data, gpointer user_data) +{ + struct folder_cache_info *fci = user_data; + + g_static_mutex_lock (&folders_lock); + g_hash_table_remove (folders, fci->uri); + g_static_mutex_unlock (&folders_lock); + + g_free (fci->uri); + g_free (fci); +} + +static void +cache_folder (CamelFolder *folder, const char *uri) +{ + CamelObject *object = CAMEL_OBJECT (folder); + EvolutionStorage *storage; + struct folder_cache_info *fci; + + fci = g_new (struct folder_cache_info, 1); + fci->folder = folder; + fci->uri = g_strdup (uri); + fci->unread = 0; + + g_hash_table_insert (folders, fci->uri, fci); + camel_object_hook_event (object, "finalize", uncache_folder, fci); + + storage = mail_lookup_storage (folder->parent_store); + if (storage) { + gtk_object_unref (GTK_OBJECT (storage)); + update_unread_count (object, NULL, fci); + camel_object_hook_event (object, "message_changed", + update_unread_count, fci); + camel_object_hook_event (object, "folder_changed", + update_unread_count, fci); + } +} + CamelFolder * mail_tool_uri_to_folder (const char *uri, CamelException *ex) { @@ -251,16 +336,31 @@ mail_tool_uri_to_folder (const char *uri, CamelException *ex) CamelStore *store = NULL; CamelFolder *folder = NULL; int offset = 0; - + g_return_val_if_fail (uri != NULL, NULL); - + + g_static_mutex_lock (&folders_lock); + if (folders) { + struct folder_cache_info *fci; + + fci = g_hash_table_lookup (folders, uri); + if (fci) { + camel_object_ref (CAMEL_OBJECT (fci->folder)); + g_static_mutex_unlock (&folders_lock); + return fci->folder; + } + } else + folders = g_hash_table_new (g_str_hash, g_str_equal); + if (!strncmp (uri, "vtrash:", 7)) offset = 7; - + url = camel_url_new (uri + offset, ex); - if (!url) + if (!url) { + g_static_mutex_unlock (&folders_lock); return NULL; - + } + if (!strcmp (url->protocol, "vfolder")) { folder = vfolder_uri_to_folder (uri, ex); } else { @@ -284,6 +384,7 @@ mail_tool_uri_to_folder (const char *uri, CamelException *ex) else folder = camel_store_get_folder (store, name, CAMEL_STORE_FOLDER_CREATE, ex); + camel_object_unref (CAMEL_OBJECT (store)); } } @@ -293,10 +394,11 @@ mail_tool_uri_to_folder (const char *uri, CamelException *ex) folder = NULL; } } - if (store) - camel_object_unref (CAMEL_OBJECT (store)); camel_url_free (url); + cache_folder (folder, uri); + g_static_mutex_unlock (&folders_lock); + return folder; } -- cgit