Fix a bug where accounts were losing their active status.

Thu, 03 Dec 2020 22:28:40 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 03 Dec 2020 22:28:40 -0600
changeset 40636
d9a2e635775d
parent 40635
1f8b5b68a806
child 40637
08cb47165790

Fix a bug where accounts were losing their active status.

Testing Done:
Compiled and ran locally, verified that an accounts active status is actually saved in `accounts.xml` now.

Reviewed at https://reviews.imfreedom.org/r/262/

libpurple/purpleaccountpresence.c file | annotate | diff | comparison | revisions
libpurple/purplebuddypresence.c file | annotate | diff | comparison | revisions
--- a/libpurple/purpleaccountpresence.c	Thu Dec 03 20:15:31 2020 -0600
+++ b/libpurple/purpleaccountpresence.c	Thu Dec 03 22:28:40 2020 -0600
@@ -27,6 +27,7 @@
 	PurplePresence parent;
 
 	PurpleAccount *account;
+	GList *statuses;
 };
 
 enum {
@@ -102,7 +103,16 @@
 purple_account_presence_get_statuses(PurplePresence *presence) {
 	PurpleAccountPresence *account_presence = PURPLE_ACCOUNT_PRESENCE(presence);
 
-	return purple_protocol_get_statuses(account_presence->account, presence);
+	/* We cache purple_protocol_get_statuses because it creates all new
+	 * statuses which loses at least the active attribute, which breaks all
+	 * sorts of things.
+	 */
+	if(account_presence->statuses == NULL) {
+		account_presence->statuses =
+			purple_protocol_get_statuses(account_presence->account, presence);
+	}
+
+	return account_presence->statuses;
 }
 
 /******************************************************************************
@@ -150,6 +160,7 @@
 	PurpleAccountPresence *presence = PURPLE_ACCOUNT_PRESENCE(obj);
 
 	g_clear_object(&presence->account);
+	g_list_free_full(presence->statuses, g_object_unref);
 
 	G_OBJECT_CLASS(purple_account_presence_parent_class)->finalize(obj);
 }
--- a/libpurple/purplebuddypresence.c	Thu Dec 03 20:15:31 2020 -0600
+++ b/libpurple/purplebuddypresence.c	Thu Dec 03 22:28:40 2020 -0600
@@ -29,6 +29,8 @@
 	PurplePresence parent;
 
 	PurpleBuddy *buddy;
+
+	GList *statuses;
 };
 
 enum {
@@ -197,13 +199,24 @@
 
 static GList *
 purple_buddy_presence_get_statuses(PurplePresence *presence) {
-	PurpleAccount *account = NULL;
 	PurpleBuddyPresence *buddy_presence = NULL;
 
 	buddy_presence = PURPLE_BUDDY_PRESENCE(presence);
-	account = purple_buddy_get_account(buddy_presence->buddy);
+
+	/* We cache purple_protocol_get_statuses because it creates all new
+	 * statuses which loses at least the active attribute, which breaks all
+	 * sorts of things.
+	 */
+	if(buddy_presence->statuses == NULL) {
+		PurpleAccount *account = NULL;
 
-	return purple_protocol_get_statuses(account, presence);
+		account = purple_buddy_get_account(buddy_presence->buddy);
+
+		buddy_presence->statuses = purple_protocol_get_statuses(account,
+		                                                        presence);
+	}
+
+	return buddy_presence->statuses;
 }
 
 /******************************************************************************
@@ -250,6 +263,7 @@
 	PurpleBuddyPresence *presence = PURPLE_BUDDY_PRESENCE(obj);
 
 	g_clear_object(&presence->buddy);
+	g_list_free_full(presence->statuses, g_object_unref);
 
 	G_OBJECT_CLASS(purple_buddy_presence_parent_class)->finalize(obj);
 }

mercurial