Mercurial > pidgin
diff src/blist.c @ 5758:666b04f93c55
[gaim-migrate @ 6183]
Now buddies who are in two groups on your list will have their statuses
updated for both. gaim_find_buddy can be used in a loop to find all buddies
with the specified name on an account. As such, gaim_find_buddy is somewhat
slower, but considering that people tend to have far fewer groups than
buddies the performance isn't hurt that much.
committer: Tailor Script <tailor@pidgin.im>
| author | Sean Egan <seanegan@gmail.com> |
|---|---|
| date | Thu, 05 Jun 2003 15:37:35 +0000 |
| parents | dae79aefac8d |
| children | 147f4c25af15 |
line wrap: on
line diff
--- a/src/blist.c Thu Jun 05 10:22:02 2003 +0000 +++ b/src/blist.c Thu Jun 05 15:37:35 2003 +0000 @@ -70,6 +70,7 @@ struct _gaim_hbuddy { char *name; GaimAccount *account; + GaimBlistNode *group; }; static guint _gaim_blist_hbuddy_hash (struct _gaim_hbuddy *hb) @@ -79,7 +80,7 @@ static guint _gaim_blist_hbuddy_equal (struct _gaim_hbuddy *hb1, struct _gaim_hbuddy *hb2) { - return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account); + return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group); } /***************************************************************************** @@ -506,6 +507,7 @@ hb = g_malloc(sizeof(struct _gaim_hbuddy)); hb->name = g_strdup(normalize(buddy->name)); hb->account = buddy->account; + hb->group = ((GaimBlistNode*)buddy)->parent; if (g_hash_table_lookup(gaimbuddylist->buddies, (gpointer)hb)) { /* This guy already exists */ @@ -628,6 +630,7 @@ hb.name = normalize(buddy->name); hb.account = buddy->account; + hb.group = ((GaimBlistNode*)buddy)->parent; if (g_hash_table_lookup_extended(gaimbuddylist->buddies, &hb, (gpointer *)&key, (gpointer *)&val)) { g_hash_table_remove(gaimbuddylist->buddies, &hb); g_free(key->name); @@ -736,17 +739,33 @@ struct buddy *gaim_find_buddy(GaimAccount *account, const char *name) { - struct buddy *buddy; + static struct buddy *buddy = NULL; struct _gaim_hbuddy hb; + GaimBlistNode *group; + const char *n = NULL; if (!gaimbuddylist) return NULL; + + if (!name && !buddy); - hb.name = normalize(name); - hb.account = account; - buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb); + if (name) { + group = gaimbuddylist->root; + n = name; + } else { + group = ((GaimBlistNode*)buddy)->parent->next; + n = buddy->name; + } - return buddy; + while (group) { + hb.name = normalize(n); + hb.account = account; + hb.group = group; + if (buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) + return buddy; + group = ((GaimBlistNode*)group)->next; + } + return NULL; } struct group *gaim_find_group(const char *name)
