Very basic carbons support is hacked into mcabber.
authorRoeland Jago Douma <roeland@famdouma.nl>
Sun, 03 Mar 2013 14:32:16 +0100
changeset 2105 1cc84780eb5f
parent 2104 c7e9950fa741
child 2106 72876dcf9094
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.
mcabber/mcabber/carbons.c
mcabber/mcabber/xmpp.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;
 }
--- 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));