Mercurial > pidgin
changeset 28653:6c333c1d20b9
disapproval of revision '661db628ce40c3548058f062ea72d9687654d53a'
This is causing a ton of crashes for Adium. Clearly this needs to be done differently.
author | John Bailey <rekkanoryo@rekkanoryo.org> |
---|---|
date | Sun, 29 Nov 2009 16:16:40 +0000 |
parents | 86ff30fb8ae3 |
children | c06e1f777e42 |
files | libpurple/protocols/oscar/oscar.c |
diffstat | 1 files changed, 68 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/oscar/oscar.c Wed Nov 04 22:16:46 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.c Sun Nov 29 16:16:40 2009 +0000 @@ -5225,7 +5225,7 @@ { /* If not in server list then prune from local list */ GSList *cur, *next; GSList *buddies = purple_find_buddies(account, NULL); - + /* Buddies */ cur = NULL; @@ -5315,28 +5315,45 @@ /* Add from server list to local list */ for (curitem=od->ssi.local; curitem; curitem=curitem->next) { + if ((curitem->name == NULL) || (g_utf8_validate(curitem->name, -1, NULL))) switch (curitem->type) { case AIM_SSI_TYPE_BUDDY: { /* Buddy */ if (curitem->name) { struct aim_ssi_item *groupitem; - const char *gname, *alias; + char *gname, *gname_utf8, *alias, *alias_utf8; groupitem = aim_ssi_itemlist_find(od->ssi.local, curitem->gid, 0x0000); gname = groupitem ? groupitem->name : NULL; - - g = purple_find_group(gname ? gname : _("Orphans")); + if (gname != NULL) { + if (g_utf8_validate(gname, -1, NULL)) + gname_utf8 = g_strdup(gname); + else + gname_utf8 = oscar_utf8_try_convert(account, gname); + } else + gname_utf8 = NULL; + + g = purple_find_group(gname_utf8 ? gname_utf8 : _("Orphans")); if (g == NULL) { - g = purple_group_new(gname ? gname : _("Orphans")); + g = purple_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); purple_blist_add_group(g, NULL); } alias = aim_ssi_getalias(od->ssi.local, gname, curitem->name); + if (alias != NULL) { + if (g_utf8_validate(alias, -1, NULL)) + alias_utf8 = g_strdup(alias); + else + alias_utf8 = oscar_utf8_try_convert(account, alias); + g_free(alias); + } else + alias_utf8 = NULL; + b = purple_find_buddy_in_group(account, curitem->name, g); if (b) { /* Get server stored alias */ - purple_blist_alias_buddy(b, alias); + purple_blist_alias_buddy(b, alias_utf8); } else { - b = purple_buddy_new(account, curitem->name, alias); + b = purple_buddy_new(account, curitem->name, alias_utf8); purple_debug_info("oscar", "ssi: adding buddy %s to group %s to local list\n", curitem->name, gname); @@ -5360,15 +5377,30 @@ purple_buddy_get_name(b), OSCAR_STATUS_ID_MOBILE, NULL); } + + g_free(gname_utf8); + g_free(alias_utf8); } } break; case AIM_SSI_TYPE_GROUP: { /* Group */ - const char *gname = curitem->name; - if (gname != NULL && purple_find_group(gname) == NULL) { - g = purple_group_new(gname); + char *gname; + char *gname_utf8; + + gname = curitem->name; + if (gname != NULL) { + if (g_utf8_validate(gname, -1, NULL)) + gname_utf8 = g_strdup(gname); + else + gname_utf8 = oscar_utf8_try_convert(account, gname); + } else + gname_utf8 = NULL; + + if (gname_utf8 != NULL && purple_find_group(gname_utf8) == NULL) { + g = purple_group_new(gname_utf8); purple_blist_add_group(g, NULL); } + g_free(gname_utf8); } break; case AIM_SSI_TYPE_PERMIT: { /* Permit buddy */ @@ -5503,8 +5535,7 @@ { PurpleConnection *gc; PurpleAccount *account; - const char *gname; - char *alias; + char *gname, *gname_utf8, *alias, *alias_utf8; PurpleBuddy *b; PurpleGroup *g; struct aim_ssi_item *ssi_item; @@ -5525,7 +5556,19 @@ return 1; gname = aim_ssi_itemlist_findparentname(od->ssi.local, name); + gname_utf8 = gname ? oscar_utf8_try_convert(account, gname) : NULL; + alias = aim_ssi_getalias(od->ssi.local, gname, name); + if (alias != NULL) + { + if (g_utf8_validate(alias, -1, NULL)) + alias_utf8 = g_strdup(alias); + else + alias_utf8 = oscar_utf8_try_convert(account, alias); + } + else + alias_utf8 = NULL; + g_free(alias); b = purple_find_buddy(account, name); if (b) { @@ -5534,21 +5577,21 @@ * of your buddies, so update our local buddy list with * the person's new alias. */ - purple_blist_alias_buddy(b, alias); + purple_blist_alias_buddy(b, alias_utf8); } else if (snac_subtype == 0x0008) { /* * You're logged in somewhere else and you added a buddy to * your server list, so add them to your local buddy list. */ - b = purple_buddy_new(account, name, alias); - - if (!(g = purple_find_group(gname ? gname : _("Orphans")))) { - g = purple_group_new(gname ? gname : _("Orphans")); + b = purple_buddy_new(account, name, alias_utf8); + + if (!(g = purple_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { + g = purple_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); purple_blist_add_group(g, NULL); } purple_debug_info("oscar", - "ssi: adding buddy %s to group %s to local list\n", name, gname ? gname : _("Orphans")); + "ssi: adding buddy %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); purple_blist_add_buddy(b, NULL, g, NULL); /* Mobile users should always be online */ @@ -5561,8 +5604,6 @@ } - g_free(alias); - ssi_item = aim_ssi_itemlist_finditem(od->ssi.local, gname, name, AIM_SSI_TYPE_BUDDY); if (ssi_item == NULL) @@ -5572,6 +5613,9 @@ "group %s\n", name, gname); } + g_free(gname_utf8); + g_free(alias_utf8); + return 1; } @@ -6274,6 +6318,7 @@ struct name_data *data; PurpleGroup *g; char *comment; + gchar *comment_utf8; gchar *title; PurpleAccount *account; const char *name; @@ -6292,6 +6337,7 @@ data = g_new(struct name_data, 1); comment = aim_ssi_getcomment(od->ssi.local, purple_group_get_name(g), name); + comment_utf8 = comment ? oscar_utf8_try_convert(account, comment) : NULL; data->gc = gc; data->name = g_strdup(name); @@ -6299,7 +6345,7 @@ title = g_strdup_printf(_("Buddy Comment for %s"), data->name); purple_request_input(gc, title, _("Buddy Comment:"), NULL, - comment, TRUE, FALSE, NULL, + comment_utf8, TRUE, FALSE, NULL, _("_OK"), G_CALLBACK(oscar_ssi_editcomment), _("_Cancel"), G_CALLBACK(oscar_free_name_data), account, data->name, NULL, @@ -6307,6 +6353,7 @@ g_free(title); g_free(comment); + g_free(comment_utf8); } static void