Mercurial > pidgin
diff libpurple/protocols/oscar/oscar.c @ 26764:0e99b80b54c6
Make purple_find_buddies(account, NULL) O(# buddies in the account) and rewrite purple_ssi_parselist to take advantage of said efficiency.
Applied HanzZ's patch with a few tweaks, mostly making the hash table local
to blist.c and using the signals from the previous commit.
committer: Paul Aurich <paul@darkrain42.org>
author | hanzz@soc.pidgin.im |
---|---|
date | Fri, 01 May 2009 08:07:12 +0000 |
parents | b87843de7c6a |
children | 0b97f73fa3d2 |
line wrap: on
line diff
--- a/libpurple/protocols/oscar/oscar.c Fri May 01 06:59:36 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.c Fri May 01 08:07:12 2009 +0000 @@ -5122,58 +5122,43 @@ aim_ssi_cleanlist(od); { /* If not in server list then prune from local list */ - PurpleBlistNode *gnode, *cnode, *bnode; - PurpleBuddyList *blist; GSList *cur, *next; - + GSList *buddies = purple_find_buddies(account, NULL); + /* Buddies */ cur = NULL; - if ((blist = purple_get_blist()) != NULL) { - for (gnode = purple_blist_get_root(); gnode; - gnode = purple_blist_node_get_sibling_next(gnode)) { - const char *gname; - if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) - continue; - g = (PurpleGroup *)gnode; - gname = purple_group_get_name(g); - for (cnode = purple_blist_node_get_first_child(gnode); - cnode; - cnode = purple_blist_node_get_sibling_next(cnode)) { - if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) - continue; - for (bnode = purple_blist_node_get_first_child(cnode); - bnode; - bnode = purple_blist_node_get_sibling_next(bnode)) { - const char *bname; - if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) - continue; - b = (PurpleBuddy *)bnode; - bname = purple_buddy_get_name(b); - if (purple_buddy_get_account(b) == account) { - if (aim_ssi_itemlist_exists(od->ssi.local, bname)) { - /* If the buddy is an ICQ user then load his nickname */ - const char *servernick = purple_blist_node_get_string((PurpleBlistNode*)b, "servernick"); - char *alias; - const char *balias; - if (servernick) - serv_got_alias(gc, bname, servernick); - - /* Store local alias on server */ - alias = aim_ssi_getalias(od->ssi.local, gname, bname); - balias = purple_buddy_get_local_buddy_alias(b); - if (!alias && balias && *balias) - aim_ssi_aliasbuddy(od, gname, bname, balias); - g_free(alias); - } else { - purple_debug_info("oscar", - "ssi: removing buddy %s from local list\n", bname); - /* We can't actually remove now because it will screw up our looping */ - cur = g_slist_prepend(cur, b); - } - } - } - } + + while(buddies) { + PurpleGroup *g; + const char *gname; + const char *bname; + + b = buddies->data; + g = purple_buddy_get_group(b); + gname = purple_group_get_name(g); + bname = purple_buddy_get_name(b); + + if (aim_ssi_itemlist_exists(od->ssi.local, bname)) { + /* If the buddy is an ICQ user then load his nickname */ + const char *servernick = purple_blist_node_get_string((PurpleBlistNode*)b, "servernick"); + char *alias; + const char *balias; + if (servernick) + serv_got_alias(gc, bname, servernick); + + /* Store local alias on server */ + alias = aim_ssi_getalias(od->ssi.local, gname, bname); + balias = purple_buddy_get_local_buddy_alias(b); + if (!alias && balias && *balias) + aim_ssi_aliasbuddy(od, gname, bname, balias); + g_free(alias); + } else { + purple_debug_info("oscar", + "ssi: removing buddy %s from local list\n", bname); + /* We can't actually remove now because it will screw up our looping */ + cur = g_slist_prepend(cur, b); } + buddies = g_slist_delete_link(buddies, buddies); } while (cur != NULL) {