Mercurial > hg
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,