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 {