comparison src/buddyicon.c @ 9396:84594a281500

[gaim-migrate @ 10208] This fixes a bug that shx pointed out, that I accidently introduced, whereby, if a buddy has an icon, that hasn't been updated since you started gaim, but was cached at some earlier point in time, and you are using the small list, when you opened a conversation with them, you would not see their buddy icon. The work-around for 0.79 is to use the big list, or have friends who change their buddy icons a lot. committer: Tailor Script <tailor@pidgin.im>
author Tim Ringenbach <marv@pidgin.im>
date Fri, 25 Jun 2004 05:30:10 +0000
parents ef8e4740254d
children e0060f3b6d92
comparison
equal deleted inserted replaced
9395:bd81a3c6f8ab 9396:84594a281500
30 30
31 static GHashTable *account_cache = NULL; 31 static GHashTable *account_cache = NULL;
32 static char *cache_dir = NULL; 32 static char *cache_dir = NULL;
33 static gboolean icon_caching = TRUE; 33 static gboolean icon_caching = TRUE;
34 34
35 static GaimBuddyIcon *
36 gaim_buddy_icon_create(GaimAccount *account, const char *username)
37 {
38 GaimBuddyIcon *icon;
39 GHashTable *icon_cache;
40
41 icon = g_new0(GaimBuddyIcon, 1);
42
43 gaim_buddy_icon_set_account(icon, account);
44 gaim_buddy_icon_set_username(icon, username);
45
46 icon_cache = g_hash_table_lookup(account_cache, account);
47
48 if (icon_cache == NULL)
49 {
50 icon_cache = g_hash_table_new(g_str_hash, g_str_equal);
51
52 g_hash_table_insert(account_cache, account, icon_cache);
53 }
54
55 g_hash_table_insert(icon_cache,
56 (char *)gaim_buddy_icon_get_username(icon), icon);
57 return icon;
58 }
59
35 GaimBuddyIcon * 60 GaimBuddyIcon *
36 gaim_buddy_icon_new(GaimAccount *account, const char *username, 61 gaim_buddy_icon_new(GaimAccount *account, const char *username,
37 void *icon_data, size_t icon_len) 62 void *icon_data, size_t icon_len)
38 { 63 {
39 GaimBuddyIcon *icon; 64 GaimBuddyIcon *icon;
44 g_return_val_if_fail(icon_len > 0, NULL); 69 g_return_val_if_fail(icon_len > 0, NULL);
45 70
46 icon = gaim_buddy_icons_find(account, username); 71 icon = gaim_buddy_icons_find(account, username);
47 72
48 if (icon == NULL) 73 if (icon == NULL)
49 { 74 icon = gaim_buddy_icon_create(account, username);
50 GHashTable *icon_cache;
51
52 icon = g_new0(GaimBuddyIcon, 1);
53
54 gaim_buddy_icon_set_account(icon, account);
55 gaim_buddy_icon_set_username(icon, username);
56
57 icon_cache = g_hash_table_lookup(account_cache, account);
58
59 if (icon_cache == NULL)
60 {
61 icon_cache = g_hash_table_new(g_str_hash, g_str_equal);
62
63 g_hash_table_insert(account_cache, account, icon_cache);
64 }
65
66 g_hash_table_insert(icon_cache,
67 (char *)gaim_buddy_icon_get_username(icon), icon);
68 }
69 75
70 gaim_buddy_icon_ref(icon); 76 gaim_buddy_icon_ref(icon);
71 gaim_buddy_icon_set_data(icon, icon_data, icon_len); 77 gaim_buddy_icon_set_data(icon, icon_data, icon_len);
72 gaim_buddy_icon_unref(icon); 78 gaim_buddy_icon_unref(icon);
73 79
333 gaim_buddy_icon_new(account, username, icon_data, icon_len); 339 gaim_buddy_icon_new(account, username, icon_data, icon_len);
334 } 340 }
335 } 341 }
336 342
337 GaimBuddyIcon * 343 GaimBuddyIcon *
338 gaim_buddy_icons_find(const GaimAccount *account, const char *username) 344 gaim_buddy_icons_find(GaimAccount *account, const char *username)
339 { 345 {
340 GHashTable *icon_cache; 346 GHashTable *icon_cache;
347 GaimBuddyIcon *ret = NULL;
341 348
342 g_return_val_if_fail(account != NULL, NULL); 349 g_return_val_if_fail(account != NULL, NULL);
343 g_return_val_if_fail(username != NULL, NULL); 350 g_return_val_if_fail(username != NULL, NULL);
344 351
345 icon_cache = g_hash_table_lookup(account_cache, account); 352 icon_cache = g_hash_table_lookup(account_cache, account);
346 353
347 if (icon_cache == NULL) 354 if ((icon_cache == NULL) || ((ret = g_hash_table_lookup(icon_cache, username)) == NULL)) {
348 return NULL; 355 const char *file;
349 356 struct stat st;
350 return g_hash_table_lookup(icon_cache, username); 357 GaimBuddy *b = gaim_find_buddy(account, username);
358
359 if (!b)
360 return NULL;
361
362 if ((file = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon")) == NULL)
363 return NULL;
364
365 if (!stat(file, &st)) {
366 FILE *f = fopen(file, "rb");
367 if (f) {
368 char *data = g_malloc(st.st_size);
369 fread(data, 1, st.st_size, f);
370 fclose(f);
371 ret = gaim_buddy_icon_create(account, username);
372 gaim_buddy_icon_ref(ret);
373 gaim_buddy_icon_set_data(ret, data, st.st_size);
374 gaim_buddy_icon_unref(ret);
375 g_free(data);
376 return ret;
377 }
378 }
379 }
380
381 return ret;
351 } 382 }
352 383
353 void 384 void
354 gaim_buddy_icons_set_caching(gboolean caching) 385 gaim_buddy_icons_set_caching(gboolean caching)
355 { 386 {