# HG changeset patch # User Roeland Jago Douma # Date 1362317536 -3600 # Node ID 1cc84780eb5f66766b5211ae5d986bec8383fc92 # Parent c7e9950fa741342fcb1674e646ba61eb7c5f7d59 Very basic carbons support is hacked into mcabber. Messages are now intercepted and parsed. It probably makes more sense to implement XEP-0297: Stanza Forwarding in a more general way. A better way to display the carbons (so the user actually knows it is a carbon message) is in the pipeline. diff -r c7e9950fa741 -r 1cc84780eb5f mcabber/mcabber/carbons.c --- a/mcabber/mcabber/carbons.c Sat Mar 02 18:22:10 2013 +0100 +++ b/mcabber/mcabber/carbons.c Sun Mar 03 14:32:16 2013 +0100 @@ -62,6 +62,5 @@ static LmHandlerResult cb_carbons_enable(LmMessageHandler *h, LmConnection *c, LmMessage *m, gpointer user_data) { - scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "We have a response! O Yeah!"); return LM_HANDLER_RESULT_REMOVE_MESSAGE; } diff -r c7e9950fa741 -r 1cc84780eb5f mcabber/mcabber/xmpp.c --- a/mcabber/mcabber/xmpp.c Sat Mar 02 18:22:10 2013 +0100 +++ b/mcabber/mcabber/xmpp.c Sun Mar 03 14:32:16 2013 +0100 @@ -1273,7 +1273,42 @@ handle_state_events(from, m->node); } - if (from && (body || subject)) + // Check for carbons! + x = lm_message_node_find_xmlns(m->node, NS_CARBONS_2); + char carbons = 0; + if (x) { + carbons = 1; + // Parse a message that is send to one of our other resources + if (!g_strcmp0(x->name, "received")) { + // Go 1 level deeper to the forwarded message + x = lm_message_node_find_xmlns(x, "urn:xmpp:forward:0"); + x = lm_message_node_get_child(x, "message"); + + from = lm_message_node_get_attribute(x, "from"); + g_free(bjid); + bjid = g_strdup(from); + res = strchr(bjid, JID_RESOURCE_SEPARATOR); + if (res) *res++ = 0; + scr_WriteIncomingMessage(bjid, body, timestamp, HBB_PREFIX_IN, 0); + + scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "carbon from:%s", lm_message_node_get_attribute(x, "from")); + + } else if (!g_strcmp0(x->name, "sent")) { + x = lm_message_node_find_xmlns(x, "urn:xmpp:forward:0"); + x = lm_message_node_get_child(x, "message"); + + const char *to= lm_message_node_get_attribute(x, "to"); + g_free(bjid); + bjid = g_strdup(to); + res = strchr(bjid, JID_RESOURCE_SEPARATOR); + if (res) *res++ = 0; + + scr_write_outgoing_message(bjid, body, 0, NULL); + } + } + + + if (from && (body || subject) && !carbons) gotmessage(mstype, from, body, enc, subject, timestamp, lm_message_node_find_xmlns(m->node, NS_SIGNED));