Mercurial > pidgin.yaz
comparison libpurple/buddyicon.c @ 16828:56823a55581a
Rework purple_buddy_icons_find() to return a reference for the caller, which
is clearer and more consistent with other functions.
Also, update purple_buddy_icons_set_for_user() to behave properly when
called to clear an icon that isn't already in memory.
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Thu, 03 May 2007 21:57:49 +0000 |
parents | 10f175539cfe |
children | 9862a82206ba |
comparison
equal
deleted
inserted
replaced
16827:41f85148a60f | 16828:56823a55581a |
---|---|
312 | 312 |
313 /* purple_buddy_icon_create() sets account & username */ | 313 /* purple_buddy_icon_create() sets account & username */ |
314 if (icon == NULL) | 314 if (icon == NULL) |
315 icon = purple_buddy_icon_create(account, username); | 315 icon = purple_buddy_icon_create(account, username); |
316 | 316 |
317 /* Take a reference for the caller of this function. */ | |
318 icon->ref_count = 1; | |
319 | |
320 /* purple_buddy_icon_set_data() sets img, but it | 317 /* purple_buddy_icon_set_data() sets img, but it |
321 * references img first, so we need to initialize it */ | 318 * references img first, so we need to initialize it */ |
322 icon->img = NULL; | 319 icon->img = NULL; |
323 purple_buddy_icon_set_data(icon, icon_data, icon_len, checksum); | 320 purple_buddy_icon_set_data(icon, icon_data, icon_len, checksum); |
324 | 321 |
512 void | 509 void |
513 purple_buddy_icons_set_for_user(PurpleAccount *account, const char *username, | 510 purple_buddy_icons_set_for_user(PurpleAccount *account, const char *username, |
514 void *icon_data, size_t icon_len, | 511 void *icon_data, size_t icon_len, |
515 const char *checksum) | 512 const char *checksum) |
516 { | 513 { |
517 PurpleBuddyIcon *icon; | 514 GHashTable *icon_cache; |
515 PurpleBuddyIcon *icon = NULL; | |
518 | 516 |
519 g_return_if_fail(account != NULL); | 517 g_return_if_fail(account != NULL); |
520 g_return_if_fail(username != NULL); | 518 g_return_if_fail(username != NULL); |
521 | 519 |
522 icon = purple_buddy_icons_find(account, username); | 520 icon_cache = g_hash_table_lookup(account_cache, account); |
521 | |
522 if (icon_cache != NULL) | |
523 icon = g_hash_table_lookup(icon_cache, username); | |
523 | 524 |
524 if (icon != NULL) | 525 if (icon != NULL) |
525 purple_buddy_icon_set_data(icon, icon_data, icon_len, checksum); | 526 purple_buddy_icon_set_data(icon, icon_data, icon_len, checksum); |
526 else | 527 else |
527 { | 528 { |
528 PurpleBuddyIcon *icon = purple_buddy_icon_new(account, username, icon_data, icon_len, checksum); | 529 if (icon_data != NULL && icon_len > 0) |
529 purple_buddy_icon_unref(icon); | 530 { |
531 PurpleBuddyIcon *icon = purple_buddy_icon_new(account, username, icon_data, icon_len, checksum); | |
532 | |
533 /* purple_buddy_icon_new() calls | |
534 * purple_buddy_icon_set_data(), which calls | |
535 * purple_buddy_icon_update(), which has the buddy list | |
536 * and conversations take references as appropriate. | |
537 * This function doesn't return icon, so we can't | |
538 * leave a reference dangling. */ | |
539 purple_buddy_icon_unref(icon); | |
540 } | |
541 else | |
542 { | |
543 /* If the buddy list or a conversation was holding a | |
544 * reference, we'd have found the icon in the cache. | |
545 * Since we know we're deleting the icon, we only | |
546 * need a subset of purple_buddy_icon_update(). */ | |
547 | |
548 GSList *buddies = purple_find_buddies(account, username); | |
549 while (buddies != NULL) | |
550 { | |
551 PurpleBuddy *buddy = (PurpleBuddy *)buddies->data; | |
552 | |
553 unref_filename(purple_blist_node_get_string((PurpleBlistNode *)buddy, "buddy_icon")); | |
554 purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "buddy_icon"); | |
555 purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "icon_checksum"); | |
556 | |
557 buddies = g_slist_delete_link(buddies, buddies); | |
558 } | |
559 | |
560 } | |
530 } | 561 } |
531 } | 562 } |
532 | 563 |
533 char *purple_buddy_icon_get_full_path(PurpleBuddyIcon *icon) | 564 char *purple_buddy_icon_get_full_path(PurpleBuddyIcon *icon) |
534 { | 565 { |
627 } | 658 } |
628 | 659 |
629 purple_buddy_icons_set_caching(caching); | 660 purple_buddy_icons_set_caching(caching); |
630 } | 661 } |
631 | 662 |
632 return icon; | 663 return purple_buddy_icon_ref(icon); |
633 } | 664 } |
634 | 665 |
635 gboolean | 666 gboolean |
636 purple_buddy_icons_has_custom_icon(PurpleContact *contact) | 667 purple_buddy_icons_has_custom_icon(PurpleContact *contact) |
637 { | 668 { |