aboutsummaryrefslogtreecommitdiffstats
path: root/camel
diff options
context:
space:
mode:
Diffstat (limited to 'camel')
-rw-r--r--camel/ChangeLog10
-rw-r--r--camel/providers/imap/camel-imap-store.c22
-rw-r--r--camel/providers/local/camel-maildir-summary.c2
3 files changed, 30 insertions, 4 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index b73acb5484..e706d30653 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,13 @@
+2004-03-26 Not Zed <NotZed@Ximian.com>
+
+ * providers/local/camel-maildir-summary.c (flagbits[]): Added new
+ maildir flags D for draft and commented P for forwarded.
+
+ * providers/imap/camel-imap-store.c (get_folder_counts): Instead
+ of looking up the folder in the object bag which will handle
+ reservations and perhaps deadlock, just get the list of opened
+ folders and use them if they're available. Should fix #56045.
+
2004-03-25 Jeffrey Stedfast <fejj@ximian.com>
* providers/imap4/camel-imap-engine.c
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index 32bb41179b..2d8206b79d 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -2392,7 +2392,19 @@ static void
get_folder_counts(CamelImapStore *imap_store, CamelFolderInfo *fi, CamelException *ex)
{
GSList *q;
+ GPtrArray *folders;
+ GHashTable *folders_table;
CamelFolder *folder;
+ int i;
+
+ /* We list rather than use get here, and manage our own lookups outside of the bag,
+ since get will wait if someone has reserved the name - can cause deadlock */
+ folders = camel_object_bag_list(CAMEL_STORE(imap_store)->folders);
+ folders_table = g_hash_table_new(g_str_hash, g_str_equal);
+ for (i=0; i<folders->len;i++) {
+ folder = folders->pdata[i];
+ g_hash_table_insert(folders_table, folder->full_name, folder);
+ }
/* non-recursive breath first search */
@@ -2424,15 +2436,12 @@ get_folder_counts(CamelImapStore *imap_store, CamelFolderInfo *fi, CamelExceptio
fi->unread = get_folder_status (imap_store, fi->full_name, "UNSEEN");
fi->total = get_folder_status(imap_store, fi->full_name, "MESSAGES");
/* if we have this folder open, and the unread count has changed, update */
- folder = camel_object_bag_get(CAMEL_STORE(imap_store)->folders, fi->full_name);
+ folder = g_hash_table_lookup(folders_table, fi->full_name);
if (folder && fi->unread != camel_folder_get_unread_message_count(folder)) {
CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(folder))->refresh_info(folder, ex);
fi->unread = camel_folder_get_unread_message_count(folder);
fi->total = camel_folder_get_message_count(folder);
}
- if (folder)
- camel_object_unref(folder);
-
}
CAMEL_SERVICE_UNLOCK (imap_store, connect_lock);
@@ -2446,6 +2455,11 @@ get_folder_counts(CamelImapStore *imap_store, CamelFolderInfo *fi, CamelExceptio
fi = fi->next;
}
}
+
+ g_hash_table_destroy(folders_table);
+ for (i=0; i<folders->len;i++)
+ camel_object_unref(folders->pdata[i]);
+ g_ptr_array_free(folders, TRUE);
}
/* imap needs to treat inbox case insensitive */
diff --git a/camel/providers/local/camel-maildir-summary.c b/camel/providers/local/camel-maildir-summary.c
index 37e1ac2ce7..edc81a5230 100644
--- a/camel/providers/local/camel-maildir-summary.c
+++ b/camel/providers/local/camel-maildir-summary.c
@@ -168,7 +168,9 @@ static struct {
char flag;
guint32 flagbit;
} flagbits[] = {
+ { 'D', CAMEL_MESSAGE_DRAFT },
{ 'F', CAMEL_MESSAGE_FLAGGED },
+ /*{ 'P', CAMEL_MESSAGE_FORWARDED },*/
{ 'R', CAMEL_MESSAGE_ANSWERED },
{ 'S', CAMEL_MESSAGE_SEEN },
{ 'T', CAMEL_MESSAGE_DELETED },