diff options
author | Not Zed <NotZed@Ximian.com> | 2002-06-11 12:54:17 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2002-06-11 12:54:17 +0800 |
commit | ce2082b3ee0caa4b7f25dec1058fced57ebf32b4 (patch) | |
tree | 0745b4ef36417f5fe41bb489539d88d4d33a8d67 /mail | |
parent | d5f7add041e2a73dcf1a74f1a52b3a9234167a26 (diff) | |
download | gsoc2013-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')
-rw-r--r-- | mail/ChangeLog | 18 | ||||
-rw-r--r-- | mail/folder-info.c | 18 | ||||
-rw-r--r-- | mail/message-list.c | 106 | ||||
-rw-r--r-- | mail/message-list.h | 3 |
4 files changed, 102 insertions, 43 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index fd912a3a09..e8546bef08 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,9 @@ +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-10 Jeffrey Stedfast <fejj@ximian.com> * mail-accounts.c (account_able_clicked): Comment out the code to @@ -48,6 +54,18 @@ (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. + 2002-06-05 Jeffrey Stedfast <fejj@ximian.com> * mail-format.c (mail_get_message_rfc822): Don't forget to free diff --git a/mail/folder-info.c b/mail/folder-info.c index bf4f11f227..1694458966 100644 --- a/mail/folder-info.c +++ b/mail/folder-info.c @@ -76,22 +76,12 @@ do_get_info (struct _mail_msg *mm) { struct _folder_info_msg *m = (struct _folder_info_msg *) mm; CamelFolder *folder; - CamelException *ex; - ex = camel_exception_new (); - folder = mail_tool_uri_to_folder (m->foldername, 0, ex); - if (camel_exception_is_set (ex)) { - g_warning ("Camel exception: %s", camel_exception_get_description (ex)); + folder = mail_tool_uri_to_folder (m->foldername, 0, NULL); + if (folder) { + m->read = camel_folder_get_message_count (folder); + m->unread = camel_folder_get_unread_message_count (folder); } - - camel_exception_free (ex); - - if (folder == NULL) { - g_warning ("Camel returned NULL for %s\n", m->foldername); - } - - m->read = camel_folder_get_message_count (folder); - m->unread = camel_folder_get_unread_message_count (folder); } static void 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); diff --git a/mail/message-list.h b/mail/message-list.h index b1ff3f974f..3cc412f6cc 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -89,6 +89,9 @@ struct _MessageList { /* list of outstanding regeneration requests */ GList *regen; + /* the current camel folder thread tree, if any */ + struct _CamelFolderThread *thread_tree; + /* for message/folder chagned event handling */ struct _MailAsyncEvent *async_event; }; |