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)
|