From: Jim S. <jse...@us...> - 2002-07-07 14:32:00
|
Update of /cvsroot/gaim/gaim/src In directory usw-pr-cvs1:/tmp/cvs-serv3678/src Modified Files: dialogs.c gaim.h prpl.h server.c Log Message: Support for server-side synchronization on group rename. (Thanks, Mark Doliner) Index: dialogs.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/dialogs.c,v retrieving revision 1.325 retrieving revision 1.326 diff -u -d -r1.325 -r1.326 --- dialogs.c 22 Jun 2002 12:25:53 -0000 1.325 +++ dialogs.c 7 Jul 2002 14:31:56 -0000 1.326 @@ -3946,16 +3946,20 @@ if (new_name && (strlen(new_name) != 0) && strcmp(new_name, g->name)) { char *prevname; gc = g->gc; + if ((orig = find_group(g->gc, new_name)) != NULL && g_strcasecmp(new_name, g->name)) { orig->members = g_slist_concat(orig->members, g->members); handle_group_rename(orig, g->name); g->gc->groups = g_slist_remove(g->gc->groups, g); /* FIXME, i don't like calling this. it's sloppy. */ build_edit_tree(); + serv_rename_group(gc, g, new_name); g_free(g); } else { prevname = g_strdup(g->name); + serv_rename_group(gc, g, new_name); g_snprintf(g->name, sizeof(g->name), "%s", new_name); handle_group_rename(g, prevname); + /* FIXME, i don't like calling this. it's sloppy. */ build_edit_tree(); g_free(prevname); } do_export(gc); Index: gaim.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/gaim.h,v retrieving revision 1.326 retrieving revision 1.327 diff -u -d -r1.326 -r1.327 --- gaim.h 18 Jun 2002 00:49:55 -0000 1.326 +++ gaim.h 7 Jul 2002 14:31:57 -0000 1.327 @@ -409,6 +409,7 @@ extern void serv_get_away(struct gaim_connection *, char *); extern void serv_alias_buddy(struct buddy *); extern void serv_move_buddy(struct buddy *, struct group *, struct group *); +extern void serv_rename_group(struct gaim_connection *, struct group *, char *); /* Functions in util.c */ extern char *normalize(const char *); Index: prpl.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/prpl.h,v retrieving revision 1.66 retrieving revision 1.67 diff -u -d -r1.66 -r1.67 --- prpl.h 15 Jun 2002 20:21:01 -0000 1.66 +++ prpl.h 7 Jul 2002 14:31:57 -0000 1.67 @@ -168,6 +168,9 @@ /* change a buddy's group on a server list/roster */ void (* group_buddy) (struct gaim_connection *, char *who, char *old_group, char *new_group); + /* rename a group on a server list/roster */ + void (* rename_group) (struct gaim_connection *, char *old_group, char *new_group, GList *members); + void (* buddy_free) (struct buddy *); /* this is really bad. */ Index: server.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/server.c,v retrieving revision 1.227 retrieving revision 1.228 diff -u -d -r1.227 -r1.228 --- server.c 23 Apr 2002 16:30:09 -0000 1.227 +++ server.c 7 Jul 2002 14:31:57 -0000 1.228 @@ -315,6 +315,31 @@ } } +/* + * Rename a group on server roster/list. + */ +void serv_rename_group(struct gaim_connection *g, struct group *old_group, char *new_name) +{ + if (g && g->prpl && old_group && new_name) { + GList *tobemoved = NULL; + GSList *original; + + for (original=old_group->members; original; original=g_slist_next(original)) + tobemoved = g_list_append(tobemoved, ((struct buddy *)original->data)->name); + + if (g->prpl->rename_group) { + /* prpl's might need to check if the group already + * exists or not, and handle that differently */ + g->prpl->rename_group(g, old_group->name, new_name, tobemoved); + } else { + serv_remove_buddies(g, tobemoved, old_group->name); + serv_add_buddies(g, tobemoved); + } + + g_list_free(tobemoved); + } +} + void serv_add_permit(struct gaim_connection *g, char *name) { if (g && g_slist_find(connections, g) && g->prpl && g->prpl->add_permit) |