|
Lines 201-207
Link Here
|
| 201 |
MsgFlags default_flags; |
201 |
MsgFlags default_flags; |
| 202 |
gchar file_buf[BUFFSIZE]; |
202 |
gchar file_buf[BUFFSIZE]; |
| 203 |
guint32 num; |
203 |
guint32 num; |
|
|
204 |
gint refnum; |
| 204 |
FolderType type; |
205 |
FolderType type; |
|
|
206 |
gchar *ref; |
| 205 |
|
207 |
|
| 206 |
g_return_val_if_fail(item != NULL, NULL); |
208 |
g_return_val_if_fail(item != NULL, NULL); |
| 207 |
g_return_val_if_fail(item->folder != NULL, NULL); |
209 |
g_return_val_if_fail(item->folder != NULL, NULL); |
|
Lines 257-262
Link Here
|
| 257 |
READ_CACHE_DATA(msginfo->msgid, fp); |
259 |
READ_CACHE_DATA(msginfo->msgid, fp); |
| 258 |
READ_CACHE_DATA(msginfo->inreplyto, fp); |
260 |
READ_CACHE_DATA(msginfo->inreplyto, fp); |
| 259 |
|
261 |
|
|
|
262 |
READ_CACHE_DATA_INT(refnum, fp); |
| 263 |
for (; refnum != 0; refnum--) { |
| 264 |
READ_CACHE_DATA(ref, fp); |
| 265 |
msginfo->references = g_slist_append |
| 266 |
(msginfo->references, ref); |
| 267 |
} |
| 268 |
|
| 260 |
MSG_SET_PERM_FLAGS(msginfo->flags, default_flags.perm_flags); |
269 |
MSG_SET_PERM_FLAGS(msginfo->flags, default_flags.perm_flags); |
| 261 |
MSG_SET_TMP_FLAGS(msginfo->flags, default_flags.tmp_flags); |
270 |
MSG_SET_TMP_FLAGS(msginfo->flags, default_flags.tmp_flags); |
| 262 |
|
271 |
|
|
Lines 443-448
Link Here
|
| 443 |
void procmsg_write_cache(MsgInfo *msginfo, FILE *fp) |
452 |
void procmsg_write_cache(MsgInfo *msginfo, FILE *fp) |
| 444 |
{ |
453 |
{ |
| 445 |
MsgTmpFlags flags = msginfo->flags.tmp_flags & MSG_CACHED_FLAG_MASK; |
454 |
MsgTmpFlags flags = msginfo->flags.tmp_flags & MSG_CACHED_FLAG_MASK; |
|
|
455 |
GSList *refs; |
| 446 |
|
456 |
|
| 447 |
WRITE_CACHE_DATA_INT(msginfo->msgnum, fp); |
457 |
WRITE_CACHE_DATA_INT(msginfo->msgnum, fp); |
| 448 |
WRITE_CACHE_DATA_INT(msginfo->size, fp); |
458 |
WRITE_CACHE_DATA_INT(msginfo->size, fp); |
|
Lines 459-464
Link Here
|
| 459 |
WRITE_CACHE_DATA(msginfo->subject, fp); |
469 |
WRITE_CACHE_DATA(msginfo->subject, fp); |
| 460 |
WRITE_CACHE_DATA(msginfo->msgid, fp); |
470 |
WRITE_CACHE_DATA(msginfo->msgid, fp); |
| 461 |
WRITE_CACHE_DATA(msginfo->inreplyto, fp); |
471 |
WRITE_CACHE_DATA(msginfo->inreplyto, fp); |
|
|
472 |
|
| 473 |
WRITE_CACHE_DATA_INT(g_slist_length(msginfo->references), fp); |
| 474 |
if (g_slist_length(msginfo->references)) |
| 475 |
for (refs = msginfo->references; refs; refs = refs->next) |
| 476 |
WRITE_CACHE_DATA(((gchar *)refs->data), fp); |
| 462 |
} |
477 |
} |
| 463 |
|
478 |
|
| 464 |
void procmsg_write_flags(MsgInfo *msginfo, FILE *fp) |
479 |
void procmsg_write_flags(MsgInfo *msginfo, FILE *fp) |
|
Lines 752-757
Link Here
|
| 752 |
GHashTable *table; |
767 |
GHashTable *table; |
| 753 |
MsgInfo *msginfo; |
768 |
MsgInfo *msginfo; |
| 754 |
const gchar *msgid; |
769 |
const gchar *msgid; |
|
|
770 |
GSList *reflist; |
| 755 |
|
771 |
|
| 756 |
root = g_node_new(NULL); |
772 |
root = g_node_new(NULL); |
| 757 |
table = g_hash_table_new(g_str_hash, g_str_equal); |
773 |
table = g_hash_table_new(g_str_hash, g_str_equal); |
|
Lines 762-768
Link Here
|
| 762 |
|
778 |
|
| 763 |
if (msginfo->inreplyto) { |
779 |
if (msginfo->inreplyto) { |
| 764 |
parent = g_hash_table_lookup(table, msginfo->inreplyto); |
780 |
parent = g_hash_table_lookup(table, msginfo->inreplyto); |
| 765 |
if (parent == NULL) |
781 |
|
|
|
782 |
/* check references */ |
| 783 |
if (!parent && msginfo->references) |
| 784 |
for (reflist = msginfo->references; |
| 785 |
reflist != NULL; |
| 786 |
reflist = reflist->next) |
| 787 |
if ((parent = g_hash_table_lookup |
| 788 |
(table, reflist->data))) |
| 789 |
break; |
| 790 |
if (parent == NULL) |
| 766 |
parent = root; |
791 |
parent = root; |
| 767 |
} |
792 |
} |
| 768 |
node = g_node_insert_data_before |
793 |
node = g_node_insert_data_before |
|
Lines 777-792
Link Here
|
| 777 |
for (node = root->children; node != NULL; ) { |
802 |
for (node = root->children; node != NULL; ) { |
| 778 |
next = node->next; |
803 |
next = node->next; |
| 779 |
msginfo = (MsgInfo *)node->data; |
804 |
msginfo = (MsgInfo *)node->data; |
| 780 |
if (msginfo->inreplyto) { |
805 |
parent = NULL; |
|
|
806 |
|
| 807 |
/* check in reply to */ |
| 808 |
if (msginfo->inreplyto) |
| 781 |
parent = g_hash_table_lookup(table, msginfo->inreplyto); |
809 |
parent = g_hash_table_lookup(table, msginfo->inreplyto); |
| 782 |
/* node should not be the parent, and node should not |
810 |
|
| 783 |
be an ancestor of parent (circular reference) */ |
811 |
/* check references */ |
| 784 |
if (parent && parent != node && |
812 |
if (!parent && msginfo->references) |
| 785 |
!g_node_is_ancestor(node, parent)) { |
813 |
for (reflist = msginfo->references; |
| 786 |
g_node_unlink(node); |
814 |
reflist != NULL; |
| 787 |
g_node_insert_before |
815 |
reflist = reflist->next) |
| 788 |
(parent, parent->children, node); |
816 |
if ((parent = g_hash_table_lookup |
| 789 |
} |
817 |
(table, reflist->data))) |
|
|
818 |
break; |
| 819 |
|
| 820 |
/* node should not be the parent, and node should not |
| 821 |
be an ancestor of parent (circular reference) */ |
| 822 |
if (parent && parent != node && |
| 823 |
!g_node_is_ancestor(node, parent)) { |
| 824 |
g_node_unlink(node); |
| 825 |
g_node_insert_before |
| 826 |
(parent, parent->children, node); |
| 790 |
} |
827 |
} |
| 791 |
node = next; |
828 |
node = next; |
| 792 |
} |
829 |
} |
|
Lines 1419-1428
Link Here
|
| 1419 |
return full_msginfo; |
1456 |
return full_msginfo; |
| 1420 |
} |
1457 |
} |
| 1421 |
|
1458 |
|
|
|
1459 |
static void free_references(gpointer data, gpointer user) |
| 1460 |
{ |
| 1461 |
g_free(data); |
| 1462 |
} |
| 1463 |
|
| 1422 |
void procmsg_msginfo_free(MsgInfo *msginfo) |
1464 |
void procmsg_msginfo_free(MsgInfo *msginfo) |
| 1423 |
{ |
1465 |
{ |
| 1424 |
if (msginfo == NULL) return; |
1466 |
if (msginfo == NULL) return; |
| 1425 |
|
1467 |
|
|
|
1468 |
g_slist_foreach(msginfo->references, |
| 1469 |
free_references, NULL); |
| 1470 |
g_slist_free(msginfo->references); |
| 1471 |
|
| 1426 |
g_free(msginfo->xface); |
1472 |
g_free(msginfo->xface); |
| 1427 |
|
1473 |
|
| 1428 |
g_free(msginfo->fromname); |
1474 |
g_free(msginfo->fromname); |