aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-tools.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2001-06-29 01:06:05 +0800
committerDan Winship <danw@src.gnome.org>2001-06-29 01:06:05 +0800
commit418a137c3a737a1a6cc8ed3cf3ecbd2f2751466a (patch)
treeac448a7ec158d933cfaeba5878ac19209da589b2 /mail/mail-tools.c
parentb7e09293e9b634262e7de82a8f09e890a58aeb3a (diff)
downloadgsoc2013-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.c116
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;
}