diff src/blist.c @ 10853:2409700be3dc

[gaim-migrate @ 12527] (15:46:50) LSchiere2: grim: commit message? (15:47:01) grim: LSchiere2: whatever..[sic] grim fixed a crash and some oddness in renaming groups. a related patch went into oldstatus a while back (also from grim). This is the HEAD version, removing a server.[ch] function in the process. committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Tue, 19 Apr 2005 19:48:29 +0000
parents fa06fda62868
children 4a4f2760a9ad
line wrap: on
line diff
--- a/src/blist.c	Tue Apr 19 16:00:20 2005 +0000
+++ b/src/blist.c	Tue Apr 19 19:48:29 2005 +0000
@@ -988,9 +988,43 @@
 		ops->update(gaimbuddylist, (GaimBlistNode*)source);
 
 	/* Notify all PRPLs */
-	for (accts = gaim_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) {
-		GaimAccount *account = accts->data;
-		serv_rename_group(account->gc, old_name, source, moved_buddies);
+	if(old_name && source && strcmp(source->name, old_name)) {
+		for (accts = gaim_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) {
+			GaimAccount *account = accts->data;
+			GaimPluginProtocolInfo *prpl_info = NULL;
+			GList *l = NULL, *buddies = NULL;
+
+			if(account->gc && account->gc->prpl)
+				prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl);
+
+			if(!prpl_info)
+				continue;
+
+			for(l = moved_buddies; l; l = l->next) {
+				GaimBuddy *buddy = (GaimBuddy *)l->data;
+
+				if(buddy && buddy->account == account)
+					buddies = g_list_append(buddies, (GaimBlistNode *)buddy);
+			}
+
+			if(prpl_info->rename_group) {
+				prpl_info->rename_group(account->gc, old_name, source, buddies);
+			} else {
+				GList *cur, *groups = NULL;
+
+				/* Make a list of what the groups each buddy is in */
+				for(cur = buddies; cur; cur = cur->next) {
+					GaimBlistNode *node = (GaimBlistNode *)cur->data;
+					groups = g_list_append(groups, node->parent->parent);
+				}
+
+				serv_remove_buddies(account->gc, buddies, groups);
+				g_list_free(groups);
+				serv_add_buddies(account->gc, buddies);
+			}
+
+			g_list_free(buddies);
+		}
 	}
 	g_list_free(moved_buddies);
 	g_free(old_name);