diff options
author | Dan Winship <danw@src.gnome.org> | 2001-06-29 01:06:05 +0800 |
---|---|---|
committer | Dan Winship <danw@src.gnome.org> | 2001-06-29 01:06:05 +0800 |
commit | 418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a (patch) | |
tree | ac448a7ec158d933cfaeba5878ac19209da589b2 /mail/mail-tools.c | |
parent | b7e09293e9b634262e7de82a8f09e890a58aeb3a (diff) | |
download | gsoc2013-evolution-418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a.tar gsoc2013-evolution-418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a.tar.gz gsoc2013-evolution-418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a.tar.bz2 gsoc2013-evolution-418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a.tar.lz gsoc2013-evolution-418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a.tar.xz gsoc2013-evolution-418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a.tar.zst gsoc2013-evolution-418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a.zip |
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
Diffstat (limited to 'mail/mail-tools.c')
-rw-r--r-- | mail/mail-tools.c | 116 |
1 files changed, 109 insertions, 7 deletions
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; } |