From a58c048d65965fd3b543f06dd1c4e2928c60ed68 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Thu, 6 Jun 2002 09:49:14 +0000 Subject: Keep track of the regeneration request in a list. (regen_list_free): 2002-06-06 Not Zed * message-list.c (mail_regen_list): Keep track of the regeneration request in a list. (regen_list_free): Remove the request from the regenreation list. (message_list_set_folder): If there are any outstanding regneration requests, cancel them. (regen_list_regened): If we were cancelled, do nothing. (regen_list_regen): If we were cancelled, shortcut processing. This is all for #23571. svn path=/trunk/; revision=17129 --- mail/ChangeLog | 11 ++++++++++ mail/message-list.c | 60 +++++++++++++++++++++++++++++++++++++---------------- mail/message-list.h | 3 +++ 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/mail/ChangeLog b/mail/ChangeLog index 58099ee09b..14368d4da0 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,14 @@ +2002-06-06 Not Zed + + * message-list.c (mail_regen_list): Keep track of the regeneration + request in a list. + (regen_list_free): Remove the request from the regenreation list. + (message_list_set_folder): If there are any outstanding + regneration requests, cancel them. + (regen_list_regened): If we were cancelled, do nothing. + (regen_list_regen): If we were cancelled, shortcut processing. + This is all for #23571. + 2002-06-05 Jeffrey Stedfast * mail-format.c (mail_get_message_rfc822): Don't forget to free diff --git a/mail/message-list.c b/mail/message-list.c index 93dffcfdfb..ba0e1c194f 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -1994,6 +1994,19 @@ message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder, g camel_exception_init (&ex); + /* cancel any outstanding regeneration requests */ + if (message_list->regen) { + GList *l = message_list->regen; + + while (l) { + struct _mail_msg *mm = l->data; + + if (mm->cancel) + camel_operation_cancel(mm->cancel); + l = l->next; + } + } + clear_tree(message_list); if (message_list->folder) { @@ -2514,19 +2527,26 @@ regen_list_regen (struct _mail_msg *mm) } MESSAGE_LIST_UNLOCK(m->ml, hide_lock); - - m->summary = g_ptr_array_new (); - for (i = 0; i < showuids->len; i++) { - info = camel_folder_get_message_info (m->folder, showuids->pdata[i]); - if (info) { - /* FIXME: should this be taken account of in above processing? */ - if (m->hidedel && (info->flags & CAMEL_MESSAGE_DELETED) != 0) - camel_folder_free_message_info (m->folder, info); - else - g_ptr_array_add (m->summary, info); + + if (!camel_operation_cancel_check(mm->cancel)) { + m->summary = g_ptr_array_new (); + for (i = 0; i < showuids->len; i++) { + info = camel_folder_get_message_info (m->folder, showuids->pdata[i]); + if (info) { + /* FIXME: should this be taken account of in above processing? */ + if (m->hidedel && (info->flags & CAMEL_MESSAGE_DELETED) != 0) + camel_folder_free_message_info (m->folder, info); + else + g_ptr_array_add (m->summary, info); + } } + + if (m->dotree) + m->tree = camel_folder_thread_messages_new_summary (m->summary); + else + m->tree = NULL; } - + if (uidnew) g_ptr_array_free (uidnew, TRUE); @@ -2534,11 +2554,6 @@ regen_list_regen (struct _mail_msg *mm) camel_folder_search_free (m->folder, uids); else camel_folder_free_uids (m->folder, uids); - - if (m->dotree) - m->tree = camel_folder_thread_messages_new_summary (m->summary); - else - m->tree = NULL; } static void @@ -2551,7 +2566,10 @@ regen_list_regened (struct _mail_msg *mm) if (m->summary == NULL) return; - + + if (camel_operation_cancel_check(mm->cancel)) + return; + if (m->dotree) build_tree (m->ml, m->tree, m->changes); else @@ -2585,7 +2603,11 @@ regen_list_free (struct _mail_msg *mm) if (m->changes) camel_folder_change_info_free (m->changes); - + + /* This should probably lock the list. + However, since we have a received function, this will always be called in gui thread */ + m->ml->regen = g_list_remove(m->ml->regen, m); + gtk_object_unref (GTK_OBJECT (m->ml)); } @@ -2626,6 +2648,8 @@ mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, Came gtk_object_ref (GTK_OBJECT (ml)); m->folder = ml->folder; camel_object_ref (CAMEL_OBJECT (m->folder)); + + ml->regen = g_list_prepend(ml->regen, m); e_thread_put (mail_thread_queued, (EMsg *)m); } diff --git a/mail/message-list.h b/mail/message-list.h index fc02c668eb..b1ff3f974f 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -86,6 +86,9 @@ struct _MessageList { /* locks */ GMutex *hide_lock; /* for any 'hide' info above */ + /* list of outstanding regeneration requests */ + GList *regen; + /* for message/folder chagned event handling */ struct _MailAsyncEvent *async_event; }; -- cgit v1.2.3