diff -r e8896810a485 -r 5188ffbaeb6e libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Fri Apr 27 00:28:21 2007 +0000 +++ b/libpurple/protocols/jabber/buddy.c Fri Apr 27 02:14:44 2007 +0000 @@ -383,7 +383,6 @@ JabberIq *iq; JabberStream *js = gc->proto_data; xmlnode *vc_node; - char *avatar_file = NULL; struct tag_attr *tag_attr; g_free(js->avatar_hash); @@ -393,7 +392,6 @@ * Send only if there's actually any *information* to send */ vc_node = info ? xmlnode_from_str(info, -1) : NULL; - avatar_file = purple_buddy_icons_get_full_path(purple_account_get_buddy_icon(gc->account)); if(!vc_node) { vc_node = xmlnode_new("vCard"); @@ -403,27 +401,29 @@ if (vc_node->name && !g_ascii_strncasecmp(vc_node->name, "vCard", 5)) { - GError *error = NULL; - gchar *avatar_data_tmp; - guchar *avatar_data; - gsize avatar_len; + PurpleStoredImage *img; - if(avatar_file && g_file_get_contents(avatar_file, &avatar_data_tmp, &avatar_len, &error)) { + if ((img = purple_buddy_icons_find_account_icon(gc->account))) { + gconstpointer avatar_data; + gsize avatar_len; xmlnode *photo, *binval; gchar *enc; int i; unsigned char hashval[20]; char *p, hash[41]; - avatar_data = (guchar *) avatar_data_tmp; + avatar_data = purple_imgstore_get_data(img); + avatar_len = purple_imgstore_get_size(img); photo = xmlnode_new_child(vc_node, "PHOTO"); binval = xmlnode_new_child(photo, "BINVAL"); enc = purple_base64_encode(avatar_data, avatar_len); - purple_cipher_digest_region("sha1", (guchar *)avatar_data, + 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]); @@ -431,11 +431,7 @@ xmlnode_insert_data(binval, enc, -1); g_free(enc); - g_free(avatar_data); - } else if (error != NULL) { - g_error_free(error); } - g_free(avatar_file); iq = jabber_iq_new(js, JABBER_IQ_SET); xmlnode_insert_child(iq->node, vc_node); @@ -445,7 +441,7 @@ } } -void jabber_set_buddy_icon(PurpleConnection *gc, const char *iconfile) +void jabber_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img) { PurplePresence *gpresence; PurpleStatus *status; @@ -715,7 +711,7 @@ purple_notify_user_info_destroy(user_info); while(jbi->vcard_imgids) { - purple_imgstore_unref(GPOINTER_TO_INT(jbi->vcard_imgids->data)); + purple_imgstore_unref_by_id(GPOINTER_TO_INT(jbi->vcard_imgids->data)); jbi->vcard_imgids = g_slist_delete_link(jbi->vcard_imgids, jbi->vcard_imgids); } @@ -960,23 +956,20 @@ data = purple_base64_decode(bintext, &size); - jbi->vcard_imgids = g_slist_prepend(jbi->vcard_imgids, GINT_TO_POINTER(purple_imgstore_add(data, size, "logo.png"))); + jbi->vcard_imgids = g_slist_prepend(jbi->vcard_imgids, GINT_TO_POINTER(purple_imgstore_add_with_id(g_memdup(data, size), size, "logo.png"))); g_string_append_printf(info_text, "%s:
", photo ? _("Photo") : _("Logo"), GPOINTER_TO_INT(jbi->vcard_imgids->data)); - purple_buddy_icons_set_for_user(js->gc->account, bare_jid, - data, size); - purple_cipher_digest_region("sha1", (guchar *)data, size, sizeof(hashval), hashval, NULL); p = hash; for(i=0; i<20; i++, p+=2) snprintf(p, 3, "%02x", hashval[i]); - purple_blist_node_set_string((PurpleBlistNode*)b, "avatar_hash", hash); - g_free(data); + purple_buddy_icons_set_for_user(js->gc->account, bare_jid, + data, size, hash); g_free(bintext); } }