changeset 2105:1cc84780eb5f

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.
author Roeland Jago Douma <roeland@famdouma.nl>
date Sun, 03 Mar 2013 14:32:16 +0100
parents c7e9950fa741
children 72876dcf9094
files mcabber/mcabber/carbons.c mcabber/mcabber/xmpp.c
diffstat 2 files changed, 36 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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));