aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog13
-rw-r--r--mail/message-list.c18
-rw-r--r--mail/message-thread.c76
3 files changed, 64 insertions, 43 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 0ef37d3aac..875d3dfe2a 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,16 @@
+2000-11-20 Not Zed <NotZed@HelixCode.com>
+
+ * message-list.c (save_node_state): Save out the md5 hash of the
+ messageid as hex, since thats all we have for those nodes.
+ (build_subtree): Expand the messageid to a hex string first, then
+ check it.
+ (add_node_diff): And the same here.
+
+ * message-thread.c (thread_messages): Changed for changes to
+ messageid/references items.
+ (id_hash, id_equal): New functions to hash on the binary message id hash.
+ (thread_messages): removed some more no longer used dead code.
+
2000-11-20 Jeffrey Stedfast <fejj@helixcode.com>
* message-list.c (e_mail_address_compare): New comparison function
diff --git a/mail/message-list.c b/mail/message-list.c
index f4aa692309..3e478c388a 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -1263,7 +1263,7 @@ save_node_state(MessageList *ml, FILE *out, ETreePath *node)
if (id_is_uid(data)) {
info = camel_folder_get_message_info(ml->folder, id_uid(data));
if (info) {
- fprintf(out, "%s\n", info->message_id);
+ fprintf(out, "%08x%08x\n", info->message_id.id.part.hi, info->message_id.id.part.lo);
}
} else {
fprintf(out, "%s\n", data);
@@ -1435,9 +1435,11 @@ build_subtree (MessageList *ml, ETreePath *parent, struct _container *c, int *ro
id = new_id_from_uid(c->message->uid);
g_hash_table_insert(ml->uid_rowmap, id_uid(id), GINT_TO_POINTER ((*row)++));
if (c->child) {
- if (c->message && c->message->message_id)
- expanded = !g_hash_table_lookup(expanded_nodes, c->message->message_id) != 0;
- else
+ if (c->message) {
+ char key[17];
+ sprintf(key, "%08x%08x", c->message->message_id.id.part.hi, c->message->message_id.id.part.lo);
+ expanded = !g_hash_table_lookup(expanded_nodes, key) != 0;
+ } else
expanded = TRUE;
}
} else {
@@ -1493,9 +1495,11 @@ add_node_diff(MessageList *ml, ETreePath *parent, ETreePath *path, struct _conta
g_hash_table_remove(ml->uid_rowmap, id_uid(id));
g_hash_table_insert(ml->uid_rowmap, id_uid(id), GINT_TO_POINTER (*row));
if (c->child) {
- if (c->message && c->message->message_id)
- expanded = !g_hash_table_lookup(expanded_nodes, c->message->message_id) != 0;
- else
+ if (c->message) {
+ char key[17];
+ sprintf(key, "%08x%08x", c->message->message_id.id.part.hi, c->message->message_id.id.part.lo);
+ expanded = !g_hash_table_lookup(expanded_nodes, key) != 0;
+ } else
expanded = TRUE;
}
} else {
diff --git a/mail/message-thread.c b/mail/message-thread.c
index 098803e28e..6502437c74 100644
--- a/mail/message-thread.c
+++ b/mail/message-thread.c
@@ -100,8 +100,8 @@ prune_empty(struct _container **cp)
while (lastc->next) {
c = lastc->next;
- d(printf("checking message %p %p (%s)\n", c,
- c->message, c->message?c->message->message_id:"<empty>"));
+ d(printf("checking message %p %p (%.8s)\n", c,
+ c->message, c->message?c->message->message_id.id.hash:"<empty>"));
if (c->message == NULL) {
if (c->child == NULL) {
d(printf("removing empty node\n"));
@@ -320,7 +320,7 @@ dump_tree_rec(struct _tree_info *info, struct _container *c, int depth)
g_hash_table_insert(info->visited, c, c);
}
if (c->message) {
- printf("%s %p Subject: %s <%s>\n", p, c, c->message->subject, c->message->message_id);
+ printf("%s %p Subject: %s <%.8s>\n", p, c, c->message->subject, c->message->message_id.id.hash);
count += 1;
} else {
printf("%s %p <empty>\n", p, c);
@@ -424,6 +424,18 @@ sort_thread(struct _container **cp)
*cp = head;
}
+static guint id_hash(void *key)
+{
+ CamelSummaryMessageID *id = (CamelSummaryMessageID *)key;
+
+ return id->id.part.lo;
+}
+
+static gint id_equal(void *a, void *b)
+{
+ return ((CamelSummaryMessageID *)a)->id.id == ((CamelSummaryMessageID *)b)->id.id;
+}
+
/* NOTE: This function assumes you have obtained the relevant locks for
the folder, BEFORE calling it */
struct _thread_messages *
@@ -431,8 +443,7 @@ thread_messages(CamelFolder *folder, GPtrArray *uids)
{
GHashTable *id_table, *no_id_table;
int i;
- struct _container *c, *p, *child, *head;
- struct _header_references *ref;
+ struct _container *c, *child, *head;
struct _thread_messages *thread;
#ifdef TIMEIT
@@ -442,19 +453,19 @@ thread_messages(CamelFolder *folder, GPtrArray *uids)
gettimeofday(&start, NULL);
#endif
- id_table = g_hash_table_new(g_str_hash, g_str_equal);
+ id_table = g_hash_table_new((GHashFunc)id_hash, (GCompareFunc)id_equal);
no_id_table = g_hash_table_new(NULL, NULL);
for (i=0;i<uids->len;i++) {
const CamelMessageInfo *mi;
- mi = camel_folder_get_message_info (folder, uids->pdata[i]);
+ mi = camel_folder_get_message_info(folder, uids->pdata[i]);
if (mi == NULL) {
g_warning("Folder doesn't contain uid %s", (char *)uids->pdata[i]);
continue;
}
- if (mi->message_id) {
- c = g_hash_table_lookup(id_table, mi->message_id);
+ if (mi->message_id.id.id) {
+ c = g_hash_table_lookup(id_table, &mi->message_id);
/* check for duplicate messages */
if (c) {
/* if duplicate, just make out it is a no-id message, but try and insert it
@@ -463,9 +474,9 @@ thread_messages(CamelFolder *folder, GPtrArray *uids)
c = g_malloc0(sizeof(*c));
g_hash_table_insert(no_id_table, (void *)mi, c);
} else {
- d(printf("doing : %s\n", mi->message_id));
+ d(printf("doing : %.8s\n", mi->message_id.id.hash));
c = g_malloc0(sizeof(*c));
- g_hash_table_insert(id_table, mi->message_id, c);
+ g_hash_table_insert(id_table, (void *)&mi->message_id, c);
}
} else {
d(printf("doing : (no message id)\n"));
@@ -476,32 +487,25 @@ thread_messages(CamelFolder *folder, GPtrArray *uids)
c->message = mi;
c->order = i;
child = c;
- ref = mi->references;
- p = NULL;
- head = NULL;
- d(printf("references:\n"));
- while (ref) {
- if (ref->id == NULL) {
- /* this shouldn't actually happen, and indicates
- some problems in camel */
- d(printf("ref missing id!?\n"));
- ref = ref->next;
- continue;
- }
-
- d(printf("looking up reference: %s\n", ref->id));
- c = g_hash_table_lookup(id_table, ref->id);
- if (c == NULL) {
- d(printf("not found\n"));
- c = g_malloc0(sizeof(*c));
- g_hash_table_insert(id_table, ref->id, c);
+ if (mi->references) {
+ int j;
+
+ d(printf("references:\n"));
+ for (j=0;j<mi->references->size;j++) {
+ /* should never be empty, but just incase */
+ if (mi->references->references[j].id.id == 0)
+ continue;
+
+ c = g_hash_table_lookup(id_table, &mi->references->references[j]);
+ if (c == NULL) {
+ d(printf("not found\n"));
+ c = g_malloc0(sizeof(*c));
+ g_hash_table_insert(id_table, &mi->references->references[j], c);
+ }
+ if (c!=child)
+ container_parent_child(c, child);
+ child = c;
}
- if (c!=child)
- container_parent_child(c, child);
- child = c;
- if (head == NULL)
- head = c;
- ref = ref->next;
}
}