Mercurial > pidgin.yaz
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 { |