pidgin/pidgin

64d7e69bff25
Parents 7d551859bd94
Children cde17b22217f
Move PurpleAccountManager to GPtrArray and implement GListModel

Move `PurpleAccountManager` to `GPtrArray` and implement `GListModel`

Testing Done:
Compiled and ran `ninja test`. Opened Account Manager and Privacy Dialog to check that account list seemed okay.

Reviewed at https://reviews.imfreedom.org/r/1987/
--- a/finch/gntaccount.c Fri Oct 28 03:42:47 2022 -0500
+++ b/finch/gntaccount.c Fri Oct 28 03:44:19 2022 -0500
@@ -736,9 +736,9 @@
{
GntTree *tree = GNT_TREE(widget);
PurpleAccountManager *manager = NULL;
+ GListModel *manager_model = NULL;
PurpleAccount *account = gnt_tree_get_selection_data(tree);
int move, pos, count;
- GList *accounts;
if (!account)
return FALSE;
@@ -755,20 +755,28 @@
}
manager = purple_account_manager_get_default();
- accounts = purple_account_manager_get_all(manager);
- count = g_list_length(accounts);
- pos = g_list_index(accounts, account);
- pos = (move + pos + count + 1) % (count + 1);
- if(pos >= 0) {
- purple_account_manager_reorder(manager, account, pos);
+ manager_model = G_LIST_MODEL(manager);
+
+ count = g_list_model_get_n_items(manager_model);
+ for(pos = 0; pos < count; pos++) {
+ PurpleAccount *acct = g_list_model_get_item(manager_model, pos);
+ if(account == acct) {
+ pos = (move + pos + count + 1) % (count + 1);
+ purple_account_manager_reorder(manager, account, pos);
+ g_object_unref(acct);
+ break;
+ }
+ g_object_unref(acct);
}
/* I don't like this, but recreating the entire list seems to be
* the easiest way of doing it */
gnt_tree_remove_all(tree);
- accounts = purple_account_manager_get_all(manager);
- for (; accounts; accounts = accounts->next)
- account_add(accounts->data);
+ for(pos = 0; pos < count; pos++) {
+ PurpleAccount *account = g_list_model_get_item(manager_model, pos);
+ account_add(account);
+ g_object_unref(account);
+ }
gnt_tree_set_selected(tree, account);
return TRUE;
@@ -784,8 +792,8 @@
void
finch_accounts_show_all(void)
{
- PurpleAccountManager *manager = NULL;
- GList *iter;
+ GListModel *manager_model = NULL;
+ guint n_items = 0;
GntWidget *box, *button;
if (accounts.window) {
@@ -808,12 +816,12 @@
accounts.tree = gnt_tree_new_with_columns(2);
gnt_widget_set_has_border(accounts.tree, FALSE);
- manager = purple_account_manager_get_default();
- iter = purple_account_manager_get_all(manager);
-
- for(; iter; iter = iter->next) {
- PurpleAccount *account = iter->data;
+ manager_model = purple_account_manager_get_default_as_model();
+ n_items = g_list_model_get_n_items(manager_model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleAccount *account = g_list_model_get_item(manager_model, index);
account_add(account);
+ g_object_unref(account);
}
g_signal_connect(G_OBJECT(accounts.tree), "toggled", G_CALLBACK(account_toggled), NULL);
@@ -894,10 +902,12 @@
finch_accounts_init(void)
{
PurpleAccountManager *manager = NULL;
+ GListModel *manager_model = NULL;
gpointer account_handle = NULL;
- GList *iter;
+ guint n_items = 0;
manager = purple_account_manager_get_default();
+ manager_model = G_LIST_MODEL(manager);
account_handle = purple_accounts_get_handle();
g_signal_connect(manager, "added", G_CALLBACK(account_added_callback),
@@ -911,14 +921,26 @@
finch_accounts_get_handle(),
G_CALLBACK(account_abled_cb), GINT_TO_POINTER(TRUE));
- iter = purple_account_manager_get_all(manager);
- if (iter) {
- for (; iter; iter = iter->next) {
- if (purple_account_get_enabled(iter->data))
+ n_items = g_list_model_get_n_items(manager_model);
+ if(n_items != 0) {
+ gboolean has_enabled_account = FALSE;
+
+ for(guint index = 0; index < n_items; index++) {
+ PurpleAccount *account = NULL;
+ account = g_list_model_get_item(manager_model, index);
+
+ if(purple_account_get_enabled(account)) {
+ has_enabled_account = TRUE;
+ g_object_unref(account);
break;
+ }
+
+ g_object_unref(account);
}
- if (!iter)
+
+ if(!has_enabled_account) {
finch_accounts_show_all();
+ }
} else {
edit_account(NULL);
finch_accounts_show_all();
--- a/finch/gntrequest.c Fri Oct 28 03:42:47 2022 -0500
+++ b/finch/gntrequest.c Fri Oct 28 03:44:19 2022 -0500
@@ -514,12 +514,22 @@
return ret;
}
+static void
+add_account_to_combo(GntWidget *combo, PurpleAccount *account) {
+ char *text = NULL;
+
+ text = g_strdup_printf("%s (%s)",
+ purple_account_get_username(account),
+ purple_account_get_protocol_name(account));
+ gnt_combo_box_add_data(GNT_COMBO_BOX(combo), account, text);
+ g_free(text);
+}
+
static GntWidget*
create_account_field(PurpleRequestField *field)
{
gboolean all;
PurpleAccount *def;
- GList *list;
GntWidget *combo = gnt_combo_box_new();
all = purple_request_field_account_get_show_all(field);
@@ -529,29 +539,37 @@
}
if(all) {
- PurpleAccountManager *manager = purple_account_manager_get_default();
- list = purple_account_manager_get_all(manager);
+ GListModel *manager_model = NULL;
+ guint n_items = 0;
+
+ manager_model = purple_account_manager_get_default_as_model();
+ n_items = g_list_model_get_n_items(manager_model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleAccount *account;
+
+ account = g_list_model_get_item(manager_model, index);
+ add_account_to_combo(combo, account);
+
+ if(account == def) {
+ gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), account);
+ }
+
+ g_object_unref(account);
+ }
} else {
- list = purple_connections_get_all();
+ GList *list = purple_connections_get_all();
+ for(; list; list = list->next) {
+ PurpleAccount *account = NULL;
+
+ account = purple_connection_get_account(list->data);
+ add_account_to_combo(combo, account);
+
+ if(account == def) {
+ gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), account);
+ }
+ }
}
- for(; list; list = list->next) {
- PurpleAccount *account;
- char *text;
-
- if (all)
- account = list->data;
- else
- account = purple_connection_get_account(list->data);
-
- text = g_strdup_printf("%s (%s)",
- purple_account_get_username(account),
- purple_account_get_protocol_name(account));
- gnt_combo_box_add_data(GNT_COMBO_BOX(combo), account, text);
- g_free(text);
- if (account == def)
- gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), account);
- }
gnt_widget_set_size(combo, 20, 3); /* ew */
return combo;
}
--- a/finch/gntstatus.c Fri Oct 28 03:42:47 2022 -0500
+++ b/finch/gntstatus.c Fri Oct 28 03:44:19 2022 -0500
@@ -491,12 +491,12 @@
void finch_savedstatus_edit(PurpleSavedStatus *saved)
{
- PurpleAccountManager *manager = NULL;
+ GListModel *manager_model = NULL;
EditStatus *edit;
GntWidget *window, *box, *button, *entry, *combo, *label, *tree;
PurpleStatusPrimitive prims[] = {PURPLE_STATUS_AVAILABLE, PURPLE_STATUS_AWAY,
PURPLE_STATUS_INVISIBLE, PURPLE_STATUS_OFFLINE, PURPLE_STATUS_UNSET}, current;
- GList *iter;
+ guint n_items = 0;
int i;
if (saved)
@@ -567,10 +567,12 @@
gnt_tree_set_col_width(GNT_TREE(tree), 1, 10);
gnt_tree_set_col_width(GNT_TREE(tree), 2, 30);
- manager = purple_account_manager_get_default();
- iter = purple_account_manager_get_all(manager);
- for(; iter; iter = iter->next) {
- add_substatus(edit, iter->data);
+ manager_model = purple_account_manager_get_default_as_model();
+ n_items = g_list_model_get_n_items(manager_model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleAccount *account = g_list_model_get_item(manager_model, index);
+ add_substatus(edit, account);
+ g_object_unref(account);
}
g_signal_connect(G_OBJECT(tree), "key_pressed", G_CALLBACK(popup_substatus), edit);
--- a/libpurple/buddylist.c Fri Oct 28 03:42:47 2022 -0500
+++ b/libpurple/buddylist.c Fri Oct 28 03:44:19 2022 -0500
@@ -361,10 +361,10 @@
static PurpleXmlNode *
blist_to_xmlnode(void) {
- PurpleAccountManager *manager = purple_account_manager_get_default();
+ GListModel *manager_model = NULL;
+ guint n_items = 0;
PurpleXmlNode *node, *child, *grandchild;
PurpleBlistNode *gnode;
- GList *cur;
const gchar *localized_default;
node = purple_xmlnode_new("purple");
@@ -394,11 +394,13 @@
/* Write privacy settings */
child = purple_xmlnode_new_child(node, "privacy");
- for(cur = purple_account_manager_get_all(manager); cur != NULL;
- cur = cur->next)
- {
- grandchild = accountprivacy_to_xmlnode(cur->data);
+ manager_model = purple_account_manager_get_default_as_model();
+ n_items = g_list_model_get_n_items(manager_model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleAccount *account = g_list_model_get_item(manager_model, index);
+ grandchild = accountprivacy_to_xmlnode(account);
purple_xmlnode_insert_child(child, grandchild);
+ g_object_unref(account);
}
return node;
@@ -745,18 +747,21 @@
void
purple_blist_boot(void)
{
- PurpleAccountManager *manager = NULL;
+ GListModel *manager_model = NULL;
PurpleBuddyList *gbl = g_object_new(buddy_list_type, NULL);
- GList *l;
+ guint n_items = 0;
buddies_cache = g_hash_table_new_full(g_direct_hash, g_direct_equal,
NULL, (GDestroyNotify)g_hash_table_destroy);
groups_cache = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
- manager = purple_account_manager_get_default();
- for(l = purple_account_manager_get_all(manager); l != NULL; l = l->next) {
- purple_blist_buddies_cache_add_account(PURPLE_ACCOUNT(l->data));
+ manager_model = purple_account_manager_get_default_as_model();
+ n_items = g_list_model_get_n_items(manager_model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleAccount *account = g_list_model_get_item(manager_model, index);
+ purple_blist_buddies_cache_add_account(account);
+ g_object_unref(account);
}
purplebuddylist = gbl;
--- a/libpurple/purpleaccountmanager.c Fri Oct 28 03:42:47 2022 -0500
+++ b/libpurple/purpleaccountmanager.c Fri Oct 28 03:44:19 2022 -0500
@@ -33,23 +33,60 @@
struct _PurpleAccountManager {
GObject parent;
- GList *accounts;
+ GPtrArray *accounts;
};
static PurpleAccountManager *default_manager = NULL;
-G_DEFINE_TYPE(PurpleAccountManager, purple_account_manager, G_TYPE_OBJECT)
+/******************************************************************************
+ * GListModel Implementation
+ *****************************************************************************/
+static GType
+purple_account_get_item_type(G_GNUC_UNUSED GListModel *list) {
+ return PURPLE_TYPE_ACCOUNT;
+}
+
+static guint
+purple_account_get_n_items(GListModel *list) {
+ PurpleAccountManager *manager = PURPLE_ACCOUNT_MANAGER(list);
+
+ return manager->accounts->len;
+}
+
+static gpointer
+purple_account_get_item(GListModel *list, guint position) {
+ PurpleAccountManager *manager = PURPLE_ACCOUNT_MANAGER(list);
+ PurpleAccount *account = NULL;
+
+ if(position < manager->accounts->len) {
+ account = g_ptr_array_index(manager->accounts, position);
+ g_object_ref(account);
+ }
+
+ return account;
+}
+
+static void
+purple_account_manager_list_model_init(GListModelInterface *iface) {
+ iface->get_item_type = purple_account_get_item_type;
+ iface->get_n_items = purple_account_get_n_items;
+ iface->get_item = purple_account_get_item;
+}
/******************************************************************************
* GObject Implementation
*****************************************************************************/
+G_DEFINE_TYPE_EXTENDED(PurpleAccountManager, purple_account_manager,
+ G_TYPE_OBJECT, 0,
+ G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL,
+ purple_account_manager_list_model_init))
+
static void
purple_account_manager_finalize(GObject *obj) {
PurpleAccountManager *manager = PURPLE_ACCOUNT_MANAGER(obj);
- GList *l = NULL;
- for(l = manager->accounts; l != NULL; l = l->next) {
- g_object_unref(l->data);
+ if(manager->accounts != NULL) {
+ g_ptr_array_free(manager->accounts, TRUE);
}
G_OBJECT_CLASS(purple_account_manager_parent_class)->finalize(obj);
@@ -57,6 +94,7 @@
static void
purple_account_manager_init(PurpleAccountManager *manager) {
+ manager->accounts = g_ptr_array_new_full(0, (GDestroyNotify)g_object_unref);
}
static void
@@ -131,6 +169,11 @@
return default_manager;
}
+GListModel *
+purple_account_manager_get_default_as_model(void) {
+ return G_LIST_MODEL(default_manager);
+}
+
void
purple_account_manager_add(PurpleAccountManager *manager,
PurpleAccount *account)
@@ -139,7 +182,7 @@
g_return_if_fail(PURPLE_IS_ACCOUNT(account));
/* If the manager already knows about the account, we do nothing. */
- if(g_list_find(manager->accounts, account) != NULL) {
+ if(g_ptr_array_find(manager->accounts, account, NULL)) {
return;
}
@@ -148,21 +191,27 @@
* interfaces and the most likely to have configuration issues as it's a
* new account.
*/
- manager->accounts = g_list_prepend(manager->accounts, account);
+ g_ptr_array_insert(manager->accounts, 0, account);
purple_accounts_schedule_save();
g_signal_emit(manager, signals[SIG_ADDED], 0, account);
+ g_list_model_items_changed(G_LIST_MODEL(manager), 0, 0, 1);
}
void
purple_account_manager_remove(PurpleAccountManager *manager,
PurpleAccount *account)
{
+ guint index = 0;
+
g_return_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager));
g_return_if_fail(PURPLE_IS_ACCOUNT(account));
- manager->accounts = g_list_remove(manager->accounts, account);
+ if(g_ptr_array_find(manager->accounts, account, &index)) {
+ g_ptr_array_steal_index(manager->accounts, index);
+ g_list_model_items_changed(G_LIST_MODEL(manager), index, 1, 0);
+ }
purple_accounts_schedule_save();
@@ -175,20 +224,13 @@
}
GList *
-purple_account_manager_get_all(PurpleAccountManager *manager) {
- g_return_val_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager), NULL);
-
- return manager->accounts;
-}
-
-GList *
purple_account_manager_get_enabled(PurpleAccountManager *manager) {
- GList *enabled = NULL, *l = NULL;
+ GList *enabled = NULL;
g_return_val_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager), NULL);
- for(l = manager->accounts; l != NULL; l = l->next) {
- PurpleAccount *account = PURPLE_ACCOUNT(l->data);
+ for(guint index = 0; index < manager->accounts->len; index++) {
+ PurpleAccount *account = g_ptr_array_index(manager->accounts, index);
if(purple_account_get_enabled(account)) {
enabled = g_list_append(enabled, account);
@@ -200,12 +242,12 @@
GList *
purple_account_manager_get_disabled(PurpleAccountManager *manager) {
- GList *disabled = NULL, *l = NULL;
+ GList *disabled = NULL;
g_return_val_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager), NULL);
- for(l = manager->accounts; l != NULL; l = l->next) {
- PurpleAccount *account = l->data;
+ for(guint index = 0; index < manager->accounts->len; index++) {
+ PurpleAccount *account = g_ptr_array_index(manager->accounts, index);
if(!purple_account_get_enabled(account)) {
disabled = g_list_append(disabled, account);
@@ -220,42 +262,31 @@
PurpleAccount *account,
guint new_index)
{
- GList *l = NULL;
- gboolean found = FALSE;
guint index = 0;
g_return_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager));
g_return_if_fail(PURPLE_IS_ACCOUNT(account));
- /* Iterate over the known accounts until we have found a matching account
- * or exhausted the list. For each iteration increment idx.
- */
- for(l = manager->accounts; l != NULL; l = l->next, index++) {
- if(PURPLE_ACCOUNT(l->data) == account) {
- manager->accounts = g_list_delete_link(manager->accounts, l);
-
- found = TRUE;
+ if(g_ptr_array_find(manager->accounts, account, &index)) {
+ g_ptr_array_steal_index(manager->accounts, index);
+ g_list_model_items_changed(G_LIST_MODEL(manager), index, 1, 0);
- /* If new_index is greater than the current index, we need to
- * decrement new_index by 1 to account for the move as we'll be
- * inserting into a list with one less item.
- */
- if(new_index > index) {
- new_index--;
- }
-
- break;
+ /* If new_index is greater than the current index, we need to
+ * decrement new_index by 1 to account for the move as we'll be
+ * inserting into a list with one less item.
+ */
+ if(new_index > index) {
+ new_index--;
}
- }
-
- if(!found) {
+ } else {
g_critical("Unregistered account (%s) found during reorder!",
purple_account_get_username(account));
return;
}
/* Insert the account into its new position. */
- manager->accounts = g_list_insert(manager->accounts, account, new_index);
+ g_ptr_array_insert(manager->accounts, new_index, account);
+ g_list_model_items_changed(G_LIST_MODEL(manager), new_index, 0, 1);
purple_accounts_schedule_save();
}
@@ -264,13 +295,11 @@
purple_account_manager_find_by_id(PurpleAccountManager *manager,
const gchar *id)
{
- GList *l = NULL;
-
g_return_val_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager), NULL);
g_return_val_if_fail(id != NULL, NULL);
- for(l = manager->accounts; l != NULL; l = l->next) {
- PurpleAccount *account = PURPLE_ACCOUNT(l->data);
+ for(guint index = 0; index < manager->accounts->len; index++) {
+ PurpleAccount *account = g_ptr_array_index(manager->accounts, index);
if(purple_strequal(purple_account_get_id(account), id)) {
return account;
@@ -284,14 +313,12 @@
purple_account_manager_find(PurpleAccountManager *manager,
const gchar *username, const gchar *protocol_id)
{
- GList *l;
-
g_return_val_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager), NULL);
g_return_val_if_fail(username != NULL, NULL);
g_return_val_if_fail(protocol_id != NULL, NULL);
- for(l = manager->accounts; l != NULL; l = l->next) {
- PurpleAccount *account = PURPLE_ACCOUNT(l->data);
+ for(guint index = 0; index < manager->accounts->len; index++) {
+ PurpleAccount *account = g_ptr_array_index(manager->accounts, index);
gchar *normalized = NULL;
const gchar *existing_protocol_id = NULL;
const gchar *existing_username = NULL;
@@ -323,17 +350,15 @@
purple_account_manager_find_custom(PurpleAccountManager *manager,
GEqualFunc func, gconstpointer data)
{
- GList *l;
+ guint index = 0;
g_return_val_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager), NULL);
g_return_val_if_fail(func != NULL, NULL);
- for(l = manager->accounts; l != NULL; l = l->next) {
- PurpleAccount *account = PURPLE_ACCOUNT(l->data);
+ if(g_ptr_array_find_with_equal_func(manager->accounts, data, func, &index)) {
+ PurpleAccount *account = g_ptr_array_index(manager->accounts, index);
- if(func(account, data)) {
- return account;
- }
+ return account;
}
return NULL;
@@ -344,12 +369,11 @@
PurpleAccountManagerForeachFunc callback,
gpointer data)
{
- GList *l = NULL;
-
g_return_if_fail(PURPLE_IS_ACCOUNT_MANAGER(manager));
g_return_if_fail(callback != NULL);
- for(l = manager->accounts; l != NULL; l = l->next) {
- callback(PURPLE_ACCOUNT(l->data), data);
+ for(guint index = 0; index < manager->accounts->len; index++) {
+ PurpleAccount *account = g_ptr_array_index(manager->accounts, index);
+ callback(account, data);
}
}
--- a/libpurple/purpleaccountmanager.h Fri Oct 28 03:42:47 2022 -0500
+++ b/libpurple/purpleaccountmanager.h Fri Oct 28 03:44:19 2022 -0500
@@ -66,6 +66,17 @@
PurpleAccountManager *purple_account_manager_get_default(void);
/**
+ * purple_account_manager_get_default_as_model:
+ *
+ * Gets the default account manager for libpurple as a list model.
+ *
+ * Returns: (transfer none): The default account manager for libpurple.
+ *
+ * Since: 3.0.0
+ */
+GListModel *purple_account_manager_get_default_as_model(void);
+
+/**
* purple_account_manager_add:
* @manager: The account manager instance.
* @account: (transfer full): The account to add.
@@ -100,19 +111,6 @@
void purple_account_manager_reorder(PurpleAccountManager *manager, PurpleAccount *account, guint new_index);
/**
- * purple_account_manager_get_all:
- * @manager: The account manager instance.
- *
- * Gets the list of all accounts.
- *
- * Returns: (transfer none) (element-type PurpleAccount): The list of all
- * accounts.
- *
- * Since: 3.0.0
- */
-GList *purple_account_manager_get_all(PurpleAccountManager *manager);
-
-/**
* purple_account_manager_get_enabled:
* @manager: The account manager instance.
*
--- a/libpurple/tests/test_account_manager.c Fri Oct 28 03:42:47 2022 -0500
+++ b/libpurple/tests/test_account_manager.c Fri Oct 28 03:44:19 2022 -0500
@@ -59,7 +59,6 @@
test_purple_account_manager_add_remove(void) {
PurpleAccount *account = NULL;
PurpleAccountManager *manager = NULL;
- GList *accounts = NULL;
gboolean signal_called = FALSE;
account = purple_account_new("test", "test");
@@ -72,15 +71,13 @@
G_CALLBACK(test_purple_account_manager_signal_called),
&signal_called);
- accounts = purple_account_manager_get_all(manager);
- g_assert_true(g_list_length(accounts) == 0);
+ g_assert_cmpuint(g_list_model_get_n_items(G_LIST_MODEL(manager)), ==, 0);
/* Add the account and verify that it was added and that the signal was
* emitted.
*/
purple_account_manager_add(manager, account);
- accounts = purple_account_manager_get_all(manager);
- g_assert_true(g_list_length(accounts) == 1);
+ g_assert_cmpuint(g_list_model_get_n_items(G_LIST_MODEL(manager)), ==, 1);
g_assert_true(signal_called);
signal_called = FALSE;
@@ -89,8 +86,7 @@
* was emitted.
*/
purple_account_manager_remove(manager, account);
- accounts = purple_account_manager_get_all(manager);
- g_assert_true(g_list_length(accounts) == 0);
+ g_assert_cmpuint(g_list_model_get_n_items(G_LIST_MODEL(manager)), ==, 0);
g_assert_true(signal_called);
/* Cleanup */
--- a/libpurple/util.c Fri Oct 28 03:42:47 2022 -0500
+++ b/libpurple/util.c Fri Oct 28 03:44:19 2022 -0500
@@ -933,19 +933,27 @@
void purple_util_set_current_song(const char *title, const char *artist, const char *album)
{
- PurpleAccountManager *manager = purple_account_manager_get_default();
- GList *list = purple_account_manager_get_all(manager);
- for (; list; list = list->next) {
+ GListModel *manager_model = NULL;
+ guint n_items = 0;
+
+ manager_model = purple_account_manager_get_default_as_model();
+ n_items = g_list_model_get_n_items(manager_model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleAccount *account = g_list_model_get_item(manager_model, index);
PurplePresence *presence;
PurpleStatus *tune;
- PurpleAccount *account = list->data;
- if (!purple_account_get_enabled(account))
+
+ if (!purple_account_get_enabled(account)) {
+ g_object_unref(account);
continue;
+ }
presence = purple_account_get_presence(account);
tune = purple_presence_get_status(presence, "tune");
- if (!tune)
+ if (!tune) {
+ g_object_unref(account);
continue;
+ }
if (title) {
GHashTable *attributes = g_hash_table_new(g_str_hash, g_str_equal);
@@ -962,6 +970,8 @@
} else {
purple_status_set_active(tune, FALSE);
}
+
+ g_object_unref(account);
}
}
--- a/pidgin/pidginmooddialog.c Fri Oct 28 03:42:47 2022 -0500
+++ b/pidgin/pidginmooddialog.c Fri Oct 28 03:44:19 2022 -0500
@@ -95,12 +95,15 @@
update_status_with_mood(account, mood, text);
} else {
- PurpleAccountManager *manager = purple_account_manager_get_default();
- GList *accounts = purple_account_manager_get_all(manager);
+ GListModel *manager_model = NULL;
+ guint n_items = 0;
- for (; accounts ; accounts = g_list_delete_link(accounts, accounts)) {
- PurpleAccount *account = (PurpleAccount *) accounts->data;
+ manager_model = purple_account_manager_get_default_as_model();
+ n_items = g_list_model_get_n_items(manager_model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleAccount *account = NULL;
+ account = g_list_model_get_item(manager_model, index);
connection = purple_account_get_connection(account);
if(PURPLE_IS_CONNECTION(connection)) {
PurpleConnectionFlags flags;
@@ -110,6 +113,8 @@
update_status_with_mood(account, mood, NULL);
}
}
+
+ g_object_unref(account);
}
}
}