# HG changeset patch # User Paul Aurich # Date 1249091582 0 # Node ID 1ea1aee7184834c08c26850d4088d9597cbdb5ef # Parent 9d43d9d33477b2a4b05cc13f1597373c8d489898 jabber: Fix setting Google Talk avatar at login. Google Talk (at some point) started returning IQ errors when setting the avatar in the first 10 seconds of login. This was reported by Bill Lovett to the jdev mailing list and he included the 10-second "magic number". diff -r 9d43d9d33477 -r 1ea1aee71848 libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Fri Jul 31 14:40:03 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.c Sat Aug 01 01:53:02 2009 +0000 @@ -463,6 +463,11 @@ if(!js->vcard_fetched) return; + if (js->vcard_timer) { + purple_timeout_remove(js->vcard_timer); + js->vcard_timer = 0; + } + g_free(js->avatar_hash); js->avatar_hash = NULL; @@ -854,12 +859,26 @@ } } +static gboolean +set_own_vcard_cb(gpointer data) +{ + JabberStream *js = data; + PurpleAccount *account = purple_connection_get_account(js->gc); + + js->vcard_timer = 0; + + jabber_set_info(js->gc, purple_account_get_user_info(account)); + + return FALSE; +} + static void jabber_vcard_save_mine(JabberStream *js, const char *from, JabberIqType type, const char *id, xmlnode *packet, gpointer data) { xmlnode *vcard, *photo, *binval; char *txt, *vcard_hash = NULL; + PurpleAccount *account; if (type == JABBER_IQ_ERROR) { xmlnode *error; @@ -870,12 +889,13 @@ return; } + account = purple_connection_get_account(js->gc); + if((vcard = xmlnode_get_child(packet, "vCard")) || (vcard = xmlnode_get_child_with_namespace(packet, "query", "vcard-temp"))) { txt = xmlnode_to_str(vcard, NULL); - purple_account_set_user_info(purple_connection_get_account(js->gc), txt); - + purple_account_set_user_info(account, txt); g_free(txt); } else { /* if we have no vCard, then lets not overwrite what we might have locally */ @@ -898,8 +918,17 @@ /* Republish our vcard if the photo is different than the server's */ if (!purple_strequal(vcard_hash, js->initial_avatar_hash)) { - PurpleAccount *account = purple_connection_get_account(js->gc); - jabber_set_info(js->gc, purple_account_get_user_info(account)); + /* + * Google Talk has developed the behavior that it will not accept + * a vcard set in the first 10 seconds (or so) of the connection; + * it returns an error (namespaces trimmed): + * . + */ + if (js->googletalk) + js->vcard_timer = purple_timeout_add_seconds(10, set_own_vcard_cb, + js); + else + jabber_set_info(js->gc, purple_account_get_user_info(account)); } else if (js->initial_avatar_hash) { /* Our photo is in the vcard, so advertise vcard-temp updates */ js->avatar_hash = g_strdup(js->initial_avatar_hash); diff -r 9d43d9d33477 -r 1ea1aee71848 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Fri Jul 31 14:40:03 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sat Aug 01 01:53:02 2009 +0000 @@ -1542,6 +1542,9 @@ g_free(js->old_track); g_free(js->expected_rspauth); + if (js->vcard_timer != 0) + purple_timeout_remove(js->vcard_timer); + if (js->keepalive_timeout != 0) purple_timeout_remove(js->keepalive_timeout); diff -r 9d43d9d33477 -r 1ea1aee71848 libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Fri Jul 31 14:40:03 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.h Sat Aug 01 01:53:02 2009 +0000 @@ -214,6 +214,8 @@ void *unregistration_user_data; gboolean vcard_fetched; + /* Timer at login to push updated avatar */ + guint vcard_timer; /* Entity Capabilities hash */ char *caps_hash;