static gboolean output_xml (MuMsg *msg, MuMsgIter *iter, MuConfig *opts, GError **err) { g_print ("\t<message>\n"); print_attr_xml ("from", mu_msg_get_from (msg)); print_attr_xml ("to", mu_msg_get_to (msg)); print_attr_xml ("cc", mu_msg_get_cc (msg)); print_attr_xml ("subject", mu_msg_get_subject (msg)); g_print ("\t\t<date>%u</date>\n", (unsigned)mu_msg_get_date (msg)); g_print ("\t\t<size>%u</size>\n", (unsigned)mu_msg_get_size (msg)); print_attr_xml ("msgid", mu_msg_get_msgid (msg)); print_attr_xml ("path", mu_msg_get_path (msg)); print_attr_xml ("maildir", mu_msg_get_maildir (msg)); g_print ("\t</message>\n"); return TRUE; }
/* find a container for the given msgid; if it does not exist yet, * create a new one, and register it */ static MuContainer* find_or_create (GHashTable *id_table, MuMsg *msg, guint docid) { MuContainer *c; const char* msgid; char fake[32]; g_return_val_if_fail (msg, NULL); g_return_val_if_fail (docid != 0, NULL); msgid = mu_msg_get_msgid (msg); if (!msgid) msgid = mu_msg_get_path (msg); /* fake it */ if (!msgid) { /* no path either? seems to happen... */ g_warning ("message without path"); snprintf (fake, sizeof(fake), "fake:%p", (gpointer)msg); msgid = fake; } /* XXX the '<none>' works around a crash; find a better * solution */ c = g_hash_table_lookup (id_table, msgid); /* If id_table contains an empty MuContainer for this ID: * * * Store this message in the MuContainer's message slot. */ if (c) { if (!c->msg) { c->msg = mu_msg_ref (msg); c->docid = docid; return c; } else { /* special case, not in the JWZ algorithm: the * container exists already and has a message; this * means that we are seeing *another message* with a * message-id we already saw... create this message, * and mark it as a duplicate, and a child of the one * we saw before; use its path as a fake message-id * */ MuContainer *c2; const char* fake_msgid; fake_msgid = mu_msg_get_path (msg); c2 = mu_container_new (msg, docid, fake_msgid); c2->flags = MU_CONTAINER_FLAG_DUP; /*c = */ mu_container_append_children (c, c2); g_hash_table_insert (id_table, (gpointer)fake_msgid, c2); return NULL; /* don't process this message further */ } } else { /* Else: Create a new MuContainer object holding this message; Index the MuContainer by Message-ID in id_table. */ c = mu_container_new (msg, docid, msgid); g_hash_table_insert (id_table, (gpointer)msgid, c); /* assert_no_duplicates (id_table); */ return c; } }