# HG changeset patch # User Roeland Jago Douma # Date 1362148049 -3600 # Node ID 1210a22726d3f50da1d3e711ed112ab2981d2a64 # Parent 739f440e563be0d2fd7999410249166b67581ec0 We can determine if the server supports carbons. By means of XEP-0030: Service Discovery. diff -r 739f440e563b -r 1210a22726d3 mcabber/mcabber/utils.c --- 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) { diff -r 739f440e563b -r 1210a22726d3 mcabber/mcabber/utils.h --- 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); diff -r 739f440e563b -r 1210a22726d3 mcabber/mcabber/xmpp.c --- 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"); diff -r 739f440e563b -r 1210a22726d3 mcabber/mcabber/xmpp_defines.h --- 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" diff -r 739f440e563b -r 1210a22726d3 mcabber/mcabber/xmpp_iqrequest.c --- 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,