static void add_purple_buddy_to_groups(JabberStream *js, const char *jid, const char *alias, GSList *groups) { GSList *buddies, *l; PurpleAccount *account = purple_connection_get_account(js->gc); buddies = purple_find_buddies(js->gc->account, jid); if(!groups) { if(!buddies) groups = g_slist_append(groups, g_strdup(_("Buddies"))); else { /* TODO: What should we do here? Removing the local buddies * is wrong, but so is letting the group state get out of sync with * the server. */ g_slist_free(buddies); return; } } while(buddies) { PurpleBuddy *b = buddies->data; PurpleGroup *g = purple_buddy_get_group(b); buddies = g_slist_delete_link(buddies, buddies); /* XMPP groups are case-sensitive, but libpurple groups are * case-insensitive. We treat a buddy in both "Friends" and "friends" * as only being in one group, but if we push changes about the buddy * to the server, the buddy will be dropped from one of the groups. * Not optimal, but better than the alternative, I think. */ if((l = g_slist_find_custom(groups, purple_group_get_name(g), (GCompareFunc)purple_utf8_strcasecmp))) { /* The buddy is already on the local list. Update info. */ const char *servernick, *balias; /* Previously stored serverside / buddy-supplied alias */ if((servernick = purple_blist_node_get_string((PurpleBlistNode*)b, "servernick"))) serv_got_alias(js->gc, jid, servernick); /* Alias from our roster retrieval */ balias = purple_buddy_get_local_buddy_alias(b); if(alias && !purple_strequal(alias, balias)) purple_serv_got_private_alias(js->gc, jid, alias); g_free(l->data); groups = g_slist_delete_link(groups, l); } else { /* This buddy isn't in the group on the server anymore */ purple_debug_info("jabber", "jabber_roster_parse(): Removing %s " "from group '%s' on the local list\n", purple_buddy_get_name(b), purple_group_get_name(g)); purple_blist_remove_buddy(b); } } if (groups) { char *tmp = roster_groups_join(groups); purple_debug_info("jabber", "jabber_roster_parse(): Adding %s to " "groups: %s\n", jid, tmp); g_free(tmp); } while(groups) { PurpleGroup *g = purple_find_group(groups->data); PurpleBuddy *b = purple_buddy_new(account, jid, alias); if(!g) { g = purple_group_new(groups->data); purple_blist_add_group(g, NULL); } purple_blist_add_buddy(b, NULL, g, NULL); purple_blist_alias_buddy(b, alias); g_free(groups->data); groups = g_slist_delete_link(groups, groups); } g_slist_free(buddies); }
//End VoxOx static void add_purple_buddies_to_groups(JabberStream *js, const char *jid, const char *alias, GSList *groups) { GSList *buddies, *g2, *l; gchar *my_bare_jid; GList *pool = NULL; buddies = purple_find_buddies(js->gc->account, jid); g2 = groups; if(!groups) { if(!buddies) g2 = g_slist_append(g2, g_strdup(_("Buddies"))); else { g_slist_free(buddies); return; } } my_bare_jid = g_strdup_printf("%s@%s", js->user->node, js->user->domain); while(buddies) { PurpleBuddy *b = buddies->data; PurpleGroup *g = purple_buddy_get_group(b); buddies = g_slist_remove(buddies, b); if((l = g_slist_find_custom(g2, g->name, (GCompareFunc)strcmp))) { const char *servernick; /* Previously stored serverside / buddy-supplied alias */ if((servernick = purple_blist_node_get_string((PurpleBlistNode*)b, "servernick"))) serv_got_alias(js->gc, jid, servernick); /* Alias from our roster retrieval */ if(alias && (!b->alias || strcmp(b->alias, alias))) purple_serv_got_private_alias(js->gc, jid, alias); g_free(l->data); g2 = g_slist_delete_link(g2, l); } else { pool = g_list_prepend(pool, b); } } while(g2) { PurpleGroup *g = purple_find_group(g2->data); PurpleBuddy *b = NULL; if (pool) { b = pool->data; pool = g_list_delete_link(pool, pool); } else { b = purple_buddy_new(js->gc->account, jid, alias); } if(!g) { g = purple_group_new(g2->data); purple_blist_add_group(g, NULL); } purple_blist_add_buddy(b, NULL, g, NULL); purple_blist_alias_buddy(b, alias); /* If we just learned about ourself, then fake our status, * because we won't be receiving a normal presence message * about ourself. */ if(!strcmp(b->name, my_bare_jid)) { PurplePresence *gpresence; PurpleStatus *status; gpresence = purple_account_get_presence(js->gc->account); status = purple_presence_get_active_status(gpresence); jabber_presence_fake_to_self(js, status); } g_free(g2->data); g2 = g_slist_delete_link(g2, g2); } while (pool) { PurpleBuddy *b = pool->data; purple_blist_remove_buddy(b); pool = g_list_delete_link(pool, pool); } g_free(my_bare_jid); g_slist_free(buddies); }