aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2002-06-06 17:49:14 +0800
committerMichael Zucci <zucchi@src.gnome.org>2002-06-06 17:49:14 +0800
commita58c048d65965fd3b543f06dd1c4e2928c60ed68 (patch)
tree5484c15d04430affd83fe4d71cfb37d80d169484 /mail
parent88f3e2714d7a9251b2c5a01b7c1410f4f3ab60c6 (diff)
downloadgsoc2013-evolution-a58c048d65965fd3b543f06dd1c4e2928c60ed68.tar.gz
gsoc2013-evolution-a58c048d65965fd3b543f06dd1c4e2928c60ed68.tar.zst
gsoc2013-evolution-a58c048d65965fd3b543f06dd1c4e2928c60ed68.zip
Keep track of the regeneration request in a list. (regen_list_free):
2002-06-06 Not Zed <NotZed@Ximian.com> * 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
Diffstat (limited to 'mail')
-rw-r--r--mail/ChangeLog11
-rw-r--r--mail/message-list.c60
-rw-r--r--mail/message-list.h3
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 <NotZed@Ximian.com>
+
+ * 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 <fejj@ximian.com>
* 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;
};