diff libpurple/protocols/bonjour/bonjour.c @ 22975:d50194ab3016

Bonjour buddies will be saved persistently if they're moved out of the "Bonjour" group. Thanks to Eion Robb for the patch (blame me if something is broken as I tweaked a few things). Fixes #5753.
author Daniel Atallah <daniel.atallah@gmail.com>
date Fri, 16 May 2008 18:21:09 +0000
parents 1c87e81c44fa
children c9592f5b3a52 ef0bcbe33689
line wrap: on
line diff
--- a/libpurple/protocols/bonjour/bonjour.c	Fri May 16 16:04:05 2008 +0000
+++ b/libpurple/protocols/bonjour/bonjour.c	Fri May 16 18:21:09 2008 +0000
@@ -49,48 +49,39 @@
 static char *default_hostname;
 
 static void
-bonjour_removeallfromlocal(PurpleConnection *gc)
+bonjour_removeallfromlocal(PurpleConnection *conn, PurpleGroup *bonjour_group)
 {
-	PurpleAccount *account = purple_connection_get_account(gc);
-	PurpleBuddyList *blist;
-	PurpleBlistNode *gnode, *cnode, *cnodenext, *bnode, *bnodenext;
+	PurpleAccount *account = purple_connection_get_account(conn);
+	PurpleBlistNode *cnode, *cnodenext, *bnode, *bnodenext;
 	PurpleBuddy *buddy;
 
-	blist = purple_get_blist();
-	if (blist == NULL)
+	if (bonjour_group == NULL)
 		return;
 
 	/* Go through and remove all buddies that belong to this account */
-	for (gnode = blist->root; gnode; gnode = gnode->next)
-	{
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
+	for (cnode = ((PurpleBlistNode *) bonjour_group)->child; cnode; cnode = cnodenext) {
+		cnodenext = cnode->next;
+		if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
 			continue;
-		for (cnode = gnode->child; cnode; cnode = cnodenext)
-		{
-			cnodenext = cnode->next;
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
+		for (bnode = cnode->child; bnode; bnode = bnodenext) {
+			bnodenext = bnode->next;
+			if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
 				continue;
-			for (bnode = cnode->child; bnode; bnode = bnodenext)
-			{
-				bnodenext = bnode->next;
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				buddy = (PurpleBuddy *)bnode;
-				if (buddy->account != account)
-					continue;
-				purple_prpl_got_user_status(account, buddy->name, "offline", NULL);
-				purple_account_remove_buddy(account, buddy, NULL);
-				purple_blist_remove_buddy(buddy);
-			}
+			buddy = (PurpleBuddy *) bnode;
+			if (buddy->account != account)
+				continue;
+			purple_prpl_got_user_status(account, buddy->name, "offline", NULL);
+			purple_account_remove_buddy(account, buddy, NULL);
+			purple_blist_remove_buddy(buddy);
 		}
 	}
+
 }
 
 static void
 bonjour_login(PurpleAccount *account)
 {
 	PurpleConnection *gc = purple_account_get_connection(account);
-	PurpleGroup *bonjour_group;
 	BonjourData *bd;
 	PurpleStatus *status;
 	PurplePresence *presence;
@@ -151,10 +142,6 @@
 
 	bonjour_dns_sd_update_buddy_icon(bd->dns_sd_data);
 
-	/* Create a group for bonjour buddies */
-	bonjour_group = purple_group_new(BONJOUR_GROUP_NAME);
-	purple_blist_add_group(bonjour_group, NULL);
-
 	/* Show the buddy list by telling Purple we have already connected */
 	purple_connection_set_state(gc, PURPLE_CONNECTED);
 }
@@ -165,8 +152,10 @@
 	PurpleGroup *bonjour_group;
 	BonjourData *bd = connection->proto_data;
 
+	bonjour_group = purple_find_group(BONJOUR_GROUP_NAME);
+
 	/* Remove all the bonjour buddies */
-	bonjour_removeallfromlocal(connection);
+	bonjour_removeallfromlocal(connection, bonjour_group);
 
 	/* Stop looking for buddies in the LAN */
 	if (bd != NULL && bd->dns_sd_data != NULL)
@@ -183,7 +172,6 @@
 	}
 
 	/* Delete the bonjour group */
-	bonjour_group = purple_find_group(BONJOUR_GROUP_NAME);
 	if (bonjour_group != NULL)
 		purple_blist_remove_group(bonjour_group);
 
@@ -405,6 +393,25 @@
 		purple_notify_user_info_add_pair(user_info, _("XMPP Account"), bb->jid);
 }
 
+static void
+bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *old_group, const char *new_group)
+{
+	PurpleBlistNodeFlags oldflags;
+	PurpleBuddy *buddy = purple_find_buddy(connection->account, who);
+
+	if (buddy == NULL)
+		return;
+
+	oldflags = purple_blist_node_get_flags((PurpleBlistNode *)buddy);
+
+	/* If we're moving them out of the bonjour group, make them persistent */
+	if (strcmp(new_group, BONJOUR_GROUP_NAME) == 0)
+		purple_blist_node_set_flags((PurpleBlistNode *)buddy, oldflags | PURPLE_BLIST_NODE_FLAG_NO_SAVE);
+	else
+		purple_blist_node_set_flags((PurpleBlistNode *)buddy, oldflags ^ PURPLE_BLIST_NODE_FLAG_NO_SAVE);
+
+}
+
 static gboolean
 plugin_unload(PurplePlugin *plugin)
 {
@@ -463,7 +470,7 @@
 	NULL,                                                    /* get_cb_info */
 	NULL,                                                    /* get_cb_away */
 	NULL,                                                    /* alias_buddy */
-	NULL,                                                    /* group_buddy */
+	bonjour_group_buddy,                                     /* group_buddy */
 	NULL,                                                    /* rename_group */
 	NULL,                                                    /* buddy_free */
 	bonjour_convo_closed,                                    /* convo_closed */