From: Nathan W. <fac...@us...> - 2006-03-03 03:38:43
|
Update of /cvsroot/gaim/gaim/src/protocols/jabber In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2830/src/protocols/jabber Modified Files: disco.c jabber.c jabber.h message.c presence.c Log Message: jabber updates, including the first half of JEP-0115 support, and maybe the fix for jabber plaintext messages not having their line-endings preserved Index: disco.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/disco.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -p -r1.2 -r1.3 --- disco.c 17 Oct 2005 01:43:09 -0000 1.2 +++ disco.c 3 Mar 2006 03:38:36 -0000 1.3 @@ -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 @@ void jabber_disco_info_parse(JabberStrea 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 @@ void jabber_disco_info_parse(JabberStrea 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); - 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(!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") #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")) { Index: jabber.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/jabber.c,v retrieving revision 1.332 retrieving revision 1.333 diff -u -d -p -r1.332 -r1.333 --- jabber.c 16 Feb 2006 02:00:22 -0000 1.332 +++ jabber.c 3 Mar 2006 03:38:36 -0000 1.333 @@ -912,18 +912,14 @@ static void jabber_close(GaimConnection * if we were forcibly disconnected because it will crash. -- evands */ if (!gc->disconnect_timeout) - jabber_send_raw(js, "</stream:stream>", -1); -#else - jabber_send_raw(js, "</stream:stream>", -1); #endif + jabber_send_raw(js, "</stream:stream>", -1); if(js->gsc) { #ifdef HAVE_OPENSSL if (!gc->disconnect_timeout) - gaim_ssl_close(js->gsc); -#else - gaim_ssl_close(js->gsc); #endif + gaim_ssl_close(js->gsc); } else if (js->fd > 0) { if(js->gc->inpa) gaim_input_remove(js->gc->inpa); Index: jabber.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/jabber.h,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -p -r1.23 -r1.24 --- jabber.h 9 Feb 2006 04:17:56 -0000 1.23 +++ jabber.h 3 Mar 2006 03:38:36 -0000 1.24 @@ -35,6 +35,8 @@ #include <sasl/sasl.h> #endif +#define CAPS0115_NODE "http://gaim.sf.net/caps" + typedef enum { JABBER_CAP_NONE = 0, JABBER_CAP_XHTML = 1 << 0, Index: message.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/message.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -p -r1.49 -r1.50 --- message.c 16 Feb 2006 23:02:56 -0000 1.49 +++ message.c 3 Mar 2006 03:38:36 -0000 1.50 @@ -283,8 +283,11 @@ void jabber_message_parse(JabberStream * 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); Index: presence.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/jabber/presence.c,v retrieving revision 1.89 retrieving revision 1.90 diff -u -d -p -r1.89 -r1.90 --- presence.c 10 Feb 2006 15:42:53 -0000 1.89 +++ presence.c 3 Mar 2006 03:38:36 -0000 1.90 @@ -136,13 +136,11 @@ void jabber_presence_send(GaimAccount *a 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 @@ xmlnode *jabber_presence_create(JabberBu 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; } |