pidgin/pidgin

d9a2e635775d
Parents 1f8b5b68a806
Children 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/
--- 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);
}