Mercurial > pidgin
comparison src/prpl.c @ 4799:7fd8a82a7c36
[gaim-migrate @ 5119]
read the comment in the code and know my rage.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sun, 16 Mar 2003 07:51:11 +0000 |
parents | 677d3cb193a1 |
children | 5b24e8e52e4a |
comparison
equal
deleted
inserted
replaced
4798:0c95a3731244 | 4799:7fd8a82a7c36 |
---|---|
558 struct gaim_conversation *conv; | 558 struct gaim_conversation *conv; |
559 struct icon_data tmp; | 559 struct icon_data tmp; |
560 GList *l; | 560 GList *l; |
561 struct icon_data *id; | 561 struct icon_data *id; |
562 struct buddy *b; | 562 struct buddy *b; |
563 /* i'm going to vent here a little bit about normalize(). normalize() | |
564 * uses a static buffer, so when we call functions that use normalize() from | |
565 * functions that use normalize(), whose parameters are the result of running | |
566 * normalize(), bad things happen. To prevent some of this, we're going | |
567 * to make a copy of what we get from normalize(), so we know nothing else | |
568 * touches it, and buddy icons don't go to the wrong person. Some day I | |
569 * will kill normalize(), and dance on its grave. That will be a very happy | |
570 * day for everyone. | |
571 * --ndw | |
572 */ | |
573 char *realwho = g_strdup(normalize(who)); | |
563 tmp.gc = gc; | 574 tmp.gc = gc; |
564 tmp.who = normalize(who); | 575 tmp.who = realwho; |
565 tmp.data=NULL; | 576 tmp.data=NULL; |
566 tmp.len = 0; | 577 tmp.len = 0; |
567 l = g_list_find_custom(icons, &tmp, find_icon_data); | 578 l = g_list_find_custom(icons, &tmp, find_icon_data); |
568 id = l ? l->data : NULL; | 579 id = l ? l->data : NULL; |
569 | 580 |
570 if (id) { | 581 if (id) { |
571 g_free(id->data); | 582 g_free(id->data); |
572 if (!data) { | 583 if (!data) { |
573 icons = g_list_remove(icons, id); | 584 icons = g_list_remove(icons, id); |
574 g_free(id->who); | 585 g_free(id->who); |
575 g_free(id); | 586 g_free(id); |
587 g_free(realwho); | |
576 return; | 588 return; |
577 } | 589 } |
578 } else if (data) { | 590 } else if (data) { |
579 id = g_new0(struct icon_data, 1); | 591 id = g_new0(struct icon_data, 1); |
580 icons = g_list_append(icons, id); | 592 icons = g_list_append(icons, id); |
581 id->gc = gc; | 593 id->gc = gc; |
582 id->who = g_strdup(normalize(who)); | 594 id->who = g_strdup(realwho); |
583 } else { | 595 } else { |
584 return; | 596 g_free(realwho); |
585 } | 597 return; |
586 | 598 } |
587 debug_printf("Got icon for %s (length %d)\n", who, len); | 599 |
600 debug_printf("Got icon for %s (length %d)\n", realwho, len); | |
588 | 601 |
589 id->data = g_memdup(data, len); | 602 id->data = g_memdup(data, len); |
590 id->len = len; | 603 id->len = len; |
591 | 604 |
592 /* Update the buddy icon for this user. */ | 605 /* Update the buddy icon for this user. */ |
593 conv = gaim_find_conversation(who); | 606 conv = gaim_find_conversation(realwho); |
594 | 607 |
595 /* XXX Buddy Icon should probalby be part of struct buddy instead of this weird global | 608 /* XXX Buddy Icon should probalby be part of struct buddy instead of this weird global |
596 * linked list stuff. */ | 609 * linked list stuff. */ |
597 | 610 |
598 if ((b = gaim_find_buddy(gc->account, who)) != NULL) { | 611 if ((b = gaim_find_buddy(gc->account, realwho)) != NULL) { |
599 char *random = g_strdup_printf("%x", g_random_int()); | 612 char *random = g_strdup_printf("%x", g_random_int()); |
600 char *filename = g_build_filename(gaim_user_dir(), "icons", random, | 613 char *filename = g_build_filename(gaim_user_dir(), "icons", random, |
601 NULL); | 614 NULL); |
602 char *dirname = g_build_filename(gaim_user_dir(), "icons", NULL); | 615 char *dirname = g_build_filename(gaim_user_dir(), "icons", NULL); |
603 char *old_icon = gaim_buddy_get_setting(b, "buddy_icon"); | 616 char *old_icon = gaim_buddy_get_setting(b, "buddy_icon"); |
629 gaim_blist_update_buddy_icon(b); | 642 gaim_blist_update_buddy_icon(b); |
630 } | 643 } |
631 | 644 |
632 if (conv != NULL && gaim_conversation_get_gc(conv) == gc) | 645 if (conv != NULL && gaim_conversation_get_gc(conv) == gc) |
633 gaim_gtkconv_update_buddy_icon(conv); | 646 gaim_gtkconv_update_buddy_icon(conv); |
647 | |
648 g_free(realwho); | |
634 } | 649 } |
635 | 650 |
636 void remove_icon_data(struct gaim_connection *gc) | 651 void remove_icon_data(struct gaim_connection *gc) |
637 { | 652 { |
638 GList *list = icons; | 653 GList *list = icons; |