# HG changeset patch # User Stu Tomlinson # Date 1202994214 0 # Node ID bb124c3e668c3ce9dbab1646615781a8d52ebacf # Parent 33b5a0e92583dfe862f0c9f2073ea7c043f5e992 Fix setting vCard buddy icons when we don't have any other user info set. Fixes #3450. diff -r 33b5a0e92583 -r bb124c3e668c libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Thu Feb 14 12:42:58 2008 +0000 +++ b/libpurple/protocols/jabber/buddy.c Thu Feb 14 13:03:34 2008 +0000 @@ -392,6 +392,7 @@ */ void jabber_set_info(PurpleConnection *gc, const char *info) { + PurpleStoredImage *img; JabberIq *iq; JabberStream *js = gc->proto_data; xmlnode *vc_node; @@ -410,57 +411,58 @@ */ vc_node = info ? xmlnode_from_str(info, -1) : NULL; - if(!vc_node) { - vc_node = xmlnode_new("vCard"); - for(tag_attr = vcard_tag_attr_list; tag_attr->attr != NULL; ++tag_attr) - xmlnode_set_attrib(vc_node, tag_attr->attr, tag_attr->value); + if (vc_node && (!vc_node->name || + g_ascii_strncasecmp(vc_node->name, "vCard", 5))) { + xmlnode_free(vc_node); + vc_node = NULL; } - if (vc_node->name && - !g_ascii_strncasecmp(vc_node->name, "vCard", 5)) { - PurpleStoredImage *img; - - if ((img = purple_buddy_icons_find_account_icon(gc->account))) { - gconstpointer avatar_data; - gsize avatar_len; - xmlnode *photo, *binval, *type; - gchar *enc; - int i; - unsigned char hashval[20]; - char *p, hash[41]; + if ((img = purple_buddy_icons_find_account_icon(gc->account))) { + gconstpointer avatar_data; + gsize avatar_len; + xmlnode *photo, *binval, *type; + gchar *enc; + int i; + unsigned char hashval[20]; + char *p, hash[41]; - avatar_data = purple_imgstore_get_data(img); - avatar_len = purple_imgstore_get_size(img); - /* have to get rid of the old PHOTO if it exists */ - if((photo = xmlnode_get_child(vc_node, "PHOTO"))) { - xmlnode_free(photo); - } - photo = xmlnode_new_child(vc_node, "PHOTO"); - type = xmlnode_new_child(photo, "TYPE"); - xmlnode_insert_data(type, "image/png", -1); - binval = xmlnode_new_child(photo, "BINVAL"); - enc = purple_base64_encode(avatar_data, avatar_len); - - purple_cipher_digest_region("sha1", avatar_data, - avatar_len, sizeof(hashval), - hashval, NULL); - - purple_imgstore_unref(img); - - p = hash; - for(i=0; i<20; i++, p+=2) - snprintf(p, 3, "%02x", hashval[i]); - js->avatar_hash = g_strdup(hash); - - xmlnode_insert_data(binval, enc, -1); - g_free(enc); + if(!vc_node) { + vc_node = xmlnode_new("vCard"); + for(tag_attr = vcard_tag_attr_list; tag_attr->attr != NULL; ++tag_attr) + xmlnode_set_attrib(vc_node, tag_attr->attr, tag_attr->value); } + avatar_data = purple_imgstore_get_data(img); + avatar_len = purple_imgstore_get_size(img); + /* have to get rid of the old PHOTO if it exists */ + if((photo = xmlnode_get_child(vc_node, "PHOTO"))) { + xmlnode_free(photo); + } + photo = xmlnode_new_child(vc_node, "PHOTO"); + type = xmlnode_new_child(photo, "TYPE"); + xmlnode_insert_data(type, "image/png", -1); + binval = xmlnode_new_child(photo, "BINVAL"); + enc = purple_base64_encode(avatar_data, avatar_len); + + purple_cipher_digest_region("sha1", avatar_data, + avatar_len, sizeof(hashval), + hashval, NULL); + + purple_imgstore_unref(img); + + p = hash; + for(i=0; i<20; i++, p+=2) + snprintf(p, 3, "%02x", hashval[i]); + js->avatar_hash = g_strdup(hash); + + xmlnode_insert_data(binval, enc, -1); + g_free(enc); + } + + if (vc_node != NULL) { iq = jabber_iq_new(js, JABBER_IQ_SET); xmlnode_insert_child(iq->node, vc_node); jabber_iq_send(iq); - } else { - xmlnode_free(vc_node); } }