src/blist.c

changeset 5758
d79016a52980
parent 5676
d3c2fdaf4821
child 5776
7a738fde3ab1
equal deleted inserted replaced
5757:ce5f4c374630 5758:d79016a52980
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;

mercurial