properly set the parent nodes for the re-parented phantom-node children.

2004-05-07  Not Zed  <NotZed@Ximian.com>

        * camel-folder-thread.c (thread_summary): properly set the parent
        nodes for the re-parented phantom-node children.  Wasn't that fun
        to debug!

        * camel-folder-thread.h: make order and re bitfields, saves 4
        bytes/node.

svn path=/trunk/; revision=25822
This commit is contained in:
Not Zed
2004-05-07 07:08:09 +00:00
committed by Michael Zucci
parent 27176351ae
commit 4e919deeff
3 changed files with 33 additions and 10 deletions

View File

@ -1,3 +1,12 @@
2004-05-07 Not Zed <NotZed@Ximian.com>
* camel-folder-thread.c (thread_summary): properly set the parent
nodes for the re-parented phantom-node children. Wasn't that fun
to debug!
* camel-folder-thread.h: make order and re bitfields, saves 4
bytes/node.
2004-05-06 Not Zed <NotZed@Ximian.com>
* providers/imap/camel-imap-store.c (connect_to_server): set

View File

@ -37,7 +37,8 @@
#include "camel-folder-thread.h"
#include "e-util/e-memory.h"
#define d(x)
#define d(x)
#define m(x)
/*#define TIMEIT*/
@ -114,6 +115,7 @@ prune_empty(CamelFolderThread *thread, CamelFolderThreadNode **cp)
if (c->child == NULL) {
d(printf("removing empty node\n"));
lastc->next = c->next;
m(memset(c, 0xfe, sizeof(*c)));
e_memchunk_free(thread->node_chunks, c);
continue;
}
@ -151,13 +153,13 @@ hashloop(void *key, void *value, void *data)
}
static char *
get_root_subject(CamelFolderThreadNode *c, int *re)
get_root_subject(CamelFolderThreadNode *c)
{
char *s, *p;
CamelFolderThreadNode *scan;
s = NULL;
*re = FALSE;
c->re = FALSE;
if (c->message)
s = (char *)camel_message_info_subject(c->message);
else {
@ -183,7 +185,7 @@ get_root_subject(CamelFolderThreadNode *c, int *re)
while (isdigit(*p) || (ispunct(*p) && (*p != ':')))
p++;
if (*p==':') {
*re = TRUE;
c->re = TRUE;
s = p+1;
} else
break;
@ -235,7 +237,7 @@ group_root_set(CamelFolderThread *thread, CamelFolderThreadNode **cp)
clast = (CamelFolderThreadNode *)cp;
c = clast->next;
while (c) {
c->root_subject = get_root_subject(c, &c->re);
c->root_subject = get_root_subject(c);
if (c->root_subject) {
container = g_hash_table_lookup(subject_table, c->root_subject);
if (container == NULL
@ -264,6 +266,7 @@ group_root_set(CamelFolderThread *thread, CamelFolderThreadNode **cp)
scan = scan->next;
scan->next = c->child;
clast->next = c->next;
m(memset(c, 0xee, sizeof(*c)));
e_memchunk_free(thread->node_chunks, c);
continue;
} if (c->message == NULL && container->message != NULL) {
@ -521,17 +524,25 @@ thread_summary(CamelFolderThread *thread, GPtrArray *summary)
child = c->next;
if (child->message == NULL) {
newtop = child->child;
newtop->parent = NULL;
/* unlink pseudo node */
c->next = newtop;
/* link its siblings onto the end of its children */
/* link its siblings onto the end of its children, fix all parent pointers */
scan = (CamelFolderThreadNode *)&newtop->child;
while (scan->next)
while (scan->next) {
scan = scan->next;
}
scan->next = newtop->next;
while (scan->next) {
scan = scan->next;
scan->parent = newtop;
}
/* and link the now 'real' node into the list */
newtop->next = child->next;
c = newtop;
m(memset(child, 0xde, sizeof(*child)));
e_memchunk_free(thread->node_chunks, child);
} else {
c = child;
@ -544,6 +555,8 @@ thread_summary(CamelFolderThread *thread, GPtrArray *summary)
c = c->next;
if (c->message == NULL)
g_warning("threading missed removing a pseudo node: %s\n", c->root_subject);
if (c->parent != NULL)
g_warning("base node has a non-null parent: %s\n", c->root_subject);
}
thread->tree = head;
@ -616,7 +629,8 @@ camel_folder_thread_messages_new (CamelFolder *folder, GPtrArray *uids, gboolean
thread_summary(thread, summary);
g_hash_table_destroy(wanted);
if (wanted)
g_hash_table_destroy(wanted);
return thread;
}

View File

@ -36,8 +36,8 @@ typedef struct _CamelFolderThreadNode {
*child;
const CamelMessageInfo *message;
char *root_subject; /* cached root equivalent subject */
int re; /* re version of subject? */
int order;
guint32 order:31;
guint32 re:1; /* re version of subject? */
} CamelFolderThreadNode;
typedef struct _CamelFolderThread {