We can determine if the server supports carbons. By means of XEP-0030: Service
Discovery.
--- 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,