/** * We got the buddy icon data; deal with it */ void bonjour_buddy_got_buddy_icon(BonjourBuddy *buddy, gconstpointer data, gsize len) { /* Recalculate the hash instead of using the current phsh to make sure it is accurate for the icon. */ char *p, *hash; if (data == NULL || len == 0) return; /* Take advantage of the fact that we use a SHA-1 hash of the data as the filename. */ hash = purple_util_get_image_filename(data, len); /* Get rid of the extension */ if (!(p = strchr(hash, '.'))) { g_free(hash); return; } *p = '\0'; purple_debug_info("bonjour", "Got buddy icon for %s icon hash='%s' phsh='%s'.\n", buddy->name, hash, buddy->phsh ? buddy->phsh : "(null)"); purple_buddy_icons_set_for_user(buddy->account, buddy->name, g_memdup(data, len), len, hash); g_free(hash); }
static PurpleStoredImage * purple_smiley_data_new(guchar *smiley_data, size_t smiley_data_len) { char *filename; PurpleStoredImage *stored_img; g_return_val_if_fail(smiley_data != NULL, NULL); g_return_val_if_fail(smiley_data_len > 0, NULL); filename = purple_util_get_image_filename(smiley_data, smiley_data_len); if (filename == NULL) { g_free(smiley_data); return NULL; } stored_img = purple_imgstore_add(smiley_data, smiley_data_len, filename); g_free(filename); return stored_img; }
static PurpleStoredImage * purple_buddy_icon_data_new(guchar *icon_data, size_t icon_len, const char *filename) { char *file; PurpleStoredImage *img; g_return_val_if_fail(icon_data != NULL, NULL); g_return_val_if_fail(icon_len > 0, NULL); if (filename == NULL) { file = purple_util_get_image_filename(icon_data, icon_len); if (file == NULL) { g_free(icon_data); return NULL; } } else file = g_strdup(filename); if ((img = g_hash_table_lookup(icon_data_cache, file))) { g_free(file); g_free(icon_data); return purple_imgstore_ref(img); } img = purple_imgstore_add(icon_data, icon_len, file); /* This will take ownership of file and g_free it either now or later. */ g_hash_table_insert(icon_data_cache, file, img); purple_buddy_icon_data_cache(img); return img; }
static void migrate_buddy_icon(PurpleBlistNode *node, const char *setting_name, const char *dirname, const char *filename) { char *path; if (filename[0] != '/') { path = g_build_filename(dirname, filename, NULL); if (g_file_test(path, G_FILE_TEST_EXISTS)) { g_free(path); return; } g_free(path); path = g_build_filename(old_icons_dir, filename, NULL); } else path = g_strdup(filename); if (g_file_test(path, G_FILE_TEST_EXISTS)) { guchar *icon_data; size_t icon_len; FILE *file; char *new_filename; if (!read_icon_file(path, &icon_data, &icon_len)) { g_free(path); delete_buddy_icon_settings(node, setting_name); return; } if (icon_data == NULL || icon_len <= 0) { /* This really applies to the icon_len check. * icon_data should never be NULL if * read_icon_file() returns TRUE. */ purple_debug_error("buddyicon", "Empty buddy icon file: %s\n", path); delete_buddy_icon_settings(node, setting_name); g_free(path); return; } g_free(path); new_filename = purple_util_get_image_filename(icon_data, icon_len); if (new_filename == NULL) { purple_debug_error("buddyicon", "New icon filename is NULL. This should never happen! " "The old filename was: %s\n", path); delete_buddy_icon_settings(node, setting_name); g_return_if_reached(); } path = g_build_filename(dirname, new_filename, NULL); if ((file = g_fopen(path, "wb")) != NULL) { if (!fwrite(icon_data, icon_len, 1, file)) { purple_debug_error("buddyicon", "Error writing %s: %s\n", path, g_strerror(errno)); } else purple_debug_info("buddyicon", "Wrote migrated cache file: %s\n", path); fclose(file); } else { purple_debug_error("buddyicon", "Unable to create file %s: %s\n", path, g_strerror(errno)); g_free(new_filename); g_free(path); delete_buddy_icon_settings(node, setting_name); return; } g_free(path); purple_blist_node_set_string(node, setting_name, new_filename); ref_filename(new_filename); g_free(new_filename); if (purple_strequal(setting_name, "buddy_icon")) { const char *hash; hash = purple_blist_node_get_string(node, "avatar_hash"); if (hash != NULL) { purple_blist_node_set_string(node, "icon_checksum", hash); purple_blist_node_remove_setting(node, "avatar_hash"); } } } else { purple_debug_error("buddyicon", "Old icon file doesn't exist: %s\n", path); delete_buddy_icon_settings(node, setting_name); g_free(path); } }