static void netsoul_got_photo (PurpleUtilFetchUrlData *url, void *user_data, const char *photo, size_t len, const char *error_msg) { PurpleBuddy *gb = user_data; PurpleAccount *account = purple_buddy_get_account (gb); // Check if connection is still existing PurpleConnection *gc = purple_account_get_connection (account); if (gc == NULL) return; purple_debug_info("netsoul", "netsoul_got_photo (size: %d) for %s\n", len, gb->name); /* Try to put the photo in , if there's one and is readable */ if (user_data && photo && len != 0) { if (strstr(photo, "400 Bad Request") || strstr(photo, "403 Forbidden") || strstr(photo, "404 Not Found")) purple_debug_info("netsoul", "netsoul_got_photo: error: %s\n", photo); else { PurpleStoredImage *img = purple_imgstore_add(g_memdup(photo, len), len, NULL); PurpleBuddyIcon *icon = purple_buddy_icon_new(account, gb->name, purple_imgstore_get_data(img), purple_imgstore_get_size(img), NULL); purple_buddy_set_icon(gb, icon); } } }
void purple_buddy_icons_set_for_user(PurpleAccount *account, const char *username, void *icon_data, size_t icon_len, const char *checksum) { GHashTable *icon_cache; PurpleBuddyIcon *icon = NULL; g_return_if_fail(account != NULL); g_return_if_fail(username != NULL); icon_cache = g_hash_table_lookup(account_cache, account); if (icon_cache != NULL) icon = g_hash_table_lookup(icon_cache, username); if (icon != NULL) purple_buddy_icon_set_data(icon, icon_data, icon_len, checksum); else if (icon_data && icon_len > 0) { PurpleBuddyIcon *icon = purple_buddy_icon_new(account, username, icon_data, icon_len, checksum); /* purple_buddy_icon_new() calls * purple_buddy_icon_set_data(), which calls * purple_buddy_icon_update(), which has the buddy list * and conversations take references as appropriate. * This function doesn't return icon, so we can't * leave a reference dangling. */ purple_buddy_icon_unref(icon); } else { /* If the buddy list or a conversation was holding a * reference, we'd have found the icon in the cache. * Since we know we're deleting the icon, we only * need a subset of purple_buddy_icon_update(). */ GSList *buddies = purple_find_buddies(account, username); while (buddies != NULL) { PurpleBuddy *buddy = (PurpleBuddy *)buddies->data; unref_filename(purple_blist_node_get_string((PurpleBlistNode *)buddy, "buddy_icon")); purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "buddy_icon"); purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "icon_checksum"); buddies = g_slist_delete_link(buddies, buddies); } } }
void gaym_fetch_thumbnail_cb(PurpleUtilFetchUrlData *url_data, void *user_data, const gchar *pic_data, gsize len, const gchar* error_message) { if (!user_data) return; struct gaym_fetch_thumbnail_data *d = user_data; if (!pic_data) { return; } if (!d->gc) return; if (len && !g_strrstr_len(pic_data, len, "Server Error")) { purple_debug_misc("gaym","Setting buddy icon for %s\n",d->who); //if(len<1024) // len=1024; void* new_pic_data=NULL; purple_debug_misc("gaym","Short icon file, padding to 1024\n"); new_pic_data=g_malloc0(len); memcpy(new_pic_data, pic_data, len); purple_buddy_icon_new(d->gc->account, d->who, (void*)new_pic_data, len, NULL); //g_free(new_pic_data); //PurpleBuddyIcon *icon=purple_buddy_icons_find(d->gc->account,d->who, NULL); //guint len; //const guchar* data=purple_buddy_icon_get_data(icon, &len); } if (PURPLE_CONNECTION_IS_VALID(d->gc) && len) { purple_signal_emit(purple_accounts_get_handle(), "info-updated", d->gc->account, d->who); /* if (purple_find_conversation_with_account(d->who, d->gc->account)) { purple_debug_misc("fetch_thumbnail_cb","setting buddy icon\n"); purple_buddy_icons_set_for_user(purple_connection_get_account (d->gc), d->who, (void *) pic_data, len); }*/ } else { purple_debug_error("gaym", "Fetching buddy icon failed.\n"); } g_free(d->who); g_free(d); purple_debug_misc("gaym","Finished buddy icon set callback\n"); }
static void pb_set_base64_icon_for_buddy(const gchar *base64_icon, PurpleBuddy *buddy) { PurpleBuddyIcon *icon; guchar *icon_data; gsize icon_len; gchar *checksum; const gchar *old_checksum; checksum = g_strdup_printf("%ud", g_str_hash(base64_icon)); old_checksum = purple_buddy_icons_get_checksum_for_user(buddy); if (old_checksum && purple_strequal(old_checksum, checksum)) { g_free(checksum); return; } icon_data = purple_base64_decode(base64_icon, &icon_len); icon = purple_buddy_icon_new(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy), icon_data, icon_len, checksum); g_free(icon_data); g_free(checksum); }