Thu, 03 Dec 2020 22:28:40 -0600
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); }