# HG changeset patch # User Evan Schoenberg # Date 1168214890 0 # Node ID 4bcc40bd4e2068f22170f2a65acc509fc472eeb6 # Parent 0e8f0468a809647e7cf22c0ccc7e383505b68cfa [gaim-migrate @ 18084] If the Jabber server does not support the server discovery info (http://jabber.org/protocol/disco#info) we still need to request the roster and send initial presence. committer: Tailor Script diff -r 0e8f0468a809 -r 4bcc40bd4e20 libgaim/protocols/jabber/disco.c --- a/libgaim/protocols/jabber/disco.c Sun Jan 07 20:05:46 2007 +0000 +++ b/libgaim/protocols/jabber/disco.c Mon Jan 08 00:08:10 2007 +0000 @@ -21,6 +21,7 @@ #include "internal.h" #include "prefs.h" +#include "debug.h" #include "buddy.h" #include "google.h" @@ -214,27 +215,50 @@ } static void -jabber_disco_server_info_result_cb(JabberStream *js, xmlnode *packet, gpointer data) +jabber_disco_finish_server_info_result_cb(JabberStream *js) { GaimPresence *gpresence; GaimStatus *status; + + if (!(js->server_caps & JABBER_CAP_GOOGLE_ROSTER)) { + /* If the server supports JABBER_CAP_GOOGLE_ROSTER; we will have already requested it */ + jabber_roster_request(js); + } + + /* Send initial presence; this will trigger receipt of presence for contacts on the roster */ + gpresence = gaim_account_get_presence(js->gc->account); + status = gaim_presence_get_active_status(gpresence); + jabber_presence_send(js->gc->account, status); +} + +static void +jabber_disco_server_info_result_cb(JabberStream *js, xmlnode *packet, gpointer data) +{ xmlnode *query, *child; const char *from = xmlnode_get_attrib(packet, "from"); const char *type = xmlnode_get_attrib(packet, "type"); - if(!from || !type) + if(!from || !type) { return; + } - if(strcmp(from, js->user->domain)) + if(strcmp(from, js->user->domain)) { return; + } - if(strcmp(type, "result")) + if(strcmp(type, "result")) { + /* A common way to get here is for the server not to support xmlns http://jabber.org/protocol/disco#info */ + jabber_disco_finish_server_info_result_cb(js); return; + } query = xmlnode_get_child(packet, "query"); - - if (!query) return; - + + if (!query) { + jabber_disco_finish_server_info_result_cb(js); + return; + } + for (child = xmlnode_get_child(query, "category"); child; child = xmlnode_get_next_twin(child)) { const char *category, *type, *name; @@ -254,7 +278,7 @@ if (!strcmp(name, "Google Talk")) js->googletalk = TRUE; } - + for (child = xmlnode_get_child(query, "feature"); child; child = xmlnode_get_next_twin(child)) { const char *var; @@ -271,12 +295,7 @@ } } - if (!(js->server_caps & JABBER_CAP_GOOGLE_ROSTER)) - jabber_roster_request(js); - - gpresence = gaim_account_get_presence(js->gc->account); - status = gaim_presence_get_active_status(gpresence); - jabber_presence_send(js->gc->account, status); + jabber_disco_finish_server_info_result_cb(js); } static void