Mercurial > pidgin
changeset 27780:c8af11ba1ee8
merge of '80c06f6950b5ea3ca311d8e4752ad5b19ea84059'
and 'e51813f1e6fd21732acaaaa95d22ab3ac75a0c72'
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sat, 01 Aug 2009 02:59:31 +0000 |
parents | 07de864fc024 (current diff) 3ad2700e7c68 (diff) |
children | ed11d1cabbe4 14e5eadff540 |
files | |
diffstat | 5 files changed, 53 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/jabber/buddy.c Fri Jul 31 21:44:52 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.c Sat Aug 01 02:59:31 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): + * <error code="500" type="wait"><internal-server-error/></error>. + */ + 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);
--- a/libpurple/protocols/jabber/disco.c Fri Jul 31 21:44:52 2009 +0000 +++ b/libpurple/protocols/jabber/disco.c Sat Aug 01 02:59:31 2009 +0000 @@ -98,10 +98,6 @@ JabberIqType type, const char *id, xmlnode *in_query) { - - if(!from) - return; - if(type == JABBER_IQ_GET) { xmlnode *query, *identity, *feature; JabberIq *iq; @@ -116,7 +112,8 @@ jabber_iq_set_id(iq, id); - xmlnode_set_attrib(iq->node, "to", from); + if (from) + xmlnode_set_attrib(iq->node, "to", from); query = xmlnode_get_child(iq->node, "query"); if(node) @@ -208,7 +205,8 @@ xmlnode_set_namespace(bad_request, "urn:ietf:params:xml:ns:xmpp-stanzas"); jabber_iq_set_id(iq, id); - xmlnode_set_attrib(iq->node, "to", from); + if (from) + xmlnode_set_attrib(iq->node, "to", from); jabber_iq_send(iq); }
--- a/libpurple/protocols/jabber/jabber.c Fri Jul 31 21:44:52 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sat Aug 01 02:59:31 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); @@ -3467,6 +3470,8 @@ #ifdef USE_VV jabber_add_feature("http://www.google.com/xmpp/protocol/session", jabber_audio_enabled); jabber_add_feature("http://www.google.com/xmpp/protocol/voice/v1", jabber_audio_enabled); + jabber_add_feature("http://www.google.com/xmpp/protocol/video/v1", jabber_video_enabled); + jabber_add_feature("http://www.google.com/xmpp/protocol/camera/v1", jabber_video_enabled); jabber_add_feature(JINGLE_APP_RTP_SUPPORT_AUDIO, jabber_audio_enabled); jabber_add_feature(JINGLE_APP_RTP_SUPPORT_VIDEO, jabber_video_enabled); jabber_add_feature(JINGLE_TRANSPORT_ICEUDP, 0);
--- a/libpurple/protocols/jabber/jabber.h Fri Jul 31 21:44:52 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.h Sat Aug 01 02:59:31 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;
--- a/libpurple/protocols/jabber/useravatar.c Fri Jul 31 21:44:52 2009 +0000 +++ b/libpurple/protocols/jabber/useravatar.c Sat Aug 01 02:59:31 2009 +0000 @@ -219,16 +219,18 @@ const char *server_hash = NULL; if (items && (item = xmlnode_get_child(items, "item")) && - (metadata = xmlnode_get_child(item, "metadata")) && - (info = xmlnode_get_child(metadata, "info"))) { + (metadata = xmlnode_get_child(item, "metadata")) && + (info = xmlnode_get_child(metadata, "info"))) { server_hash = xmlnode_get_attrib(info, "id"); } - if (items && !metadata) - return; - - /* Publish ours if it's different than the server's */ - if (!purple_strequal(server_hash, js->initial_avatar_hash)) { + /* + * If we have an avatar and the server returned an error/malformed data, + * push our avatar. If the server avatar doesn't match the local one, push + * our avatar. + */ + if (((!items || !metadata) && js->initial_avatar_hash) || + !purple_strequal(server_hash, js->initial_avatar_hash)) { PurpleStoredImage *img = purple_buddy_icons_find_account_icon(account); jabber_avatar_set(js, img); purple_imgstore_unref(img);