/* 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; 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 */ 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; } }
static void set_message (MuMsgBodyView *self, MuMsg *msg) { if (self->_priv->_msg == msg) return; /* nothing to todo */ if (self->_priv->_msg) { mu_msg_unref (self->_priv->_msg); self->_priv->_msg = NULL; } if (msg) self->_priv->_msg = mu_msg_ref (msg); }
MuContainer* mu_container_new (MuMsg *msg, guint docid, const char *msgid) { MuContainer *c; g_return_val_if_fail (!msg || docid != 0, NULL); c = g_slice_new0 (MuContainer); if (msg) c->msg = mu_msg_ref (msg); c->docid = docid; c->msgid = msgid; return c; }