aboutsummaryrefslogtreecommitdiffstats
path: root/mail/message-list.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2002-06-11 12:54:17 +0800
committerMichael Zucci <zucchi@src.gnome.org>2002-06-11 12:54:17 +0800
commitce2082b3ee0caa4b7f25dec1058fced57ebf32b4 (patch)
tree0745b4ef36417f5fe41bb489539d88d4d33a8d67 /mail/message-list.c
parentd5f7add041e2a73dcf1a74f1a52b3a9234167a26 (diff)
downloadgsoc2013-evolution-ce2082b3ee0caa4b7f25dec1058fced57ebf32b4.tar
gsoc2013-evolution-ce2082b3ee0caa4b7f25dec1058fced57ebf32b4.tar.gz
gsoc2013-evolution-ce2082b3ee0caa4b7f25dec1058fced57ebf32b4.tar.bz2
gsoc2013-evolution-ce2082b3ee0caa4b7f25dec1058fced57ebf32b4.tar.lz
gsoc2013-evolution-ce2082b3ee0caa4b7f25dec1058fced57ebf32b4.tar.xz
gsoc2013-evolution-ce2082b3ee0caa4b7f25dec1058fced57ebf32b4.tar.zst
gsoc2013-evolution-ce2082b3ee0caa4b7f25dec1058fced57ebf32b4.zip
If we dont get a folder, dont try and get details off it. Should get rid
2002-06-11 Not Zed <NotZed@Ximian.com> * folder-info.c (do_get_info): If we dont get a folder, dont try and get details off it. Should get rid of most of those annoying summary warnings, but not the cause of them. 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. * message-list.c (regen_list_regen): Change the way we calculate the hide deleted messages and tree view options. Do it based on a search and uid's rather than a summary. (regen_list_regened): Handle changes to tree storage. (mail_regen_list): The tree is now stored between updates, so we can update the tree structure incrementally. This blows out memory use some however. We need an etree that uses this as its model directly? (message_list_destroy): Free the thread tree. (message_list_set_folder): Clear the thread tree when changing folder. svn path=/trunk/; revision=17165
Diffstat (limited to 'mail/message-list.c')
-rw-r--r--mail/message-list.c106
1 files changed, 77 insertions, 29 deletions
diff --git a/mail/message-list.c b/mail/message-list.c
index ba0e1c194f..1de20b61db 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -1220,6 +1220,9 @@ message_list_destroy (GtkObject *object)
camel_object_unref (CAMEL_OBJECT (message_list->folder));
}
+ if (message_list->thread_tree)
+ camel_folder_thread_messages_unref(message_list->thread_tree);
+
gtk_object_unref (GTK_OBJECT (message_list->extras));
gtk_object_unref (GTK_OBJECT (message_list->model));
@@ -2018,6 +2021,11 @@ message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder, g
camel_object_unref (CAMEL_OBJECT (message_list->folder));
}
+ if (message_list->thread_tree) {
+ camel_folder_thread_messages_unref(message_list->thread_tree);
+ message_list->thread_tree = NULL;
+ }
+
message_list->folder = camel_folder;
if (message_list->cursor_uid) {
@@ -2407,6 +2415,8 @@ hide_save_state (MessageList *ml)
struct _regen_list_msg {
struct _mail_msg msg;
+ int complete;
+
MessageList *ml;
char *search;
char *hideexpr;
@@ -2439,14 +2449,26 @@ static void
regen_list_regen (struct _mail_msg *mm)
{
struct _regen_list_msg *m = (struct _regen_list_msg *)mm;
- GPtrArray *uids, *uidnew, *showuids;
+ GPtrArray *uids, *uidnew, *showuids, *searchuids = NULL;
CamelMessageInfo *info;
int i;
- if (m->search)
- uids = camel_folder_search_by_expression (m->folder, m->search, &mm->ex);
- else
- uids = camel_folder_get_uids (m->folder);
+ /* if we have hidedeleted on, use a search to find it out, merge with existing search if set */
+ if (m->hidedel) {
+ char *expr;
+
+ if (m->search) {
+ expr = alloca(strlen(m->search) + 64);
+ sprintf(expr, "(and (match-all (not (system-flag \"deleted\")))\n %s)", m->search);
+ } else
+ expr = "(match-all (not (system-flag \"deleted\")))";
+ searchuids = uids = camel_folder_search_by_expression (m->folder, expr, &mm->ex);
+ } else {
+ if (m->search)
+ searchuids = uids = camel_folder_search_by_expression (m->folder, m->search, &mm->ex);
+ else
+ uids = camel_folder_get_uids (m->folder);
+ }
if (camel_exception_is_set (&mm->ex))
return;
@@ -2528,32 +2550,32 @@ regen_list_regen (struct _mail_msg *mm)
MESSAGE_LIST_UNLOCK(m->ml, hide_lock);
- 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 (!camel_operation_cancel_check(mm->cancel)) {
+ /* update/build a new tree */
+ if (m->dotree) {
+ if (m->tree)
+ camel_folder_thread_messages_apply(m->tree, showuids);
+ else
+ m->tree = camel_folder_thread_messages_new(m->folder, showuids);
+ } else {
+ 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)
+ 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);
-
- if (m->search)
- camel_folder_search_free (m->folder, uids);
+
+ if (searchuids)
+ camel_folder_search_free (m->folder, searchuids);
else
camel_folder_free_uids (m->folder, uids);
+
+ m->complete = TRUE;
}
static void
@@ -2563,16 +2585,21 @@ regen_list_regened (struct _mail_msg *mm)
if (GTK_OBJECT_DESTROYED(m->ml))
return;
-
- if (m->summary == NULL)
- return;
+ if (!m->complete)
+ return;
+
if (camel_operation_cancel_check(mm->cancel))
return;
- if (m->dotree)
+ if (m->dotree) {
build_tree (m->ml, m->tree, m->changes);
- else
+ g_assert(m->ml->thread_tree == NULL || m->ml->thread_tree == m->tree);
+ if (m->ml->thread_tree == NULL) {
+ m->ml->thread_tree = m->tree;
+ m->tree = NULL;
+ }
+ } else
build_flat (m->ml, m->summary, m->changes);
gtk_signal_emit (GTK_OBJECT (m->ml), message_list_signals[MESSAGE_LIST_BUILT]);
@@ -2591,7 +2618,7 @@ regen_list_free (struct _mail_msg *mm)
}
if (m->tree)
- camel_folder_thread_messages_destroy (m->tree);
+ camel_folder_thread_messages_unref (m->tree);
if (m->ml->search && m->ml->search != m->search)
g_free (m->ml->search);
@@ -2625,6 +2652,19 @@ mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, Came
if (ml->folder == NULL)
return;
+
+ /* cancel any outstanding regeneration requests, we rebuild from scratch anyway */
+ if (ml->regen) {
+ GList *l = ml->regen;
+
+ while (l) {
+ struct _mail_msg *mm = l->data;
+
+ if (mm->cancel)
+ camel_operation_cancel(mm->cancel);
+ l = l->next;
+ }
+ }
#ifndef BROKEN_ETREE
/* this can sometimes crash,so ... */
@@ -2649,6 +2689,14 @@ mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, Came
m->folder = ml->folder;
camel_object_ref (CAMEL_OBJECT (m->folder));
+ if ((!m->hidedel || !m->dotree) && ml->thread_tree) {
+ camel_folder_thread_messages_unref(ml->thread_tree);
+ ml->thread_tree = NULL;
+ } else if (ml->thread_tree) {
+ m->tree = ml->thread_tree;
+ camel_folder_thread_messages_ref(m->tree);
+ }
+
ml->regen = g_list_prepend(ml->regen, m);
e_thread_put (mail_thread_queued, (EMsg *)m);