changeset 2103:1210a22726d3

We can determine if the server supports carbons. By means of XEP-0030: Service Discovery.
author Roeland Jago Douma <roeland@famdouma.nl>
date Fri, 01 Mar 2013 15:27:29 +0100
parents 739f440e563b
children c7e9950fa741
files mcabber/mcabber/utils.c mcabber/mcabber/utils.h mcabber/mcabber/xmpp.c mcabber/mcabber/xmpp_defines.h mcabber/mcabber/xmpp_iqrequest.c
diffstat 5 files changed, 46 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/utils.c	Sun May 11 15:08:02 2014 +0200
+++ b/mcabber/mcabber/utils.c	Fri Mar 01 15:27:29 2013 +0100
@@ -91,6 +91,19 @@
   return username;
 }
 
+char *get_servername(const char *username, const char *servername)
+{
+  char *ptr;
+  char *server;
+
+  if ((ptr = strchr(username, JID_DOMAIN_SEPARATOR)) != NULL) {
+    server = g_strdup(ptr+1);
+    return server;
+  }
+
+  return servername;
+}
+
 char *compose_jid(const char *username, const char *servername,
                   const char *resource)
 {
--- a/mcabber/mcabber/utils.h	Sun May 11 15:08:02 2014 +0200
+++ b/mcabber/mcabber/utils.h	Fri Mar 01 15:27:29 2013 +0100
@@ -16,6 +16,7 @@
 
 char *jidtodisp(const char *fjid);
 char *jid_get_username(const char *fjid);
+char *get_servername(const char *username, const char *servername);
 char *compose_jid(const char *username, const char *servername,
                   const char *resource);
 gboolean jid_equal(const char *jid1, const char *jid2);
--- a/mcabber/mcabber/xmpp.c	Sun May 11 15:08:02 2014 +0200
+++ b/mcabber/mcabber/xmpp.c	Fri Mar 01 15:27:29 2013 +0100
@@ -852,6 +852,7 @@
   if (success) {
 
     xmpp_iq_request(NULL, NS_ROSTER);
+    xmpp_iq_request(NULL, NS_DISCO_INFO);
     xmpp_request_storage("storage:bookmarks");
     xmpp_request_storage("storage:rosternotes");
 
--- a/mcabber/mcabber/xmpp_defines.h	Sun May 11 15:08:02 2014 +0200
+++ b/mcabber/mcabber/xmpp_defines.h	Fri Mar 01 15:27:29 2013 +0100
@@ -61,6 +61,9 @@
 #define NS_PING       "urn:xmpp:ping"
 #define NS_RECEIPTS   "urn:xmpp:receipts"
 
+//XEP-0280 (message carbons)
+#define NS_CARBONS_2 "urn:xmpp:carbons:2"
+
 #define NS_JABBERD_STOREDPRESENCE "http://jabberd.org/ns/storedpresence"
 #define NS_JABBERD_HISTORY "http://jabberd.org/ns/history"
 
--- a/mcabber/mcabber/xmpp_iqrequest.c	Sun May 11 15:08:02 2014 +0200
+++ b/mcabber/mcabber/xmpp_iqrequest.c	Fri Mar 01 15:27:29 2013 +0100
@@ -47,6 +47,9 @@
                                LmMessage *m, gpointer user_data);
 static LmHandlerResult cb_vcard(LmMessageHandler *h, LmConnection *c,
                                LmMessage *m, gpointer user_data);
+static LmHandlerResult cb_disco_info(LmMessageHandler *h, LmConnection *c,
+                               LmMessage *m, gpointer user_data);
+
 
 static struct IqRequestHandlers
 {
@@ -60,6 +63,7 @@
   {NS_LAST,     "query", &cb_last},
   {NS_PING,     "ping",  &cb_ping},
   {NS_VCARD,    "vCard", &cb_vcard},
+  {NS_DISCO_INFO, "query", &cb_disco_info},
   {NULL, NULL, NULL}
 };
 
@@ -75,6 +79,26 @@
   vcard_pref    = 1<<7,
 };
 
+static LmHandlerResult cb_disco_info(LmMessageHandler *h, LmConnection *c,
+                               LmMessage *m, gpointer user_data)
+{
+  LmMessageNode *ansqry;
+  LmMessageNode *feature;
+
+  ansqry = lm_message_node_get_child(m->node, "query");
+
+  feature = lm_message_node_get_child(ansqry, "feature");
+  for(;feature;feature = feature->next) {
+    const char *v = lm_message_node_get_attribute(feature, "var");
+
+    if (!g_strcmp0(v, NS_CARBONS_2)) {
+     scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "We have carbons!");       
+    }
+  }
+
+  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
+}
+
 static LmHandlerResult cb_ping(LmMessageHandler *h, LmConnection *c,
                                LmMessage *m, gpointer user_data)
 {
@@ -159,6 +183,10 @@
     gettimeofday(now, NULL);
     data = (gpointer)now;
     notifier = g_free;
+  } else if (!g_strcmp0(xmlns, NS_DISCO_INFO)) {
+    gchar *servername = get_servername(settings_opt_get("jid"), settings_opt_get("server"));
+    lm_message_node_set_attribute(iq->node, "to", servername);
+    g_free(servername);
   }
 
   handler = lm_message_handler_new(iq_request_handlers[i].handler,