summaryrefslogtreecommitdiff
path: root/libpurple
diff options
context:
space:
mode:
authorElliott Sales de Andrade <quantum.analyst@gmail.com>2023-03-19 03:26:38 -0500
committerElliott Sales de Andrade <quantum.analyst@gmail.com>2023-03-19 03:26:38 -0500
commit9d422e8021dfda5d9b5907bebd5b935b45651f22 (patch)
treedca1170032c80375ddfbdbaf0baebf464be05504 /libpurple
parentefb594e63ab922a3f55a7936c59fcab17762eb2a (diff)
downloadpidgin-9d422e8021dfda5d9b5907bebd5b935b45651f22.tar.gz
Use GListModel API for request fields in libpurple
Testing Done: Compiled only. Reviewed at https://reviews.imfreedom.org/r/2357/
Diffstat (limited to 'libpurple')
-rw-r--r--libpurple/purpleprivate.h1
-rw-r--r--libpurple/purplerequestgroup.c4
-rw-r--r--libpurple/purplerequestpage.c49
-rw-r--r--libpurple/request.c34
4 files changed, 45 insertions, 43 deletions
diff --git a/libpurple/purpleprivate.h b/libpurple/purpleprivate.h
index 33f89e490b..eb8d2242f4 100644
--- a/libpurple/purpleprivate.h
+++ b/libpurple/purpleprivate.h
@@ -338,7 +338,6 @@ void purple_whiteboard_manager_shutdown(void);
*/
G_GNUC_INTERNAL void purple_account_set_enabled_plain(PurpleAccount *account, gboolean enabled);
-G_GNUC_INTERNAL void _purple_request_page_add_field(PurpleRequestPage *fields, PurpleRequestField *field);
G_GNUC_INTERNAL void _purple_request_group_set_page(PurpleRequestGroup *group, PurpleRequestPage *fields);
G_GNUC_INTERNAL void _purple_request_field_set_group(PurpleRequestField *field, PurpleRequestGroup *group);
diff --git a/libpurple/purplerequestgroup.c b/libpurple/purplerequestgroup.c
index c50b592144..cce466907b 100644
--- a/libpurple/purplerequestgroup.c
+++ b/libpurple/purplerequestgroup.c
@@ -245,10 +245,6 @@ purple_request_group_add_field(PurpleRequestGroup *group,
g_signal_connect(field, "notify::valid",
G_CALLBACK(purple_request_group_notify_field_cb), group);
- if(PURPLE_IS_REQUEST_PAGE(group->page)) {
- _purple_request_page_add_field(group->page, field);
- }
-
_purple_request_field_set_group(field, group);
g_list_model_items_changed(G_LIST_MODEL(group), position, 0, 1);
diff --git a/libpurple/purplerequestpage.c b/libpurple/purplerequestpage.c
index eb08023081..f82d8c5d87 100644
--- a/libpurple/purplerequestpage.c
+++ b/libpurple/purplerequestpage.c
@@ -71,6 +71,26 @@ purple_request_page_notify_group_cb(GObject *obj,
}
}
+static void
+purple_request_page_items_changed_cb(GListModel *list, guint position,
+ guint removed, guint added, gpointer data)
+{
+ PurpleRequestPage *page = data;
+
+ /* Groups don't support removing fields, nor do pages support removing
+ * groups, so we don't attempt to support that here. */
+ g_return_if_fail(removed == 0);
+
+ for(guint offset = 0; offset < added; offset++) {
+ PurpleRequestField *field;
+ field = g_list_model_get_item(list, position + offset);
+ g_hash_table_insert(page->fields,
+ g_strdup(purple_request_field_get_id(field)),
+ field);
+ g_object_unref(field);
+ }
+}
+
/******************************************************************************
* GListModel Implementation
*****************************************************************************/
@@ -178,22 +198,11 @@ purple_request_page_new(void) {
}
void
-_purple_request_page_add_field(PurpleRequestPage *page,
- PurpleRequestField *field)
-{
- g_return_if_fail(PURPLE_IS_REQUEST_PAGE(page));
-
- g_hash_table_insert(page->fields,
- g_strdup(purple_request_field_get_id(field)), field);
-}
-
-void
purple_request_page_add_group(PurpleRequestPage *page,
PurpleRequestGroup *group)
{
guint position;
- GList *l;
- PurpleRequestField *field;
+ GListModel *model = NULL;
g_return_if_fail(PURPLE_IS_REQUEST_PAGE(page));
g_return_if_fail(PURPLE_IS_REQUEST_GROUP(group));
@@ -207,16 +216,12 @@ purple_request_page_add_group(PurpleRequestPage *page,
g_signal_connect(group, "notify::valid",
G_CALLBACK(purple_request_page_notify_group_cb), page);
- for (l = purple_request_group_get_fields(group);
- l != NULL;
- l = l->next) {
-
- field = l->data;
-
- g_hash_table_insert(page->fields,
- g_strdup(purple_request_field_get_id(field)),
- field);
- }
+ model = G_LIST_MODEL(group);
+ purple_request_page_items_changed_cb(model, 0, 0,
+ g_list_model_get_n_items(model),
+ page);
+ g_signal_connect(group, "items-changed",
+ G_CALLBACK(purple_request_page_items_changed_cb), page);
g_list_model_items_changed(G_LIST_MODEL(page), position, 0, 1);
}
diff --git a/libpurple/request.c b/libpurple/request.c
index 59ab382d8b..85013eedad 100644
--- a/libpurple/request.c
+++ b/libpurple/request.c
@@ -621,32 +621,34 @@ purple_request_wait_progress(void *ui_handle, gfloat fraction)
}
static void
-purple_request_fields_strip_html(PurpleRequestPage *page)
-{
- GList *itg;
+purple_request_fields_strip_html(PurpleRequestPage *page) {
+ guint n_groups;
- for (itg = purple_request_page_get_groups(page);
- itg != NULL;
- itg = g_list_next(itg))
- {
- PurpleRequestGroup *group = itg->data;
- GList *itf;
+ n_groups = g_list_model_get_n_items(G_LIST_MODEL(page));
+ for(guint group_index = 0; group_index < n_groups; group_index++) {
+ GListModel *group = NULL;
+ guint n_fields;
+
+ group = g_list_model_get_item(G_LIST_MODEL(page), group_index);
+ n_fields = g_list_model_get_n_items(group);
- for (itf = purple_request_group_get_fields(group);
- itf != NULL;
- itf = g_list_next(itf))
- {
- PurpleRequestField *field = itf->data;
- const char *old_label;
- gchar *new_label;
+ for(guint field_index = 0; field_index < n_fields; field_index++) {
+ PurpleRequestField *field = NULL;
+ const char *old_label = NULL;
+ char *new_label = NULL;
+ field = g_list_model_get_item(group, field_index);
old_label = purple_request_field_get_label(field);
new_label = purple_request_strip_html_custom(old_label);
if(g_strcmp0(new_label, old_label) != 0) {
purple_request_field_set_label(field, new_label);
}
+
g_free(new_label);
+ g_object_unref(field);
}
+
+ g_object_unref(group);
}
}