diff options
Diffstat (limited to 'mail')
-rw-r--r-- | mail/ChangeLog | 29 | ||||
-rw-r--r-- | mail/folder-browser.c | 6 | ||||
-rw-r--r-- | mail/message-list.c | 548 | ||||
-rw-r--r-- | mail/message-list.h | 7 | ||||
-rw-r--r-- | mail/message-thread.c | 8 | ||||
-rw-r--r-- | mail/message-thread.h | 4 |
6 files changed, 164 insertions, 438 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 441d3f617a..d45f11c222 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,32 @@ +2000-07-07 Dan Winship <danw@helixcode.com> + + * message-list.c: Lots of changes. Store uids as node data on the + tree nodes and use those rather than rows where possible. (The + concept of "row" is just getting too complicated.) Get rid of the + summary_table, because given a uid we can call + camel_folder_get_message_info, which makes more sense than keeping + a separate uid->row hash table ourselves. + + (get_message_info): update + (get_message_row): removed + (ml_col_cound, ml_row_count, ml_value_at, ml_set_value_at, + ml_cell_is_editable, ml_duplicate_value, ml_free_value, + ml_initialize_value, ml_value_is_empty, ml_value_to_string): + Removed. We always use the tree model now. + (message_list_init): Remove the non-tree code. + (build_tree): store uids in the tree rather than row numbers, + and build the message_list->uid_rowmap to map from uids to rows + when needed. + (message_list_regenerate): Renamed from _set_search, since it's + used to redraw in non-search cases too. + (message_changed): Use the uid_rowmap to get a model row number. + + * message-thread.c (thread_messages): Change the interface on this + to work with the new MessageList. + + * folder-browser.c (search_set, folder_browser_clear_search): + s/message_list_set_search/message_list_regenerate/ + 2000-07-07 Christopher James Lahey <clahey@helixcode.com> * message-list.c (get_message_info): Handle a row number of -1 diff --git a/mail/folder-browser.c b/mail/folder-browser.c index f2818e0938..5a051be15e 100644 --- a/mail/folder-browser.c +++ b/mail/folder-browser.c @@ -240,7 +240,7 @@ search_set(FolderBrowser *fb) text = gtk_entry_get_text((GtkEntry *)fb->search_entry); if (text == NULL || text[0] == 0) { - message_list_set_search (fb->message_list, NULL); + message_list_regenerate (fb->message_list, NULL); return; } @@ -260,7 +260,7 @@ search_set(FolderBrowser *fb) str++; } } - message_list_set_search (fb->message_list, out->str); + message_list_regenerate (fb->message_list, out->str); g_string_free(out, TRUE); } @@ -311,7 +311,7 @@ folder_browser_clear_search (FolderBrowser *fb) { gtk_entry_set_text (GTK_ENTRY (fb->search_entry), ""); gtk_option_menu_set_history (GTK_OPTION_MENU (fb->search_menu), 0); - message_list_set_search (fb->message_list, NULL); + message_list_regenerate (fb->message_list, NULL); } static int diff --git a/mail/message-list.c b/mail/message-list.c index 0ebf492872..e4d5bee062 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -13,6 +13,7 @@ #include <gnome.h> #include <bonobo/bonobo-main.h> #include "e-util/e-util.h" +#include "e-util/e-gui-utils.h" #include "camel/camel-exception.h" #include <camel/camel-folder.h> #include "message-list.h" @@ -76,76 +77,25 @@ static struct { { NULL, NULL } }; -static CamelMessageInfo * -get_message_info(MessageList *message_list, gint row) +/* Gets the CamelMessageInfo for the message displayed at the given + * view row. + */ +static const CamelMessageInfo * +get_message_info (MessageList *message_list, int row) { - CamelMessageInfo *info = NULL; - - if (message_list->search) { - if (row<message_list->match_count) { - info = message_list->summary_search_cache->pdata[row]; - if (info == NULL) { - char *uid = g_list_nth_data(message_list->matches, row); - if (uid) { - info = message_list->summary_search_cache->pdata[row] = - (CamelMessageInfo *) camel_folder_get_message_info (message_list->folder, uid); - if (!info) - g_warning ("get_message_info: unknown uid %s", uid); - } else - g_warning ("get_message_info: row %d not in matches", row); - } - } else - g_warning ("get_message_info: row %d out of range", row); - } else if (row < message_list->summary_table->len) { - ETreeModel *model = (ETreeModel *)message_list->table_model; - ETreePath *node; - - node = e_tree_model_node_at_row (model, row); - row = GPOINTER_TO_INT (e_tree_model_node_get_data (model, node)); - - if (row == -1) - return NULL; - - info = message_list->summary_table->pdata[row]; - } - - return info; -} + ETreeModel *model = (ETreeModel *)message_list->table_model; + ETreePath *node; + char *uid; -static int -get_message_row (MessageList *message_list, const char *uid) -{ - CamelMessageInfo *info; - int row; + if (row >= g_hash_table_size (message_list->uid_rowmap)) + return NULL; - if (message_list->search) { - GList *l; - - /* Yum. Linear search. See also "FIXME: This should use - * a better format" in message-list.h - */ - for (l = message_list->matches, row = 0; l; l = l->next, row++) { - if (!strcmp (uid, l->data)) - return row; - } - } else { - gpointer key, value; - - if (g_hash_table_lookup_extended (message_list->uid_rowmap, - uid, &key, &value)) - return GPOINTER_TO_INT (value); - - row = g_hash_table_size (message_list->uid_rowmap); - for (; row < message_list->summary_table->len; row++) { - info = message_list->summary_table->pdata[row]; - g_hash_table_insert (message_list->uid_rowmap, - info->uid, GINT_TO_POINTER (row)); - if (!strcmp (uid, info->uid)) - return row; - } - } + node = e_tree_model_node_at_row (model, row); + g_return_val_if_fail (node != NULL, NULL); + uid = e_tree_model_node_get_data (model, node); + g_return_val_if_fail (uid != NULL, NULL); - return -1; + return camel_folder_get_message_info (message_list->folder, uid); } /** @@ -162,7 +112,7 @@ void message_list_select_next (MessageList *message_list, int row, guint32 flags, guint32 mask) { - CamelMessageInfo *info; + const CamelMessageInfo *info; while ((info = get_message_info (message_list, row))) { if ((info->flags & mask) == flags) { @@ -202,7 +152,7 @@ select_msg (MessageList *message_list, gint row) { CamelException ex; CamelMimeMessage *message; - CamelMessageInfo *msg_info; + const CamelMessageInfo *msg_info; MailDisplay *md = message_list->parent_folder_browser->mail_display; camel_exception_init (&ex); @@ -229,67 +179,35 @@ select_msg (MessageList *message_list, gint row) mail_display_set_message (md, NULL); } -/* - * SimpleTableModel::col_count - */ -static int -ml_col_count (ETableModel *etm, void *data) -{ - return COL_LAST; -} -/* - * SimpleTableModel::row_count - */ -static int -ml_row_count (ETableModel *etm, void *data) +static GdkPixbuf * +ml_tree_icon_at (ETreeModel *etm, ETreePath *path, void *model_data) { - MessageList *message_list = data; - int v; - - if (!message_list->folder) { - return 0; - } - - if (message_list->search) { - v = message_list->match_count; - } else { - v = message_list->summary_table->len; - } - - /* in the case where no message is available, return 1 - * however, cause we want to be able to show a text */ - return (v ? v:1); - + /* we dont really need an icon ... */ + return NULL; } static void * -ml_value_at (ETableModel *etm, int col, int row, void *data) +ml_tree_value_at (ETreeModel *etm, ETreePath *path, int col, void *model_data) { + MessageList *message_list = model_data; + const CamelMessageInfo *msg_info; static char buffer [10]; - MessageList *message_list = data; - CamelFolder *folder; - CamelMessageInfo *msg_info; - CamelException ex; - void *retval = NULL; + char *uid; + void *retval; - camel_exception_init (&ex); - - folder = message_list->folder; - if (!folder) + if (!message_list->folder) goto nothing_to_see; - /* retrieve the message information array */ - msg_info = get_message_info(message_list, row); + uid = e_tree_model_node_get_data (etm, path); + if (!uid) + goto nothing_to_see; - /* - * in the case where it is zero message long - * display nothing - */ - if (msg_info == NULL) + msg_info = camel_folder_get_message_info (message_list->folder, uid); + if (!msg_info) goto nothing_to_see; - + switch (col){ case COL_ONLINE_STATUS: retval = GINT_TO_POINTER (0); @@ -390,216 +308,36 @@ ml_value_at (ETableModel *etm, int col, int row, void *data) } static void -ml_set_value_at (ETableModel *etm, int col, int row, const void *value, void *data) -{ - MessageList *message_list = data; - CamelMessageInfo *msg_info; - - switch (col) { - case COL_MESSAGE_STATUS: - msg_info = get_message_info (message_list, row); - camel_folder_set_message_flags (message_list->folder, - msg_info->uid, - CAMEL_MESSAGE_SEEN, - ~(msg_info->flags), NULL); - if (message_list->seen_id) { - gtk_timeout_remove (message_list->seen_id); - message_list->seen_id = 0; - } - break; - default: - break; - } - -} - -static gboolean -ml_is_cell_editable (ETableModel *etm, int col, int row, void *data) -{ - switch (col) { - case COL_MESSAGE_STATUS: - return TRUE; - break; - default: - return FALSE; - break; - } -} - -static void * -ml_duplicate_value (ETableModel *etm, int col, const void *value, void *data) -{ - switch (col){ - case COL_ONLINE_STATUS: - case COL_MESSAGE_STATUS: - case COL_PRIORITY: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: - return (void *) value; - - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - case COL_SIZE: - return g_strdup (value); - default: - g_assert_not_reached (); - } - return NULL; -} - -static void -ml_free_value (ETableModel *etm, int col, void *value, void *data) -{ - switch (col){ - case COL_ONLINE_STATUS: - case COL_MESSAGE_STATUS: - case COL_PRIORITY: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: - break; - - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - case COL_SIZE: - g_free (value); - break; - default: - g_assert_not_reached (); - } -} - -static void * -ml_initialize_value (ETableModel *etm, int col, void *data) -{ - switch (col){ - case COL_ONLINE_STATUS: - case COL_MESSAGE_STATUS: - case COL_PRIORITY: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: - return NULL; - - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - case COL_SIZE: - return g_strdup(""); - default: - g_assert_not_reached (); - } - - return NULL; -} - -static gboolean -ml_value_is_empty (ETableModel *etm, int col, const void *value, void *data) +ml_tree_set_value_at (ETreeModel *etm, ETreePath *path, int col, + const void *val, void *model_data) { - switch (col){ - case COL_ONLINE_STATUS: - case COL_MESSAGE_STATUS: - case COL_PRIORITY: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: - return value == NULL; + MessageList *message_list = model_data; + const CamelMessageInfo *msg_info; + char *uid; - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - case COL_SIZE: - return !(value && *(char *)value); - default: - g_assert_not_reached (); - return FALSE; - } -} + if (col != COL_MESSAGE_STATUS) + return; -static char * -ml_value_to_string (ETableModel *etm, int col, const void *value, void *data) -{ - switch (col){ - case COL_MESSAGE_STATUS: - switch ((int) value) { - case 0: - return g_strdup("Unseen"); - break; - case 1: - return g_strdup("Seen"); - break; - case 2: - return g_strdup("Answered"); - break; - default: - return g_strdup(""); - break; - } - break; - case COL_ONLINE_STATUS: - case COL_PRIORITY: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - return g_strdup_printf("%d", (int) value); - case COL_SENT: - case COL_RECEIVED: - return filter_date(value); + uid = e_tree_model_node_get_data (etm, path); + if (!uid) + return; + msg_info = camel_folder_get_message_info (message_list->folder, uid); + if (!msg_info) + return; - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - case COL_SIZE: - return g_strdup(value); - default: - g_assert_not_reached (); - return NULL; + camel_folder_set_message_flags (message_list->folder, msg_info->uid, + CAMEL_MESSAGE_SEEN, + ~(msg_info->flags), NULL); + if (message_list->seen_id) { + gtk_timeout_remove (message_list->seen_id); + message_list->seen_id = 0; } } -/* the tree versions of same ... we just map the tree nodes to the rows - of data we have */ - -static GdkPixbuf * -ml_tree_icon_at (ETreeModel *etm, ETreePath *path, void *model_data) -{ - /* we dont really need an icon ... */ - return NULL; -} - -static void * -ml_tree_value_at (ETreeModel *etm, ETreePath *path, int col, void *model_data) -{ - int row = e_tree_model_row_of_node (etm, path); - - return ml_value_at((ETableModel *)etm, col, row, model_data); -} - -static void -ml_tree_set_value_at (ETreeModel *etm, ETreePath *path, int col, const void *val, void *model_data) -{ - int row = e_tree_model_row_of_node (etm, path); - - ml_set_value_at((ETableModel *)etm, col, row, val, model_data); -} - static gboolean ml_tree_is_cell_editable (ETreeModel *etm, ETreePath *path, int col, void *model_data) { - int row = e_tree_model_row_of_node (etm, path); - - return ml_is_cell_editable((ETableModel *)etm, col, row, model_data); + return col == COL_MESSAGE_STATUS; } static void @@ -819,23 +557,12 @@ message_list_init (GtkObject *object) message_list->is_tree_view = TRUE; - if (message_list->is_tree_view) { - message_list->table_model = (ETableModel *) - e_tree_simple_new(ml_tree_icon_at, - ml_tree_value_at, - ml_tree_set_value_at, - ml_tree_is_cell_editable, - message_list); - e_tree_model_root_node_set_visible((ETreeModel *)message_list->table_model, FALSE); - } else { - message_list->table_model = e_table_simple_new ( - ml_col_count, ml_row_count, ml_value_at, - ml_set_value_at, ml_is_cell_editable, - ml_duplicate_value, ml_free_value, - ml_initialize_value, ml_value_is_empty, - ml_value_to_string, - message_list); - } + message_list->table_model = (ETableModel *) + e_tree_simple_new (ml_tree_icon_at, ml_tree_value_at, + ml_tree_set_value_at, + ml_tree_is_cell_editable, + message_list); + e_tree_model_root_node_set_visible ((ETreeModel *)message_list->table_model, FALSE); message_list_init_renderers (message_list); message_list_init_header (message_list); @@ -877,8 +604,6 @@ message_list_init (GtkObject *object) */ gtk_object_ref (GTK_OBJECT (message_list->etable)); gtk_object_sink (GTK_OBJECT (message_list->etable)); - - message_list->summary_search_cache = g_ptr_array_new(); } static void @@ -905,12 +630,8 @@ message_list_destroy (GtkObject *object) gtk_object_unref (GTK_OBJECT (message_list->etable)); - if (message_list->summary_search_cache) - g_ptr_array_free(message_list->summary_search_cache, TRUE); - if (message_list->summary_table) - camel_folder_free_summary(message_list->folder, message_list->summary_table); if (message_list->uid_rowmap) - g_hash_table_destroy(message_list->uid_rowmap); + g_hash_table_destroy (message_list->uid_rowmap); for (i = 0; i < COL_LAST; i++) gtk_object_unref (GTK_OBJECT (message_list->table_cols [i])); @@ -1035,81 +756,86 @@ message_list_new (FolderBrowser *parent_folder_browser) /* only call if we have a tree model */ /* builds the tree structure */ static void -build_tree(MessageList *ml, ETreePath *parent, struct _container *c) +build_tree (MessageList *ml, ETreePath *parent, struct _container *c, + int *row) { + ETreeModel *tree = E_TREE_MODEL (ml->table_model); ETreePath *node; while (c) { - int index=-1; - - node = e_tree_model_node_insert((ETreeModel *)ml->table_model, parent, 0, ml); + node = e_tree_model_node_insert (tree, parent, 0, ml); if (c->message) { - /* FIXME: this ugly SLOW stuff maps a message to a message index in - the message index array - probably add the array index into the container ... */ - int i; - - for (i=0;i<ml->summary_table->len;i++) { - if (c->message == ml->summary_table->pdata[i]) { - index = i; - break; - } - } + char *uid = g_strdup (c->message->uid); + + e_tree_model_node_set_data (tree, node, uid); + g_hash_table_insert (ml->uid_rowmap, uid, + GINT_TO_POINTER ((*row)++)); } - e_tree_model_node_set_data ((ETreeModel *)ml->table_model, node, (void *)index); if (c->child) { - /* by default, open all tree's */ - e_tree_model_node_set_expanded((ETreeModel *)ml->table_model, node, TRUE); - build_tree(ml, node, c->child); + /* by default, open all trees */ + e_tree_model_node_set_expanded (tree, node, TRUE); + build_tree (ml, node, c->child, row); } c = c->next; } } void -message_list_set_search (MessageList *message_list, const char *search) +message_list_regenerate (MessageList *message_list, const char *search) { - if (message_list->matches) { - /* FIXME: free contents too ... */ - g_list_free(message_list->matches); - message_list->matches = NULL; - } + ETreeModel *etm = E_TREE_MODEL (message_list->table_model); + struct _container *head; + GPtrArray *uids; + int row = 0; if (message_list->search) { - g_free(message_list->search); + g_free (message_list->search); message_list->search = NULL; } + if (message_list->uid_rowmap) + g_hash_table_destroy (message_list->uid_rowmap); + message_list->uid_rowmap = g_hash_table_new (g_str_hash, g_str_equal); + if (search) { CamelException ex; camel_exception_init (&ex); - message_list->matches = camel_folder_search_by_expression(message_list->folder, search, &ex); - message_list->search = g_strdup(search); - message_list->match_count = g_list_length(message_list->matches); - g_ptr_array_set_size(message_list->summary_search_cache, message_list->match_count); - memset(message_list->summary_search_cache->pdata, 0, sizeof(message_list->summary_search_cache->pdata[0]) * message_list->match_count); - } + uids = camel_folder_search_by_expression (message_list->folder, + search, &ex); + if (camel_exception_is_set (&ex)) { + e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, + "Search failed: %s", + camel_exception_get_description (&ex)); + camel_exception_clear (&ex); + } else + message_list->search = g_strdup (search); + } else + uids = camel_folder_get_uids (message_list->folder, NULL); - /* ok, if its a tree, build the tree here */ - /* FIXME: first free the old tree? */ - /* FIXME: what about searches? */ - if (message_list->is_tree_view) { - struct _container *head; - - /* clear the old list */ - if (message_list->tree_root) - e_tree_model_node_remove((ETreeModel *)message_list->table_model, message_list->tree_root); - - /* thread the new */ - head = thread_messages((CamelMessageInfo **)message_list->summary_table->pdata, message_list->summary_table->len); - /* and populate ... */ - message_list->tree_root = e_tree_model_node_insert((ETreeModel *)message_list->table_model, NULL, 0, message_list); - e_tree_model_node_set_expanded((ETreeModel *)message_list->table_model, message_list->tree_root, TRUE); - build_tree(message_list, message_list->tree_root, head); - /* no longer need the thread structure */ - thread_messages_free(head); - } + /* FIXME: free the old tree data */ + + /* Clear the old contents */ + if (message_list->tree_root) + e_tree_model_node_remove(etm, message_list->tree_root); + + /* Thread the new */ + head = thread_messages (message_list->folder, uids); + + /* And populate ... */ + message_list->tree_root = + e_tree_model_node_insert(etm, NULL, 0, message_list); + e_tree_model_node_set_expanded (etm, message_list->tree_root, TRUE); + build_tree (message_list, message_list->tree_root, head, &row); + + /* No longer need the thread structure or uid list */ + thread_messages_free (head); + + if (search) { + g_strfreev ((char **)uids->pdata); + g_ptr_array_free (uids, FALSE); + } else + camel_folder_free_uids (message_list->folder, uids); e_table_model_changed (message_list->table_model); message_list->rows_selected = 0; @@ -1117,17 +843,9 @@ message_list_set_search (MessageList *message_list, const char *search) } static void -folder_changed(CamelFolder *f, int type, MessageList *message_list) +folder_changed (CamelFolder *f, int type, MessageList *message_list) { - if (message_list->summary_table) - camel_folder_free_summary(f, message_list->summary_table); - message_list->summary_table = camel_folder_get_summary (f, NULL); - - if (message_list->uid_rowmap) - g_hash_table_destroy(message_list->uid_rowmap); - message_list->uid_rowmap = g_hash_table_new (g_str_hash, g_str_equal); - - message_list_set_search(message_list, message_list->search); + message_list_regenerate (message_list, message_list->search); } static void @@ -1135,10 +853,10 @@ message_changed (CamelFolder *f, const char *uid, MessageList *message_list) { int row; - row = get_message_row (message_list, uid); - if (row != -1) { + row = GPOINTER_TO_INT (g_hash_table_lookup (message_list->uid_rowmap, + uid)); + if (row != -1) e_table_model_row_changed (message_list->table_model, row); - } } void @@ -1152,12 +870,6 @@ message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder) g_return_if_fail (CAMEL_IS_FOLDER (camel_folder)); g_return_if_fail (camel_folder_has_summary_capability (camel_folder)); - if (message_list->matches) { - /* FIXME: free contents too ... */ - g_list_free(message_list->matches); - message_list->matches = NULL; - } - camel_exception_init (&ex); if (message_list->folder) @@ -1195,23 +907,13 @@ on_cursor_change_idle (gpointer data) } static void -on_cursor_change_cmd (ETable *table, - int row, - gpointer user_data) +on_cursor_change_cmd (ETable *table, int row, gpointer user_data) { MessageList *message_list; - CamelMessageInfo *info; + const CamelMessageInfo *info; message_list = MESSAGE_LIST (user_data); - /* must map the tree view row to the real message index first */ - if (message_list->is_tree_view) { - ETreePath *node; - - node = e_tree_model_node_at_row ((ETreeModel *)message_list->table_model, row); - row = (int)e_tree_model_node_get_data ((ETreeModel *)message_list->table_model, node); - } - info = get_message_info (message_list, row); if (!info) return; @@ -1263,7 +965,7 @@ static void mlfe_callback (int row, gpointer user_data) { struct message_list_foreach_data *mlfe_data = user_data; - CamelMessageInfo *info; + const CamelMessageInfo *info; info = get_message_info (mlfe_data->message_list, row); if (info) { diff --git a/mail/message-list.h b/mail/message-list.h index 942436731e..bd4c37f42e 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -69,14 +69,9 @@ struct _MessageList { CamelFolder *folder; - GPtrArray *summary_table; /* the summary of all messages */ GHashTable *uid_rowmap; char *search; /* search string */ - /* FIXME: This should use a better format ... */ - GList *matches; /* when a search has been performed ... */ - int match_count; - GPtrArray *summary_search_cache; /* summary info cache for searches */ int cursor_row, rows_selected; const char *cursor_uid; @@ -99,7 +94,7 @@ GtkType message_list_get_type (void); BonoboObject *message_list_new (FolderBrowser *parent_folder_browser); void message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder); -void message_list_set_search (MessageList *message_list, const char *search); +void message_list_regenerate (MessageList *message_list, const char *search); GtkWidget *message_list_get_widget (MessageList *message_list); void message_list_foreach (MessageList *message_list, diff --git a/mail/message-thread.c b/mail/message-thread.c index 780735bd9e..789536ba34 100644 --- a/mail/message-thread.c +++ b/mail/message-thread.c @@ -405,7 +405,7 @@ sort_thread(struct _container **cp) } struct _container * -thread_messages(CamelMessageInfo **messages, int count) +thread_messages(CamelFolder *folder, GPtrArray *uids) { GHashTable *id_table; int i; @@ -413,9 +413,9 @@ thread_messages(CamelMessageInfo **messages, int count) struct _header_references *ref; id_table = g_hash_table_new(g_str_hash, g_str_equal); - for (i=0;i<count;i++) { - CamelMessageInfo *mi; - mi = messages[i]; + for (i=0;i<uids->len;i++) { + const CamelMessageInfo *mi; + mi = camel_folder_get_message_info (folder, uids->pdata[i]); if (mi->message_id) { d(printf("doing : %s\n", mi->message_id)); c = g_hash_table_lookup(id_table, mi->message_id); diff --git a/mail/message-thread.h b/mail/message-thread.h index 6c3eaad79a..ffde0019b9 100644 --- a/mail/message-thread.h +++ b/mail/message-thread.h @@ -5,12 +5,12 @@ struct _container { struct _container *next, *parent, *child; - CamelMessageInfo *message; + const CamelMessageInfo *message; char *root_subject; /* cached root equivalent subject */ int re; /* re version of subject? */ }; -struct _container *thread_messages(CamelMessageInfo **messages, int count); +struct _container *thread_messages(CamelFolder *folder, GPtrArray *uids); void thread_messages_free(struct _container *); /* for debug only */ |