aboutsummaryrefslogtreecommitdiffstats
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
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
-rw-r--r--mail/ChangeLog18
-rw-r--r--mail/folder-info.c18
-rw-r--r--mail/message-list.c106
-rw-r--r--mail/message-list.h3
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;
};