Wed, 07 May 2014 13:09:06 +0200
Backport 407e0fa6f7d1: don't split contacts on default group (xmpp)
--- a/libpurple/protocols/jabber/google/google_roster.c Wed May 07 11:56:53 2014 +0200 +++ b/libpurple/protocols/jabber/google/google_roster.c Wed May 07 13:09:06 2014 +0200 @@ -24,6 +24,7 @@ #include "presence.h" #include "debug.h" #include "xmlnode.h" +#include "roster.h" void jabber_google_roster_outgoing(JabberStream *js, xmlnode *query, xmlnode *item) { @@ -127,7 +128,8 @@ g = purple_buddy_get_group(b); group = xmlnode_new_child(item, "group"); - xmlnode_insert_data(group, purple_group_get_name(g), -1); + xmlnode_insert_data(group, + jabber_roster_group_get_global_name(g), -1); buddies = buddies->next; } @@ -187,7 +189,8 @@ g = purple_buddy_get_group(b); group = xmlnode_new_child(item, "group"); - xmlnode_insert_data(group, purple_group_get_name(g), -1); + xmlnode_insert_data(group, + jabber_roster_group_get_global_name(g), -1); buddies = buddies->next; }
--- a/libpurple/protocols/jabber/roster.c Wed May 07 11:56:53 2014 +0200 +++ b/libpurple/protocols/jabber/roster.c Wed May 07 13:09:06 2014 +0200 @@ -114,7 +114,7 @@ if(!groups) { if(!buddies) - groups = g_slist_append(groups, g_strdup(_("Buddies"))); + groups = g_slist_append(groups, g_strdup(JABBER_ROSTER_DEFAULT_GROUP)); 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 @@ -137,7 +137,15 @@ * 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))) { + l = g_slist_find_custom(groups, purple_group_get_name(g), + (GCompareFunc)purple_utf8_strcasecmp); + if (!l && g_strcmp0(purple_group_get_name(g), _("Buddies")) == 0) { + l = g_slist_find_custom(groups, JABBER_ROSTER_DEFAULT_GROUP, + (GCompareFunc)purple_utf8_strcasecmp); + } + /* XXX: in 3.0.0 we have localized default name here too */ + + if (l) { /* The buddy is already on the local list. Update info. */ const char *servernick, *balias; @@ -156,7 +164,7 @@ 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)); + jabber_roster_group_get_global_name(g)); purple_blist_remove_buddy(b); } } @@ -251,9 +259,12 @@ for(group = xmlnode_get_child(item, "group"); group; group = xmlnode_get_next_twin(group)) { char *group_name = xmlnode_get_data(group); - if (group_name == NULL || *group_name == '\0') + if (group_name == NULL || *group_name == '\0' || + g_strcmp0(group_name, _("Buddies")) == 0) + { /* Changing this string? Look in add_purple_buddy_to_groups */ - group_name = g_strdup(_("Buddies")); + group_name = g_strdup(JABBER_ROSTER_DEFAULT_GROUP); + } /* * See the note in add_purple_buddy_to_groups; the core handles @@ -322,7 +333,8 @@ while(buddies) { b = buddies->data; g = purple_buddy_get_group(b); - groups = g_slist_append(groups, (char *)purple_group_get_name(g)); + groups = g_slist_append(groups, + (char *)jabber_roster_group_get_global_name(g)); buddies = g_slist_remove(buddies, b); } @@ -450,7 +462,7 @@ while(buddies) { b = buddies->data; g = purple_buddy_get_group(b); - gname = purple_group_get_name(g); + gname = jabber_roster_group_get_global_name(g); if(!strcmp(gname, old_group)) groups = g_slist_append(groups, (char*)new_group); /* ick */ else @@ -468,7 +480,7 @@ PurpleGroup *group, GList *moved_buddies) { GList *l; - const char *gname = purple_group_get_name(group); + const char *gname = jabber_roster_group_get_global_name(group); for(l = moved_buddies; l; l = l->next) { PurpleBuddy *buddy = l->data; jabber_roster_group_change(gc, purple_buddy_get_name(buddy), old_name, gname); @@ -489,12 +501,14 @@ while(buddies) { tmpbuddy = buddies->data; tmpgroup = purple_buddy_get_group(tmpbuddy); - groups = g_slist_append(groups, (char *)purple_group_get_name(tmpgroup)); + groups = g_slist_append(groups, + (char *)jabber_roster_group_get_global_name(tmpgroup)); buddies = g_slist_remove(buddies, tmpbuddy); } - purple_debug_info("jabber", "jabber_roster_remove_buddy(): Removing %s from %s\n", - purple_buddy_get_name(buddy), purple_group_get_name(group)); + purple_debug_info("jabber", "jabber_roster_remove_buddy(): " + "Removing %s from %s\n", purple_buddy_get_name(buddy), + jabber_roster_group_get_global_name(group)); jabber_roster_update(gc->proto_data, name, groups); } else { @@ -512,3 +526,20 @@ jabber_iq_send(iq); } } + +const gchar * +jabber_roster_group_get_global_name(PurpleGroup *group) +{ + const gchar *name = NULL; + + if (group) + name = purple_group_get_name(group); + + if (name == NULL) + name = JABBER_ROSTER_DEFAULT_GROUP; + else if (g_strcmp0(name, _("Buddies")) == 0) + name = JABBER_ROSTER_DEFAULT_GROUP; + /* XXX: in 3.0.0 we have localized default name here too */ + + return name; +}
--- a/libpurple/protocols/jabber/roster.h Wed May 07 11:56:53 2014 +0200 +++ b/libpurple/protocols/jabber/roster.h Wed May 07 13:09:06 2014 +0200 @@ -24,6 +24,9 @@ #ifndef PURPLE_JABBER_ROSTER_H_ #define PURPLE_JABBER_ROSTER_H_ +/* it must *not* be localized */ +#define JABBER_ROSTER_DEFAULT_GROUP "Buddies" + #include "jabber.h" void jabber_roster_request(JabberStream *js); @@ -42,4 +45,7 @@ void jabber_roster_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group); +const gchar * +jabber_roster_group_get_global_name(PurpleGroup *group); + #endif /* PURPLE_JABBER_ROSTER_H_ */