static TwitterConvIcon *twitter_conv_icon_find(PurpleAccount * account, const char *who) { PurpleConnection *gc = purple_account_get_connection(account); PurpleBuddyIcon *buddy_icon; TwitterConvIcon *conv_icon; TwitterConnectionData *twitter; if (!gc) { return NULL; } twitter = gc->proto_data; if (!twitter) { return NULL; } purple_debug_info(PLUGIN_ID, "Looking up %s\n", who); conv_icon = g_hash_table_lookup(twitter->icons, purple_normalize(account, who)); if ((!conv_icon || !conv_icon->pixbuf) && (buddy_icon = purple_buddy_icons_find(account, who))) { if (!conv_icon) { if ((conv_icon = buddy_icon_to_conv_icon(buddy_icon))) g_hash_table_insert(twitter->icons, g_strdup(purple_normalize(account, who)), conv_icon); } else { conv_icon_set_buddy_icon_data(conv_icon, buddy_icon); } purple_buddy_icon_unref(buddy_icon); } return conv_icon; //may be NULL }
static void netsoul_close (PurpleConnection *gc) { PurpleBlistNode *gnode, *cnode, *bnode; NetsoulData *ns = gc->proto_data; purple_debug_info("netsoul", "netsoul_close\n"); for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for(bnode = cnode->child; bnode; bnode = bnode->next) { if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; if(((PurpleBuddy*)bnode)->account == gc->account) { PurpleBuddy *buddy = (PurpleBuddy*)bnode; if (buddy) purple_buddy_icon_unref(purple_buddy_get_icon(buddy)); } } } } g_free(ns->challenge); g_free(ns->host); close(ns->fd); g_free(ns); purple_input_remove(gc->inpa); }
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); } } }
// // This function updates a given buddy. It first does a lookup the the buddy in // the internal lookup table of buddies that where defined in the JSON file. If // the buddy can't be found then no processing is done. Otherwise the buddy's // name is changed unless if the buddy has already a name. Finally the buddy's // icon is downloaded unless if the buddy has already an icon. The buddy icon is // downloaded asynchronously. // // Returns a SoupMessage* if the buddy icon has been scheduled for a download. // static SoupMessage* budicons_buddy_update (BudiconsPlugin *plugin, PurpleBuddy *buddy) { // Take the next buddy/user to process g_print("Buddy %s\n", buddy->name); BudiconsUser *user = g_hash_table_lookup(plugin->users, buddy->name); if (user == NULL) {return NULL;} // Set the buddy's name (alias) if it's still unset gboolean force_rename = budicons_prefs_get_force_name_update(); if (force_rename || buddy->alias == NULL || EQ(buddy->name, buddy->alias)) { g_print("Rename %s to %s\n", buddy->alias, user->name); purple_blist_alias_buddy(buddy, user->name); } // Check if the buddy has already an image if (user->image == NULL) {return NULL;} PurpleBuddyIcon *icon = purple_buddy_icons_find(buddy->account, buddy->name); gboolean force_download = budicons_prefs_get_force_icon_download(); if (icon != NULL) { // This buddy has already an icon purple_buddy_icon_unref(icon); if (!force_download) { // Don't redownload the icon once more return NULL; } } // Download the buddy's image since it doesn't have one (asynchronous) SoupMessage *message = soup_message_new(SOUP_METHOD_GET, user->image); if (message == NULL) { g_print("Invalid URL %s for buddy %s\n", user->image, buddy->name); return NULL; } g_print("Download of %s\n", user->image); return message; }
void purple_buddy_icon_update(PurpleBuddyIcon *icon) { PurpleConversation *conv; PurpleAccount *account; const char *username; PurpleBuddyIcon *icon_to_set; GSList *buddies; g_return_if_fail(icon != NULL); account = purple_buddy_icon_get_account(icon); username = purple_buddy_icon_get_username(icon); /* If no data exists (icon->img == NULL), then call the functions below * with NULL to unset the icon. They will then unref the icon and it should * be destroyed. The only way it wouldn't be destroyed is if someone * else is holding a reference to it, in which case they can kill * the icon when they realize it has no data. */ icon_to_set = icon->img ? icon : NULL; /* Ensure that icon remains valid throughout */ purple_buddy_icon_ref(icon); buddies = purple_find_buddies(account, username); while (buddies != NULL) { PurpleBuddy *buddy = (PurpleBuddy *)buddies->data; char *old_icon; purple_buddy_set_icon(buddy, icon_to_set); old_icon = g_strdup(purple_blist_node_get_string((PurpleBlistNode *)buddy, "buddy_icon")); if (icon->img && purple_buddy_icons_is_caching()) { const char *filename = purple_imgstore_get_filename(icon->img); purple_blist_node_set_string((PurpleBlistNode *)buddy, "buddy_icon", filename); if (icon->checksum && *icon->checksum) { purple_blist_node_set_string((PurpleBlistNode *)buddy, "icon_checksum", icon->checksum); } else { purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "icon_checksum"); } ref_filename(filename); } else if (!icon->img) { purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "buddy_icon"); purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "icon_checksum"); } unref_filename(old_icon); g_free(old_icon); buddies = g_slist_delete_link(buddies, buddies); } conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, username, account); if (conv != NULL) purple_conv_im_set_icon(PURPLE_CONV_IM(conv), icon_to_set); /* icon's refcount was incremented above */ purple_buddy_icon_unref(icon); }