| 68 } |
68 } |
| 69 |
69 |
| 70 struct _gaim_hbuddy { |
70 struct _gaim_hbuddy { |
| 71 char *name; |
71 char *name; |
| 72 GaimAccount *account; |
72 GaimAccount *account; |
| |
73 GaimBlistNode *group; |
| 73 }; |
74 }; |
| 74 |
75 |
| 75 static guint _gaim_blist_hbuddy_hash (struct _gaim_hbuddy *hb) |
76 static guint _gaim_blist_hbuddy_hash (struct _gaim_hbuddy *hb) |
| 76 { |
77 { |
| 77 return g_str_hash(hb->name); |
78 return g_str_hash(hb->name); |
| 78 } |
79 } |
| 79 |
80 |
| 80 static guint _gaim_blist_hbuddy_equal (struct _gaim_hbuddy *hb1, struct _gaim_hbuddy *hb2) |
81 static guint _gaim_blist_hbuddy_equal (struct _gaim_hbuddy *hb1, struct _gaim_hbuddy *hb2) |
| 81 { |
82 { |
| 82 return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account); |
83 return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group); |
| 83 } |
84 } |
| 84 |
85 |
| 85 /***************************************************************************** |
86 /***************************************************************************** |
| 86 * Public API functions * |
87 * Public API functions * |
| 87 *****************************************************************************/ |
88 *****************************************************************************/ |
| 504 } |
505 } |
| 505 |
506 |
| 506 hb = g_malloc(sizeof(struct _gaim_hbuddy)); |
507 hb = g_malloc(sizeof(struct _gaim_hbuddy)); |
| 507 hb->name = g_strdup(normalize(buddy->name)); |
508 hb->name = g_strdup(normalize(buddy->name)); |
| 508 hb->account = buddy->account; |
509 hb->account = buddy->account; |
| |
510 hb->group = ((GaimBlistNode*)buddy)->parent; |
| 509 |
511 |
| 510 if (g_hash_table_lookup(gaimbuddylist->buddies, (gpointer)hb)) { |
512 if (g_hash_table_lookup(gaimbuddylist->buddies, (gpointer)hb)) { |
| 511 /* This guy already exists */ |
513 /* This guy already exists */ |
| 512 g_free(hb->name); |
514 g_free(hb->name); |
| 513 g_free(hb); |
515 g_free(hb); |
| 626 if (GAIM_BUDDY_IS_ONLINE(buddy)) |
628 if (GAIM_BUDDY_IS_ONLINE(buddy)) |
| 627 group->online--; |
629 group->online--; |
| 628 |
630 |
| 629 hb.name = normalize(buddy->name); |
631 hb.name = normalize(buddy->name); |
| 630 hb.account = buddy->account; |
632 hb.account = buddy->account; |
| |
633 hb.group = ((GaimBlistNode*)buddy)->parent; |
| 631 if (g_hash_table_lookup_extended(gaimbuddylist->buddies, &hb, (gpointer *)&key, (gpointer *)&val)) { |
634 if (g_hash_table_lookup_extended(gaimbuddylist->buddies, &hb, (gpointer *)&key, (gpointer *)&val)) { |
| 632 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
635 g_hash_table_remove(gaimbuddylist->buddies, &hb); |
| 633 g_free(key->name); |
636 g_free(key->name); |
| 634 g_free(key); |
637 g_free(key); |
| 635 } |
638 } |
| 734 |
737 |
| 735 } |
738 } |
| 736 |
739 |
| 737 struct buddy *gaim_find_buddy(GaimAccount *account, const char *name) |
740 struct buddy *gaim_find_buddy(GaimAccount *account, const char *name) |
| 738 { |
741 { |
| 739 struct buddy *buddy; |
742 static struct buddy *buddy = NULL; |
| 740 struct _gaim_hbuddy hb; |
743 struct _gaim_hbuddy hb; |
| |
744 GaimBlistNode *group; |
| |
745 const char *n = NULL; |
| 741 |
746 |
| 742 if (!gaimbuddylist) |
747 if (!gaimbuddylist) |
| 743 return NULL; |
748 return NULL; |
| 744 |
749 |
| 745 hb.name = normalize(name); |
750 if (!name && !buddy); |
| 746 hb.account = account; |
751 |
| 747 buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
752 if (name) { |
| 748 |
753 group = gaimbuddylist->root; |
| 749 return buddy; |
754 n = name; |
| |
755 } else { |
| |
756 group = ((GaimBlistNode*)buddy)->parent->next; |
| |
757 n = buddy->name; |
| |
758 } |
| |
759 |
| |
760 while (group) { |
| |
761 hb.name = normalize(n); |
| |
762 hb.account = account; |
| |
763 hb.group = group; |
| |
764 if (buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) |
| |
765 return buddy; |
| |
766 group = ((GaimBlistNode*)group)->next; |
| |
767 } |
| |
768 return NULL; |
| 750 } |
769 } |
| 751 |
770 |
| 752 struct group *gaim_find_group(const char *name) |
771 struct group *gaim_find_group(const char *name) |
| 753 { |
772 { |
| 754 GaimBlistNode *node; |
773 GaimBlistNode *node; |