# HG changeset patch # User Nathan Walp # Date 1141357116 0 # Node ID a580ffe73314e39b3d7d614e6af8bc51c16d770d # Parent 07286677b8b84e1687f854187148d7b66f1c15f5 [gaim-migrate @ 15757] jabber updates, including the first half of JEP-0115 support, and maybe the fix for jabber plaintext messages not having their line-endings preserved committer: Tailor Script diff -r 07286677b8b8 -r a580ffe73314 src/protocols/jabber/disco.c --- a/src/protocols/jabber/disco.c Fri Mar 03 03:00:33 2006 +0000 +++ b/src/protocols/jabber/disco.c Fri Mar 03 03:38:36 2006 +0000 @@ -25,6 +25,7 @@ #include "buddy.h" #include "iq.h" #include "disco.h" +#include "jabber.h" struct _jabber_disco_info_cb_data { @@ -46,7 +47,17 @@ if(!strcmp(type, "get")) { xmlnode *query, *identity, *feature; - JabberIq *iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, + JabberIq *iq; + + xmlnode *in_query; + const char *node = NULL; + + if((in_query = xmlnode_get_child(packet, "query"))) { + node = xmlnode_get_attrib(in_query, "node"); + } + + + iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, "http://jabber.org/protocol/disco#info"); jabber_iq_set_id(iq, xmlnode_get_attrib(packet, "id")); @@ -54,28 +65,46 @@ xmlnode_set_attrib(iq->node, "to", from); query = xmlnode_get_child(iq->node, "query"); - identity = xmlnode_new_child(query, "identity"); - xmlnode_set_attrib(identity, "category", "client"); - xmlnode_set_attrib(identity, "type", "pc"); /* XXX: bot, console, - * handheld, pc, phone, - * web */ + if(node) + xmlnode_set_attrib(query, "node", node); + + if(!node || !strcmp(node, CAPS0115_NODE "#" VERSION)) { + + identity = xmlnode_new_child(query, "identity"); + xmlnode_set_attrib(identity, "category", "client"); + xmlnode_set_attrib(identity, "type", "pc"); /* XXX: bot, console, + * handheld, pc, phone, + * web */ - SUPPORT_FEATURE("jabber:iq:last") - SUPPORT_FEATURE("jabber:iq:oob") - SUPPORT_FEATURE("jabber:iq:time") - SUPPORT_FEATURE("jabber:iq:version") - SUPPORT_FEATURE("jabber:x:conference") - SUPPORT_FEATURE("http://jabber.org/protocol/bytestreams") - SUPPORT_FEATURE("http://jabber.org/protocol/disco#info") - SUPPORT_FEATURE("http://jabber.org/protocol/disco#items") + SUPPORT_FEATURE("jabber:iq:last") + SUPPORT_FEATURE("jabber:iq:oob") + SUPPORT_FEATURE("jabber:iq:time") + SUPPORT_FEATURE("jabber:iq:version") + SUPPORT_FEATURE("jabber:x:conference") + SUPPORT_FEATURE("http://jabber.org/protocol/bytestreams") + SUPPORT_FEATURE("http://jabber.org/protocol/disco#info") + SUPPORT_FEATURE("http://jabber.org/protocol/disco#items") #if 0 - SUPPORT_FEATURE("http://jabber.org/protocol/ibb") + SUPPORT_FEATURE("http://jabber.org/protocol/ibb") #endif - SUPPORT_FEATURE("http://jabber.org/protocol/muc") - SUPPORT_FEATURE("http://jabber.org/protocol/muc#user") - SUPPORT_FEATURE("http://jabber.org/protocol/si") - SUPPORT_FEATURE("http://jabber.org/protocol/si/profile/file-transfer") - SUPPORT_FEATURE("http://jabber.org/protocol/xhtml-im") + SUPPORT_FEATURE("http://jabber.org/protocol/muc") + SUPPORT_FEATURE("http://jabber.org/protocol/muc#user") + SUPPORT_FEATURE("http://jabber.org/protocol/si") + SUPPORT_FEATURE("http://jabber.org/protocol/si/profile/file-transfer") + SUPPORT_FEATURE("http://jabber.org/protocol/xhtml-im") + } else { + xmlnode *error, *inf; + + /* XXX: gross hack, implement jabber_iq_set_type or something */ + xmlnode_set_attrib(iq->node, "type", "error"); + iq->type = JABBER_IQ_ERROR; + + error = xmlnode_new_child(query, "error"); + xmlnode_set_attrib(error, "code", "404"); + xmlnode_set_attrib(error, "type", "cancel"); + inf = xmlnode_new_child(error, "item-not-found"); + xmlnode_set_attrib(inf, "xmlns", "urn:ietf:params:xml:ns:xmpp-stanzas"); + } jabber_iq_send(iq); } else if(!strcmp(type, "result")) { diff -r 07286677b8b8 -r a580ffe73314 src/protocols/jabber/jabber.c --- a/src/protocols/jabber/jabber.c Fri Mar 03 03:00:33 2006 +0000 +++ b/src/protocols/jabber/jabber.c Fri Mar 03 03:38:36 2006 +0000 @@ -912,18 +912,14 @@ * if we were forcibly disconnected because it will crash. -- evands */ if (!gc->disconnect_timeout) - jabber_send_raw(js, "", -1); -#else +#endif jabber_send_raw(js, "", -1); -#endif if(js->gsc) { #ifdef HAVE_OPENSSL if (!gc->disconnect_timeout) +#endif gaim_ssl_close(js->gsc); -#else - gaim_ssl_close(js->gsc); -#endif } else if (js->fd > 0) { if(js->gc->inpa) gaim_input_remove(js->gc->inpa); diff -r 07286677b8b8 -r a580ffe73314 src/protocols/jabber/jabber.h --- a/src/protocols/jabber/jabber.h Fri Mar 03 03:00:33 2006 +0000 +++ b/src/protocols/jabber/jabber.h Fri Mar 03 03:38:36 2006 +0000 @@ -35,6 +35,8 @@ #include #endif +#define CAPS0115_NODE "http://gaim.sf.net/caps" + typedef enum { JABBER_CAP_NONE = 0, JABBER_CAP_XHTML = 1 << 0, diff -r 07286677b8b8 -r a580ffe73314 src/protocols/jabber/message.c --- a/src/protocols/jabber/message.c Fri Mar 03 03:00:33 2006 +0000 +++ b/src/protocols/jabber/message.c Fri Mar 03 03:38:36 2006 +0000 @@ -283,8 +283,11 @@ if(!jm->thread_id) jm->thread_id = xmlnode_get_data(child); } else if(!strcmp(child->name, "body")) { - if(!jm->body) - jm->body = xmlnode_to_str(child, NULL); + if(!jm->body) { + char *msg = xmlnode_to_str(child, NULL); + jm->body = gaim_strdup_withhtml(msg); + g_free(msg); + } } else if(!strcmp(child->name, "html")) { if(!jm->xhtml && xmlnode_get_child(child, "body")) jm->xhtml = xmlnode_to_str(child, NULL); diff -r 07286677b8b8 -r a580ffe73314 src/protocols/jabber/presence.c --- a/src/protocols/jabber/presence.c Fri Mar 03 03:00:33 2006 +0000 +++ b/src/protocols/jabber/presence.c Fri Mar 03 03:38:36 2006 +0000 @@ -136,13 +136,11 @@ xmlnode *jabber_presence_create(JabberBuddyState state, const char *msg, int priority) { - xmlnode *show, *status, *presence, *pri; + xmlnode *show, *status, *presence, *pri, *c; const char *show_string = NULL; - presence = xmlnode_new("presence"); - if(state == JABBER_BUDDY_STATE_UNAVAILABLE) xmlnode_set_attrib(presence, "type", "unavailable"); else if(state != JABBER_BUDDY_STATE_ONLINE && @@ -167,6 +165,12 @@ g_free(pstr); } + /* JEP-0115 */ + c = xmlnode_new_child(presence, "c"); + xmlnode_set_attrib(c, "xmlns", "http://jabber.org/protocol/caps"); + xmlnode_set_attrib(c, "node", CAPS0115_NODE); + xmlnode_set_attrib(c, "ver", VERSION); + return presence; }