--- a/libpurple/meson.build Sat Mar 04 06:26:56 2023 -0600
+++ b/libpurple/meson.build Sat Mar 04 06:36:41 2023 -0600
@@ -84,6 +84,7 @@
'purpleprotocolserver.c',
'purpleprotocolwhiteboard.c',
+ 'purplerequestfield.c', 'purplesqlitehistoryadapter.c',
@@ -190,6 +191,7 @@
'purpleprotocolserver.h',
'purpleprotocolwhiteboard.h',
+ 'purplerequestfield.h', 'purplesqlitehistoryadapter.h',
--- a/libpurple/purpleprivate.h Sat Mar 04 06:26:56 2023 -0600
+++ b/libpurple/purpleprivate.h Sat Mar 04 06:36:41 2023 -0600
@@ -338,6 +338,10 @@
G_GNUC_INTERNAL void purple_account_set_enabled_plain(PurpleAccount *account, gboolean enabled);
+G_GNUC_INTERNAL void _purple_request_field_set_group(PurpleRequestField *field, PurpleRequestFieldGroup *group); +G_GNUC_INTERNAL void _purple_request_field_group_set_field_required(PurpleRequestFieldGroup *group, PurpleRequestField *field, gboolean required); +G_GNUC_INTERNAL void _purple_request_field_group_set_field_validator(PurpleRequestFieldGroup *group, PurpleRequestField *field, gboolean validator); #endif /* PURPLE_PRIVATE_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/purplerequestfield.c Sat Mar 04 06:36:41 2023 -0600
@@ -0,0 +1,1173 @@
+ * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA +#include <glib/gi18n-lib.h> +#include "purpleaccountmanager.h" +#include "purplekeyvaluepair.h" +#include "purpleprivate.h" +struct _PurpleRequestField + PurpleRequestFieldType type; + PurpleRequestFieldGroup *group; + gboolean default_value; + gpointer default_value; + GHashTable *selected_table; + gboolean multiple_selection; + PurpleAccount *default_account; + PurpleAccount *account; + PurpleFilterAccountFunc filter_func; + PurpleRequestDatasheet *sheet; + PurpleRequestFieldValidator validator; +purple_request_field_get_ui_data(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); +purple_request_field_set_ui_data(PurpleRequestField *field, + g_return_if_fail(field != NULL); + field->ui_data = ui_data; +purple_request_field_new(const char *id, const char *text, + PurpleRequestFieldType type) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(type != PURPLE_REQUEST_FIELD_NONE, NULL); + field = g_new0(PurpleRequestField, 1); + field->id = g_strdup(id); + purple_request_field_set_label(field, text); + purple_request_field_set_visible(field, TRUE); + purple_request_field_set_sensitive(field, TRUE); +purple_request_field_destroy(PurpleRequestField *field) + g_return_if_fail(field != NULL); + g_free(field->type_hint); + g_free(field->tooltip); + if(field->type == PURPLE_REQUEST_FIELD_STRING) { + g_free(field->u.string.default_value); + g_free(field->u.string.value); + } else if(field->type == PURPLE_REQUEST_FIELD_CHOICE) { + g_list_free_full(field->u.choice.elements, (GDestroyNotify)purple_key_value_pair_free); + } else if(field->type == PURPLE_REQUEST_FIELD_LIST) { + g_list_free_full(field->u.list.items, (GDestroyNotify)purple_key_value_pair_free); + g_list_free_full(field->u.list.selected, g_free); + g_hash_table_destroy(field->u.list.item_data); + g_hash_table_destroy(field->u.list.selected_table); + } else if(field->type == PURPLE_REQUEST_FIELD_DATASHEET) { + purple_request_datasheet_free(field->u.datasheet.sheet); + } else if(field->type == PURPLE_REQUEST_FIELD_IMAGE) { + g_free(field->u.image.buffer); +_purple_request_field_set_group(PurpleRequestField *field, + PurpleRequestFieldGroup *group) + g_return_if_fail(field != NULL); +purple_request_field_set_label(PurpleRequestField *field, const char *label) + g_return_if_fail(field != NULL); + field->label = g_strdup(label); +purple_request_field_set_visible(PurpleRequestField *field, gboolean visible) + g_return_if_fail(field != NULL); + field->visible = visible; +purple_request_field_set_type_hint(PurpleRequestField *field, + g_return_if_fail(field != NULL); + g_free(field->type_hint); + field->type_hint = g_strdup(type_hint); +purple_request_field_set_tooltip(PurpleRequestField *field, const char *tooltip) + g_return_if_fail(field != NULL); + g_free(field->tooltip); + field->tooltip = g_strdup(tooltip); +purple_request_field_set_required(PurpleRequestField *field, gboolean required) + g_return_if_fail(field != NULL); + if (field->required == required) + field->required = required; + if(field->group != NULL) { + _purple_request_field_group_set_field_required(field->group, field, +purple_request_field_get_field_type(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, PURPLE_REQUEST_FIELD_NONE); +PurpleRequestFieldGroup * +purple_request_field_get_group(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); +purple_request_field_get_id(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); +purple_request_field_get_label(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); +purple_request_field_is_visible(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); +purple_request_field_get_field_type_hint(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + return field->type_hint; +purple_request_field_get_tooltip(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); +purple_request_field_is_required(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + return field->required; +purple_request_field_is_filled(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + switch (purple_request_field_get_field_type(field)) + case PURPLE_REQUEST_FIELD_STRING: + return (purple_request_field_string_get_value(field) != NULL && + *(purple_request_field_string_get_value(field)) != '\0'); +purple_request_field_set_validator(PurpleRequestField *field, + PurpleRequestFieldValidator validator, void *user_data) + g_return_if_fail(field != NULL); + field->validator = validator; + field->validator_data = validator ? user_data : NULL; + if(field->group != NULL) { + _purple_request_field_group_set_field_validator(field->group, field, +purple_request_field_is_validatable(PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + return field->validator != NULL; +purple_request_field_is_valid(PurpleRequestField *field, gchar **errmsg) + g_return_val_if_fail(field != NULL, FALSE); + if (!purple_request_field_is_required(field) && + !purple_request_field_is_filled(field)) + valid = field->validator(field, errmsg, field->validator_data); +purple_request_field_set_sensitive(PurpleRequestField *field, + g_return_if_fail(field != NULL); + field->sensitive = sensitive; +purple_request_field_is_sensitive(PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + return field->sensitive; +purple_request_field_string_new(const char *id, const char *text, + const char *default_value, gboolean multiline) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_STRING); + field->u.string.multiline = multiline; + purple_request_field_string_set_default_value(field, default_value); + purple_request_field_string_set_value(field, default_value); +purple_request_field_string_set_default_value(PurpleRequestField *field, + const char *default_value) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING); + g_free(field->u.string.default_value); + field->u.string.default_value = g_strdup(default_value); +purple_request_field_string_set_value(PurpleRequestField *field, const char *value) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING); + g_free(field->u.string.value); + field->u.string.value = g_strdup(value); +purple_request_field_string_set_masked(PurpleRequestField *field, gboolean masked) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING); + field->u.string.masked = masked; +purple_request_field_string_get_default_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, NULL); + return field->u.string.default_value; +purple_request_field_string_get_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, NULL); + return field->u.string.value; +purple_request_field_string_is_multiline(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, FALSE); + return field->u.string.multiline; +purple_request_field_string_is_masked(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, FALSE); + return field->u.string.masked; +purple_request_field_int_new(const char *id, const char *text, + int default_value, int lower_bound, int upper_bound) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_INTEGER); + purple_request_field_int_set_lower_bound(field, lower_bound); + purple_request_field_int_set_upper_bound(field, upper_bound); + purple_request_field_int_set_default_value(field, default_value); + purple_request_field_int_set_value(field, default_value); +purple_request_field_int_set_default_value(PurpleRequestField *field, + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER); + field->u.integer.default_value = default_value; +purple_request_field_int_set_lower_bound(PurpleRequestField *field, + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER); + field->u.integer.lower_bound = lower_bound; +purple_request_field_int_set_upper_bound(PurpleRequestField *field, + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER); + field->u.integer.upper_bound = upper_bound; +purple_request_field_int_set_value(PurpleRequestField *field, int value) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER); + if (value < field->u.integer.lower_bound || + value > field->u.integer.upper_bound) { + purple_debug_error("request", "Int value out of bounds\n"); + field->u.integer.value = value; +purple_request_field_int_get_default_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0); + return field->u.integer.default_value; +purple_request_field_int_get_lower_bound(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0); + return field->u.integer.lower_bound; +purple_request_field_int_get_upper_bound(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0); + return field->u.integer.upper_bound; +purple_request_field_int_get_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0); + return field->u.integer.value; +purple_request_field_bool_new(const char *id, const char *text, + gboolean default_value) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_BOOLEAN); + purple_request_field_bool_set_default_value(field, default_value); + purple_request_field_bool_set_value(field, default_value); +purple_request_field_bool_set_default_value(PurpleRequestField *field, + gboolean default_value) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_BOOLEAN); + field->u.boolean.default_value = default_value; +purple_request_field_bool_set_value(PurpleRequestField *field, gboolean value) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_BOOLEAN); + field->u.boolean.value = value; +purple_request_field_bool_get_default_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_BOOLEAN, FALSE); + return field->u.boolean.default_value; +purple_request_field_bool_get_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_BOOLEAN, FALSE); + return field->u.boolean.value; +purple_request_field_choice_new(const char *id, const char *text, + gpointer default_value) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_CHOICE); + purple_request_field_choice_set_default_value(field, default_value); + purple_request_field_choice_set_value(field, default_value); +purple_request_field_choice_add(PurpleRequestField *field, const char *label, + purple_request_field_choice_add_full(field, label, value, NULL); +purple_request_field_choice_add_full(PurpleRequestField *field, const char *label, + gpointer value, GDestroyNotify destroy) + PurpleKeyValuePair *choice; + g_return_if_fail(field != NULL); + g_return_if_fail(label != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE); + choice = purple_key_value_pair_new_full(label, value, destroy); + field->u.choice.elements = g_list_append(field->u.choice.elements, +purple_request_field_choice_set_default_value(PurpleRequestField *field, + gpointer default_value) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE); + field->u.choice.default_value = default_value; +purple_request_field_choice_set_value(PurpleRequestField *field, gpointer value) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE); + field->u.choice.value = value; +purple_request_field_choice_get_default_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE, NULL); + return field->u.choice.default_value; +purple_request_field_choice_get_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE, NULL); + return field->u.choice.value; +purple_request_field_choice_get_elements(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE, NULL); + return field->u.choice.elements; +purple_request_field_list_new(const char *id, const char *text) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_LIST); + field->u.list.item_data = g_hash_table_new_full(g_str_hash, g_str_equal, + field->u.list.selected_table = + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); +purple_request_field_list_set_multi_select(PurpleRequestField *field, + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST); + field->u.list.multiple_selection = multi_select; +purple_request_field_list_get_multi_select(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, FALSE); + return field->u.list.multiple_selection; +purple_request_field_list_get_data(const PurpleRequestField *field, + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, NULL); + return g_hash_table_lookup(field->u.list.item_data, text); +purple_request_field_list_add_icon(PurpleRequestField *field, const char *item, const char* icon_path, + PurpleKeyValuePair *kvp; + g_return_if_fail(field != NULL); + g_return_if_fail(item != NULL); + g_return_if_fail(data != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST); + field->u.list.has_icons = field->u.list.has_icons || (icon_path != NULL); + kvp = purple_key_value_pair_new_full(item, g_strdup(icon_path), g_free); + field->u.list.items = g_list_append(field->u.list.items, kvp); + g_hash_table_insert(field->u.list.item_data, g_strdup(item), data); +purple_request_field_list_add_selected(PurpleRequestField *field, const char *item) + g_return_if_fail(field != NULL); + g_return_if_fail(item != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST); + if (!purple_request_field_list_get_multi_select(field) && + field->u.list.selected != NULL) + purple_debug_warning("request", + "More than one item added to non-multi-select " + purple_request_field_get_id(field)); + field->u.list.selected = g_list_append(field->u.list.selected, + g_hash_table_add(field->u.list.selected_table, g_strdup(item)); +purple_request_field_list_clear_selected(PurpleRequestField *field) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST); + if (field->u.list.selected != NULL) + g_list_free_full(field->u.list.selected, g_free); + field->u.list.selected = NULL; + g_hash_table_remove_all(field->u.list.selected_table); +purple_request_field_list_set_selected(PurpleRequestField *field, GList *items) + g_return_if_fail(field != NULL); + g_return_if_fail(items != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST); + purple_request_field_list_clear_selected(field); + if (!purple_request_field_list_get_multi_select(field) && items->next) { + purple_debug_warning("request", + "More than one item added to non-multi-select " + purple_request_field_get_id(field)); + for (l = items; l != NULL; l = l->next) { + char *selected = l->data; + field->u.list.selected = g_list_append(field->u.list.selected, + g_hash_table_add(field->u.list.selected_table, g_strdup(selected)); +purple_request_field_list_is_selected(const PurpleRequestField *field, + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(item != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, FALSE); + return g_hash_table_contains(field->u.list.selected_table, item); +purple_request_field_list_get_selected(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, NULL); + return field->u.list.selected; +purple_request_field_list_get_items(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, NULL); + return field->u.list.items; +purple_request_field_list_has_icons(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, FALSE); + return field->u.list.has_icons; +purple_request_field_label_new(const char *id, const char *text) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_LABEL); +purple_request_field_image_new(const char *id, const char *text, const char *buf, gsize size) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + g_return_val_if_fail(buf != NULL, NULL); + g_return_val_if_fail(size > 0, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_IMAGE); + field->u.image.buffer = g_memdup2(buf, size); + field->u.image.size = size; + field->u.image.scale_x = 1; + field->u.image.scale_y = 1; +purple_request_field_image_set_scale(PurpleRequestField *field, unsigned int x, unsigned int y) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE); + field->u.image.scale_x = x; + field->u.image.scale_y = y; +purple_request_field_image_get_buffer(PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE, NULL); + return field->u.image.buffer; +purple_request_field_image_get_size(PurpleRequestField *field) + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE, 0); + return field->u.image.size; +purple_request_field_image_get_scale_x(PurpleRequestField *field) + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE, 0); + return field->u.image.scale_x; +purple_request_field_image_get_scale_y(PurpleRequestField *field) + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE, 0); + return field->u.image.scale_y; +purple_request_field_account_new(const char *id, const char *text, + PurpleAccount *account) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_ACCOUNT); + PurpleAccountManager *manager = purple_account_manager_get_default(); + GList *accounts = purple_account_manager_get_connected(manager); + account = accounts->data; + purple_request_field_account_set_default_value(field, account); + purple_request_field_account_set_value(field, account); +purple_request_field_account_set_default_value(PurpleRequestField *field, + PurpleAccount *default_value) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT); + field->u.account.default_account = default_value; +purple_request_field_account_set_value(PurpleRequestField *field, + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT); + field->u.account.account = value; +purple_request_field_account_set_show_all(PurpleRequestField *field, + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT); + if (field->u.account.show_all == show_all) + field->u.account.show_all = show_all; + PurpleAccountManager *manager = purple_account_manager_get_default(); + GList *accounts = purple_account_manager_get_connected(manager); + if (purple_account_is_connected(field->u.account.default_account)) + purple_request_field_account_set_default_value(field, + if (purple_account_is_connected(field->u.account.account)) + purple_request_field_account_set_value(field, +purple_request_field_account_set_filter(PurpleRequestField *field, + PurpleFilterAccountFunc filter_func) + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT); + field->u.account.filter_func = filter_func; +purple_request_field_account_get_default_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT, NULL); + return field->u.account.default_account; +purple_request_field_account_get_value(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT, NULL); + return field->u.account.account; +purple_request_field_account_get_show_all(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT, FALSE); + return field->u.account.show_all; +purple_request_field_account_get_filter(const PurpleRequestField *field) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT, FALSE); + return field->u.account.filter_func; +purple_request_field_datasheet_new(const char *id, + const gchar *text, PurpleRequestDatasheet *sheet) + PurpleRequestField *field; + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(sheet != NULL, NULL); + field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_DATASHEET); + field->u.datasheet.sheet = sheet; +PurpleRequestDatasheet * +purple_request_field_datasheet_get_sheet(PurpleRequestField *field) + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_DATASHEET, NULL); + return field->u.datasheet.sheet; +purple_request_field_email_validator(PurpleRequestField *field, gchar **errmsg, + G_GNUC_UNUSED gpointer user_data) + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, FALSE); + value = purple_request_field_string_get_value(field); + if (value != NULL && purple_email_is_valid(value)) + *errmsg = g_strdup(_("Invalid email address")); +purple_request_field_alphanumeric_validator(PurpleRequestField *field, + gchar **errmsg, void *allowed_characters) + gchar invalid_char = '\0'; + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, FALSE); + value = purple_request_field_string_get_value(field); + g_return_val_if_fail(value != NULL, FALSE); + if (allowed_characters) + gchar *value_r = g_strdup(value); + g_strcanon(value_r, allowed_characters, '\0'); + invalid_char = value[strlen(value_r)]; + if (!g_ascii_isalnum(*value)) + *errmsg = g_strdup_printf(_("Invalid character '%c'"), --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/purplerequestfield.h Sat Mar 04 06:36:41 2023 -0600
@@ -0,0 +1,1083 @@
+ * Purple - Internet Messaging Library + * Copyright (C) Pidgin Developers <devel@pidgin.im> + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <https://www.gnu.org/licenses/>. +#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION) +# error "only <purple.h> may be included directly" +#ifndef PURPLE_REQUEST_FIELD_H +#define PURPLE_REQUEST_FIELD_H +#include <glib-object.h> +typedef struct _PurpleRequestField PurpleRequestField; +#include "request-datasheet.h" +#define PURPLE_DEFAULT_ACTION_NONE -1 + * PurpleRequestFieldType: + * @PURPLE_REQUEST_FIELD_NONE: No field. + * @PURPLE_REQUEST_FIELD_STRING: String field. + * @PURPLE_REQUEST_FIELD_INTEGER: Integer field. + * @PURPLE_REQUEST_FIELD_BOOLEAN: Boolean field. + * @PURPLE_REQUEST_FIELD_CHOICE: Choice field (dropdown?). + * @PURPLE_REQUEST_FIELD_LIST: List field. + * @PURPLE_REQUEST_FIELD_LABEL: Label field. + * @PURPLE_REQUEST_FIELD_IMAGE: Image field. + * @PURPLE_REQUEST_FIELD_ACCOUNT: #PurpleAccount field. + * @PURPLE_REQUEST_FIELD_DATASHEET: Datasheet field. + PURPLE_REQUEST_FIELD_NONE, + PURPLE_REQUEST_FIELD_STRING, + PURPLE_REQUEST_FIELD_INTEGER, + PURPLE_REQUEST_FIELD_BOOLEAN, + PURPLE_REQUEST_FIELD_CHOICE, + PURPLE_REQUEST_FIELD_LIST, + PURPLE_REQUEST_FIELD_LABEL, + PURPLE_REQUEST_FIELD_IMAGE, + PURPLE_REQUEST_FIELD_ACCOUNT, + PURPLE_REQUEST_FIELD_DATASHEET +} PurpleRequestFieldType; +typedef gboolean (*PurpleRequestFieldValidator)(PurpleRequestField *field, + gchar **errmsg, gpointer user_data); +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_new: + * @text: The text label of the field. + * @type: The type of field. + * Creates a field of the specified type. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_new(const char *id, const char *text, + PurpleRequestFieldType type); + * purple_request_field_destroy: + * @field: The field to destroy. +void purple_request_field_destroy(PurpleRequestField *field); + * purple_request_field_set_label: + * @label: The text label. + * Sets the label text of a field. +void purple_request_field_set_label(PurpleRequestField *field, const char *label); + * purple_request_field_set_visible: + * @visible: TRUE if visible, or FALSE if not. + * Sets whether or not a field is visible. +void purple_request_field_set_visible(PurpleRequestField *field, gboolean visible); + * purple_request_field_set_type_hint: + * @type_hint: The type hint. + * Sets the type hint for the field. + * This is optionally used by the UIs to provide such features as + * auto-completion for type hints like "account" and "screenname". +void purple_request_field_set_type_hint(PurpleRequestField *field, + const char *type_hint); + * purple_request_field_set_tooltip: + * @tooltip: The tooltip text. + * Sets the tooltip for the field. + * This is optionally used by the UIs to provide a tooltip for +void purple_request_field_set_tooltip(PurpleRequestField *field, + * purple_request_field_set_required: + * @required: TRUE if required, or FALSE. + * Sets whether or not a field is required. +void purple_request_field_set_required(PurpleRequestField *field, + * purple_request_field_get_field_type: + * Returns the type of a field. + * Returns: The field's type. +PurpleRequestFieldType purple_request_field_get_field_type(const PurpleRequestField *field); + * purple_request_field_get_group: + * Returns the group for the field. + * Returns: (transfer none): The UI data. +PurpleRequestFieldGroup *purple_request_field_get_group(const PurpleRequestField *field); + * purple_request_field_get_id: + * Returns the ID of a field. +const char *purple_request_field_get_id(const PurpleRequestField *field); + * purple_request_field_get_label: + * Returns the label text of a field. + * Returns: The label text. +const char *purple_request_field_get_label(const PurpleRequestField *field); + * purple_request_field_is_visible: + * Returns whether or not a field is visible. + * Returns: TRUE if the field is visible. FALSE otherwise. +gboolean purple_request_field_is_visible(const PurpleRequestField *field); + * purple_request_field_get_field_type_hint: + * Returns the field's type hint. + * Returns: The field's type hint. +const char *purple_request_field_get_field_type_hint(const PurpleRequestField *field); + * purple_request_field_get_tooltip: + * Returns the field's tooltip. + * Returns: The field's tooltip. +const char *purple_request_field_get_tooltip(const PurpleRequestField *field); + * purple_request_field_is_required: + * Returns whether or not a field is required. + * Returns: TRUE if the field is required, or FALSE. +gboolean purple_request_field_is_required(const PurpleRequestField *field); + * purple_request_field_is_filled: + * Checks, if specified field has value. + * Returns: TRUE if the field has value, or FALSE. +gboolean purple_request_field_is_filled(const PurpleRequestField *field); + * purple_request_field_set_validator: + * @validator: (scope notified): The validator callback, NULL to disable validation. + * @user_data: The data to pass to the callback. + * Sets validator for a single field. +void purple_request_field_set_validator(PurpleRequestField *field, + PurpleRequestFieldValidator validator, void *user_data); + * purple_request_field_is_validatable: + * Returns whether or not field has validator set. + * Returns: TRUE if the field has validator, or FALSE. +gboolean purple_request_field_is_validatable(PurpleRequestField *field); + * purple_request_field_is_valid: + * @errmsg: If non-NULL, the memory area, where the pointer to validation + * failure message will be set. + * Checks, if specified field is valid. + * If detailed message about failure reason is needed, there is an option to + * return (via errmsg argument) pointer to newly allocated error message. + * It must be freed with g_free after use. + * Note: empty, not required fields are valid. + * Returns: TRUE, if the field is valid, FALSE otherwise. +gboolean purple_request_field_is_valid(PurpleRequestField *field, gchar **errmsg); + * purple_request_field_set_sensitive: + * @sensitive: TRUE if the field should be sensitive for user input. +void purple_request_field_set_sensitive(PurpleRequestField *field, + * purple_request_field_is_sensitive: + * Checks, if field is editable. + * Returns: TRUE, if the field is sensitive for user input. +gboolean purple_request_field_is_sensitive(PurpleRequestField *field); + * purple_request_field_get_ui_data: + * Returns the ui_data for a field. + * Returns: The UI data. +gpointer purple_request_field_get_ui_data(const PurpleRequestField *field); + * purple_request_field_set_ui_data: + * @ui_data: The UI data. + * Sets the ui_data for a field. +void purple_request_field_set_ui_data(PurpleRequestField *field, +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_string_new: + * @text: The text label of the field. + * @default_value: The optional default value. + * @multiline: Whether or not this should be a multiline string. + * Creates a string request field. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_string_new(const char *id, + const char *default_value, + * purple_request_field_string_set_default_value: + * @default_value: The default value. + * Sets the default value in a string field. +void purple_request_field_string_set_default_value(PurpleRequestField *field, + const char *default_value); + * purple_request_field_string_set_value: + * Sets the value in a string field. +void purple_request_field_string_set_value(PurpleRequestField *field, + * purple_request_field_string_set_masked: + * @masked: The masked value. + * Sets whether or not a string field is masked + * (commonly used for password fields). +void purple_request_field_string_set_masked(PurpleRequestField *field, + * purple_request_field_string_get_default_value: + * Returns the default value in a string field. + * Returns: The default value. +const char *purple_request_field_string_get_default_value( + const PurpleRequestField *field); + * purple_request_field_string_get_value: + * Returns the user-entered value in a string field. +const char *purple_request_field_string_get_value(const PurpleRequestField *field); + * purple_request_field_string_is_multiline: + * Returns whether or not a string field is multi-line. + * Returns: %TRUE if the field is mulit-line, or %FALSE otherwise. +gboolean purple_request_field_string_is_multiline(const PurpleRequestField *field); + * purple_request_field_string_is_masked: + * Returns whether or not a string field is masked. + * Returns: %TRUE if the field is masked, or %FALSE otherwise. +gboolean purple_request_field_string_is_masked(const PurpleRequestField *field); +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_int_new: + * @text: The text label of the field. + * @default_value: The default value. + * @lower_bound: The lower bound. + * @upper_bound: The upper bound. + * Creates an integer field. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_int_new(const char *id, + const char *text, int default_value, int lower_bound, int upper_bound); + * purple_request_field_int_set_default_value: + * @default_value: The default value. + * Sets the default value in an integer field. +void purple_request_field_int_set_default_value(PurpleRequestField *field, + * purple_request_field_int_set_lower_bound: + * @lower_bound: The lower bound. + * Sets the lower bound in an integer field. +void purple_request_field_int_set_lower_bound(PurpleRequestField *field, int lower_bound); + * purple_request_field_int_set_upper_bound: + * @upper_bound: The upper bound. + * Sets the upper bound in an integer field. +void purple_request_field_int_set_upper_bound(PurpleRequestField *field, int upper_bound); + * purple_request_field_int_set_value: + * Sets the value in an integer field. +void purple_request_field_int_set_value(PurpleRequestField *field, int value); + * purple_request_field_int_get_default_value: + * Returns the default value in an integer field. + * Returns: The default value. +int purple_request_field_int_get_default_value(const PurpleRequestField *field); + * purple_request_field_int_get_lower_bound: + * Returns the lower bound in an integer field. + * Returns: The lower bound. +int purple_request_field_int_get_lower_bound(const PurpleRequestField *field); + * purple_request_field_int_get_upper_bound: + * Returns the upper bound in an integer field. + * Returns: The upper bound. +int purple_request_field_int_get_upper_bound(const PurpleRequestField *field); + * purple_request_field_int_get_value: + * Returns the user-entered value in an integer field. +int purple_request_field_int_get_value(const PurpleRequestField *field); +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_bool_new: + * @text: The text label of the field. + * @default_value: The default value. + * Creates a boolean field. + * This is often represented as a checkbox. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_bool_new(const char *id, + gboolean default_value); + * purple_request_field_bool_set_default_value: + * @default_value: The default value. + * Sets the default value in an boolean field. +void purple_request_field_bool_set_default_value(PurpleRequestField *field, + gboolean default_value); + * purple_request_field_bool_set_value: + * Sets the value in an boolean field. +void purple_request_field_bool_set_value(PurpleRequestField *field, + * purple_request_field_bool_get_default_value: + * Returns the default value in an boolean field. + * Returns: The default value. +gboolean purple_request_field_bool_get_default_value( + const PurpleRequestField *field); + * purple_request_field_bool_get_value: + * Returns the user-entered value in an boolean field. +gboolean purple_request_field_bool_get_value(const PurpleRequestField *field); +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_choice_new: + * @text: The optional label of the field. + * @default_value: The default choice. + * Creates a multiple choice field. + * This is often represented as a group of radio buttons. + * Returns: (transfer full): The new field. +purple_request_field_choice_new(const char *id, const char *text, + gpointer default_value); + * purple_request_field_choice_add: + * @field: The choice field. + * @label: The choice label. + * @data: The choice value. + * Adds a choice to a multiple choice field. +purple_request_field_choice_add(PurpleRequestField *field, const char *label, + * purple_request_field_choice_add_full: + * @field: The choice field. + * @label: The choice label. + * @data: The choice value. + * @destroy: The value destroy function. + * Adds a choice to a multiple choice field with destructor for value. +purple_request_field_choice_add_full(PurpleRequestField *field, const char *label, + gpointer data, GDestroyNotify destroy); + * purple_request_field_choice_set_default_value: + * @default_value: The default value. + * Sets the default value in an choice field. +purple_request_field_choice_set_default_value(PurpleRequestField *field, + gpointer default_value); + * purple_request_field_choice_set_value: + * Sets the value in an choice field. +purple_request_field_choice_set_value(PurpleRequestField *field, + * purple_request_field_choice_get_default_value: + * Returns the default value in an choice field. + * Returns: The default value. +purple_request_field_choice_get_default_value(const PurpleRequestField *field); + * purple_request_field_choice_get_value: + * Returns the user-entered value in an choice field. +purple_request_field_choice_get_value(const PurpleRequestField *field); + * purple_request_field_choice_get_elements: + * Returns a list of elements in a choice field. + * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of pairs of {label, value}. +purple_request_field_choice_get_elements(const PurpleRequestField *field); +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_list_new: + * @text: The optional label of the field. + * Creates a multiple list item field. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_list_new(const char *id, const char *text); + * purple_request_field_list_set_multi_select: + * @field: The list field. + * @multi_select: TRUE if multiple selection is enabled, + * Sets whether or not a list field allows multiple selection. +void purple_request_field_list_set_multi_select(PurpleRequestField *field, + gboolean multi_select); + * purple_request_field_list_get_multi_select: + * @field: The list field. + * Returns whether or not a list field allows multiple selection. + * Returns: TRUE if multiple selection is enabled, or FALSE otherwise. +gboolean purple_request_field_list_get_multi_select( + const PurpleRequestField *field); + * purple_request_field_list_get_data: + * @field: The list field. + * @text: The item text. + * Returns the data for a particular item. + * Returns: The data associated with the item. +void *purple_request_field_list_get_data(const PurpleRequestField *field, + * purple_request_field_list_add_icon: + * @field: The list field. + * @item: The list item. + * @icon_path: The path to icon file, or %NULL for no icon. + * @data: The associated data. + * Adds an item to a list field. +void purple_request_field_list_add_icon(PurpleRequestField *field, + const char *item, const char* icon_path, void* data); + * purple_request_field_list_add_selected: + * @item: The item to add. + * Adds a selected item to the list field. +void purple_request_field_list_add_selected(PurpleRequestField *field, + * purple_request_field_list_clear_selected: + * Clears the list of selected items in a list field. +void purple_request_field_list_clear_selected(PurpleRequestField *field); + * purple_request_field_list_set_selected: + * @items: (element-type utf8) (transfer none): The list of selected items. + * Sets a list of selected items in a list field. +void purple_request_field_list_set_selected(PurpleRequestField *field, + * purple_request_field_list_is_selected: + * Returns whether or not a particular item is selected in a list field. + * Returns: TRUE if the item is selected. FALSE otherwise. +gboolean purple_request_field_list_is_selected(const PurpleRequestField *field, + * purple_request_field_list_get_selected: + * Returns a list of selected items in a list field. + * To retrieve the data for each item, use + * purple_request_field_list_get_data(). + * Returns: (element-type utf8) (transfer none): The list of selected items. +GList *purple_request_field_list_get_selected( + const PurpleRequestField *field); + * purple_request_field_list_get_items: + * Returns a list of items in a list field. + * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of items. +GList *purple_request_field_list_get_items(const PurpleRequestField *field); + * purple_request_field_list_has_icons: + * Indicates if list field has icons. + * Returns: TRUE if list field has icons, FALSE otherwise. +gboolean purple_request_field_list_has_icons(const PurpleRequestField *field); +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_label_new: + * @text: The label of the field. + * Creates a label field. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_label_new(const char *id, +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_image_new: + * @text: The label of the field. + * @buf: The image data. + * @size: The size of the data in @buf. + * Creates an image field. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_image_new(const char *id, const char *text, + const char *buf, gsize size); + * purple_request_field_image_set_scale: + * @field: The image field. + * @x: The x scale factor. + * @y: The y scale factor. + * Sets the scale factors of an image field. +void purple_request_field_image_set_scale(PurpleRequestField *field, unsigned int x, unsigned int y); + * purple_request_field_image_get_buffer: + * @field: The image field. + * Returns pointer to the image. + * Returns: Pointer to the image. +const char *purple_request_field_image_get_buffer(PurpleRequestField *field); + * purple_request_field_image_get_size: + * @field: The image field. + * Returns size (in bytes) of the image. + * Returns: Size of the image. +gsize purple_request_field_image_get_size(PurpleRequestField *field); + * purple_request_field_image_get_scale_x: + * @field: The image field. + * Returns X scale coefficient of the image. + * Returns: X scale coefficient of the image. +unsigned int purple_request_field_image_get_scale_x(PurpleRequestField *field); + * purple_request_field_image_get_scale_y: + * @field: The image field. + * Returns Y scale coefficient of the image. + * Returns: Y scale coefficient of the image. +unsigned int purple_request_field_image_get_scale_y(PurpleRequestField *field); +/**************************************************************************/ +/**************************************************************************/ + * purple_request_field_account_new: + * @text: The text label of the field. + * @account: The optional default account. + * Creates an account field. + * By default, this field will not show offline accounts. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_account_new(const char *id, + PurpleAccount *account); + * purple_request_field_account_set_default_value: + * @field: The account field. + * @default_value: The default account. + * Sets the default account on an account field. +void purple_request_field_account_set_default_value(PurpleRequestField *field, + PurpleAccount *default_value); + * purple_request_field_account_set_value: + * @field: The account field. + * Sets the account in an account field. +void purple_request_field_account_set_value(PurpleRequestField *field, + * purple_request_field_account_set_show_all: + * @field: The account field. + * @show_all: Whether or not to show all accounts. + * Sets whether or not to show all accounts in an account field. + * If TRUE, all accounts, online or offline, will be shown. If FALSE, + * only online accounts will be shown. +void purple_request_field_account_set_show_all(PurpleRequestField *field, + * purple_request_field_account_set_filter: + * @field: The account field. + * @filter_func: (scope notified): The account filter function. + * Sets the account filter function in an account field. + * This function will determine which accounts get displayed and which +void purple_request_field_account_set_filter(PurpleRequestField *field, + PurpleFilterAccountFunc filter_func); + * purple_request_field_account_get_default_value: + * Returns the default account in an account field. + * Returns: (transfer none): The default account. +PurpleAccount *purple_request_field_account_get_default_value( + const PurpleRequestField *field); + * purple_request_field_account_get_value: + * Returns the user-entered account in an account field. + * Returns: (transfer none): The user-entered account. +PurpleAccount *purple_request_field_account_get_value( + const PurpleRequestField *field); + * purple_request_field_account_get_show_all: + * @field: The account field. + * Returns whether or not to show all accounts in an account field. + * If TRUE, all accounts, online or offline, will be shown. If FALSE, + * only online accounts will be shown. + * Returns: Whether or not to show all accounts. +gboolean purple_request_field_account_get_show_all( + const PurpleRequestField *field); + * purple_request_field_account_get_filter: + * @field: The account field. + * Returns the account filter function in an account field. + * This function will determine which accounts get displayed and which + * Returns: (transfer none): The account filter function. +PurpleFilterAccountFunc purple_request_field_account_get_filter( + const PurpleRequestField *field); +/**************************************************************************/ +/* Datasheet Field API */ +/**************************************************************************/ + * purple_request_field_datasheet_new: + * @text: The label of the field, may be %NULL. + * @sheet: The datasheet. + * Creates a datasheet item field. + * Returns: (transfer full): The new field. +PurpleRequestField *purple_request_field_datasheet_new(const char *id, + const gchar *text, PurpleRequestDatasheet *sheet); + * purple_request_field_datasheet_get_sheet: + * Returns a datasheet for a field. + * Returns: (transfer none): The datasheet object. +PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet( + PurpleRequestField *field); +/**************************************************************************/ +/* Validators for request fields. */ +/**************************************************************************/ + * purple_request_field_email_validator: + * @errmsg: (out) (optional): destination for error message. + * Validates a field which should contain an email address. + * See purple_request_field_set_validator(). + * Returns: TRUE, if field contains valid email address. +gboolean purple_request_field_email_validator(PurpleRequestField *field, + gchar **errmsg, void *user_data); + * purple_request_field_alphanumeric_validator: + * @errmsg: (allow-none): destination for error message. + * @allowed_characters: (allow-none): allowed character list + * (NULL-terminated string). + * Validates a field which should contain alphanumeric content. + * See purple_request_field_set_validator(). + * Returns: TRUE, if field contains only alphanumeric characters. +gboolean purple_request_field_alphanumeric_validator(PurpleRequestField *field, + gchar **errmsg, void *allowed_characters); +#endif /* PURPLE_REQUEST_FIELD_H */ --- a/libpurple/request.c Sat Mar 04 06:26:56 2023 -0600
+++ b/libpurple/request.c Sat Mar 04 06:36:41 2023 -0600
@@ -26,8 +26,8 @@
#include "purplemarkup.h"
-#include "purpleaccountmanager.h"
#include "purplekeyvaluepair.h"
+#include "purpleprivate.h" static PurpleRequestUiOps *request_ui_ops = NULL;
static GList *handles = NULL;
@@ -46,96 +46,6 @@
-struct _PurpleRequestField
- PurpleRequestFieldType type;
- PurpleRequestFieldGroup *group;
- gboolean default_value;
- gpointer default_value;
- GHashTable *selected_table;
- gboolean multiple_selection;
- PurpleAccount *default_account;
- PurpleAccount *account;
- PurpleFilterAccountFunc filter_func;
- PurpleRequestDatasheet *sheet;
- PurpleRequestFieldValidator validator;
struct _PurpleRequestFields
@@ -567,23 +477,6 @@
return purple_request_field_is_required(field);
-purple_request_field_get_ui_data(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
-purple_request_field_set_ui_data(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- field->ui_data = ui_data;
purple_request_fields_all_required_filled(const PurpleRequestFields *fields)
@@ -748,6 +641,35 @@
+_purple_request_field_group_set_field_required(PurpleRequestFieldGroup *group, + PurpleRequestField *field, + group->fields_list->required_fields = + g_list_append(group->fields_list->required_fields, + group->fields_list->required_fields = + g_list_remove(group->fields_list->required_fields, +_purple_request_field_group_set_field_validator(PurpleRequestFieldGroup *group, + PurpleRequestField *field, + PurpleRequestFields *flist = group->fields_list; + flist->validated_fields = g_list_remove(flist->validated_fields, field); + flist->validated_fields = g_list_append(flist->validated_fields, purple_request_field_group_add_field(PurpleRequestFieldGroup *group,
PurpleRequestField *field)
@@ -774,8 +696,7 @@
+ _purple_request_field_set_group(field, group); @@ -802,1052 +723,6 @@
return group->fields_list;
-purple_request_field_new(const char *id, const char *text,
- PurpleRequestFieldType type)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(type != PURPLE_REQUEST_FIELD_NONE, NULL);
- field = g_new0(PurpleRequestField, 1);
- field->id = g_strdup(id);
- purple_request_field_set_label(field, text);
- purple_request_field_set_visible(field, TRUE);
- purple_request_field_set_sensitive(field, TRUE);
-purple_request_field_destroy(PurpleRequestField *field)
- g_return_if_fail(field != NULL);
- g_free(field->type_hint);
- g_free(field->tooltip);
- if(field->type == PURPLE_REQUEST_FIELD_STRING) {
- g_free(field->u.string.default_value);
- g_free(field->u.string.value);
- } else if(field->type == PURPLE_REQUEST_FIELD_CHOICE) {
- g_list_free_full(field->u.choice.elements, (GDestroyNotify)purple_key_value_pair_free);
- } else if(field->type == PURPLE_REQUEST_FIELD_LIST) {
- g_list_free_full(field->u.list.items, (GDestroyNotify)purple_key_value_pair_free);
- g_list_free_full(field->u.list.selected, g_free);
- g_hash_table_destroy(field->u.list.item_data);
- g_hash_table_destroy(field->u.list.selected_table);
- } else if(field->type == PURPLE_REQUEST_FIELD_DATASHEET) {
- purple_request_datasheet_free(field->u.datasheet.sheet);
- } else if(field->type == PURPLE_REQUEST_FIELD_IMAGE) {
- g_free(field->u.image.buffer);
-purple_request_field_set_label(PurpleRequestField *field, const char *label)
- g_return_if_fail(field != NULL);
- field->label = g_strdup(label);
-purple_request_field_set_visible(PurpleRequestField *field, gboolean visible)
- g_return_if_fail(field != NULL);
- field->visible = visible;
-purple_request_field_set_type_hint(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- g_free(field->type_hint);
- field->type_hint = g_strdup(type_hint);
-purple_request_field_set_tooltip(PurpleRequestField *field, const char *tooltip)
- g_return_if_fail(field != NULL);
- g_free(field->tooltip);
- field->tooltip = g_strdup(tooltip);
-purple_request_field_set_required(PurpleRequestField *field, gboolean required)
- g_return_if_fail(field != NULL);
- if (field->required == required)
- field->required = required;
- if (field->group != NULL)
- field->group->fields_list->required_fields =
- g_list_append(field->group->fields_list->required_fields,
- field->group->fields_list->required_fields =
- g_list_remove(field->group->fields_list->required_fields,
-purple_request_field_get_field_type(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, PURPLE_REQUEST_FIELD_NONE);
-PurpleRequestFieldGroup *
-purple_request_field_get_group(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
-purple_request_field_get_id(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
-purple_request_field_get_label(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
-purple_request_field_is_visible(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
-purple_request_field_get_field_type_hint(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- return field->type_hint;
-purple_request_field_get_tooltip(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
-purple_request_field_is_required(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- return field->required;
-purple_request_field_is_filled(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- switch (purple_request_field_get_field_type(field))
- case PURPLE_REQUEST_FIELD_STRING:
- return (purple_request_field_string_get_value(field) != NULL &&
- *(purple_request_field_string_get_value(field)) != '\0');
-purple_request_field_set_validator(PurpleRequestField *field,
- PurpleRequestFieldValidator validator, void *user_data)
- g_return_if_fail(field != NULL);
- field->validator = validator;
- field->validator_data = validator ? user_data : NULL;
- if (field->group != NULL)
- PurpleRequestFields *flist = field->group->fields_list;
- flist->validated_fields = g_list_remove(flist->validated_fields,
- flist->validated_fields = g_list_append(
- flist->validated_fields, field);
-purple_request_field_is_validatable(PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- return field->validator != NULL;
-purple_request_field_is_valid(PurpleRequestField *field, gchar **errmsg)
- g_return_val_if_fail(field != NULL, FALSE);
- if (!purple_request_field_is_required(field) &&
- !purple_request_field_is_filled(field))
- valid = field->validator(field, errmsg, field->validator_data);
-purple_request_field_set_sensitive(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- field->sensitive = sensitive;
-purple_request_field_is_sensitive(PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- return field->sensitive;
-purple_request_field_string_new(const char *id, const char *text,
- const char *default_value, gboolean multiline)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_STRING);
- field->u.string.multiline = multiline;
- purple_request_field_string_set_default_value(field, default_value);
- purple_request_field_string_set_value(field, default_value);
-purple_request_field_string_set_default_value(PurpleRequestField *field,
- const char *default_value)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING);
- g_free(field->u.string.default_value);
- field->u.string.default_value = g_strdup(default_value);
-purple_request_field_string_set_value(PurpleRequestField *field, const char *value)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING);
- g_free(field->u.string.value);
- field->u.string.value = g_strdup(value);
-purple_request_field_string_set_masked(PurpleRequestField *field, gboolean masked)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING);
- field->u.string.masked = masked;
-purple_request_field_string_get_default_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, NULL);
- return field->u.string.default_value;
-purple_request_field_string_get_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, NULL);
- return field->u.string.value;
-purple_request_field_string_is_multiline(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, FALSE);
- return field->u.string.multiline;
-purple_request_field_string_is_masked(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, FALSE);
- return field->u.string.masked;
-purple_request_field_int_new(const char *id, const char *text,
- int default_value, int lower_bound, int upper_bound)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_INTEGER);
- purple_request_field_int_set_lower_bound(field, lower_bound);
- purple_request_field_int_set_upper_bound(field, upper_bound);
- purple_request_field_int_set_default_value(field, default_value);
- purple_request_field_int_set_value(field, default_value);
-purple_request_field_int_set_default_value(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
- field->u.integer.default_value = default_value;
-purple_request_field_int_set_lower_bound(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
- field->u.integer.lower_bound = lower_bound;
-purple_request_field_int_set_upper_bound(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
- field->u.integer.upper_bound = upper_bound;
-purple_request_field_int_set_value(PurpleRequestField *field, int value)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
- if (value < field->u.integer.lower_bound ||
- value > field->u.integer.upper_bound) {
- purple_debug_error("request", "Int value out of bounds\n");
- field->u.integer.value = value;
-purple_request_field_int_get_default_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, 0);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0);
- return field->u.integer.default_value;
-purple_request_field_int_get_lower_bound(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, 0);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0);
- return field->u.integer.lower_bound;
-purple_request_field_int_get_upper_bound(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, 0);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0);
- return field->u.integer.upper_bound;
-purple_request_field_int_get_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, 0);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER, 0);
- return field->u.integer.value;
-purple_request_field_bool_new(const char *id, const char *text,
- gboolean default_value)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_BOOLEAN);
- purple_request_field_bool_set_default_value(field, default_value);
- purple_request_field_bool_set_value(field, default_value);
-purple_request_field_bool_set_default_value(PurpleRequestField *field,
- gboolean default_value)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_BOOLEAN);
- field->u.boolean.default_value = default_value;
-purple_request_field_bool_set_value(PurpleRequestField *field, gboolean value)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_BOOLEAN);
- field->u.boolean.value = value;
-purple_request_field_bool_get_default_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_BOOLEAN, FALSE);
- return field->u.boolean.default_value;
-purple_request_field_bool_get_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_BOOLEAN, FALSE);
- return field->u.boolean.value;
-purple_request_field_choice_new(const char *id, const char *text,
- gpointer default_value)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_CHOICE);
- purple_request_field_choice_set_default_value(field, default_value);
- purple_request_field_choice_set_value(field, default_value);
-purple_request_field_choice_add(PurpleRequestField *field, const char *label,
- purple_request_field_choice_add_full(field, label, value, NULL);
-purple_request_field_choice_add_full(PurpleRequestField *field, const char *label,
- gpointer value, GDestroyNotify destroy)
- PurpleKeyValuePair *choice;
- g_return_if_fail(field != NULL);
- g_return_if_fail(label != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE);
- choice = purple_key_value_pair_new_full(label, value, destroy);
- field->u.choice.elements = g_list_append(field->u.choice.elements,
-purple_request_field_choice_set_default_value(PurpleRequestField *field,
- gpointer default_value)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE);
- field->u.choice.default_value = default_value;
-purple_request_field_choice_set_value(PurpleRequestField *field, gpointer value)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE);
- field->u.choice.value = value;
-purple_request_field_choice_get_default_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE, NULL);
- return field->u.choice.default_value;
-purple_request_field_choice_get_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE, NULL);
- return field->u.choice.value;
-purple_request_field_choice_get_elements(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_CHOICE, NULL);
- return field->u.choice.elements;
-purple_request_field_list_new(const char *id, const char *text)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_LIST);
- field->u.list.item_data = g_hash_table_new_full(g_str_hash, g_str_equal,
- field->u.list.selected_table =
- g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-purple_request_field_list_set_multi_select(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);
- field->u.list.multiple_selection = multi_select;
-purple_request_field_list_get_multi_select(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, FALSE);
- return field->u.list.multiple_selection;
-purple_request_field_list_get_data(const PurpleRequestField *field,
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, NULL);
- return g_hash_table_lookup(field->u.list.item_data, text);
-purple_request_field_list_add_icon(PurpleRequestField *field, const char *item, const char* icon_path,
- PurpleKeyValuePair *kvp;
- g_return_if_fail(field != NULL);
- g_return_if_fail(item != NULL);
- g_return_if_fail(data != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);
- field->u.list.has_icons = field->u.list.has_icons || (icon_path != NULL);
- kvp = purple_key_value_pair_new_full(item, g_strdup(icon_path), g_free);
- field->u.list.items = g_list_append(field->u.list.items, kvp);
- g_hash_table_insert(field->u.list.item_data, g_strdup(item), data);
-purple_request_field_list_add_selected(PurpleRequestField *field, const char *item)
- g_return_if_fail(field != NULL);
- g_return_if_fail(item != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);
- if (!purple_request_field_list_get_multi_select(field) &&
- field->u.list.selected != NULL)
- purple_debug_warning("request",
- "More than one item added to non-multi-select "
- purple_request_field_get_id(field));
- field->u.list.selected = g_list_append(field->u.list.selected,
- g_hash_table_add(field->u.list.selected_table, g_strdup(item));
-purple_request_field_list_clear_selected(PurpleRequestField *field)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);
- if (field->u.list.selected != NULL)
- g_list_free_full(field->u.list.selected, g_free);
- field->u.list.selected = NULL;
- g_hash_table_remove_all(field->u.list.selected_table);
-purple_request_field_list_set_selected(PurpleRequestField *field, GList *items)
- g_return_if_fail(field != NULL);
- g_return_if_fail(items != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);
- purple_request_field_list_clear_selected(field);
- if (!purple_request_field_list_get_multi_select(field) && items->next) {
- purple_debug_warning("request",
- "More than one item added to non-multi-select "
- purple_request_field_get_id(field));
- for (l = items; l != NULL; l = l->next) {
- char *selected = l->data;
- field->u.list.selected = g_list_append(field->u.list.selected,
- g_hash_table_add(field->u.list.selected_table, g_strdup(selected));
-purple_request_field_list_is_selected(const PurpleRequestField *field,
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(item != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, FALSE);
- return g_hash_table_contains(field->u.list.selected_table, item);
-purple_request_field_list_get_selected(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, NULL);
- return field->u.list.selected;
-purple_request_field_list_get_items(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, NULL);
- return field->u.list.items;
-purple_request_field_list_has_icons(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST, FALSE);
- return field->u.list.has_icons;
-purple_request_field_label_new(const char *id, const char *text)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_LABEL);
-purple_request_field_image_new(const char *id, const char *text, const char *buf, gsize size)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- g_return_val_if_fail(buf != NULL, NULL);
- g_return_val_if_fail(size > 0, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_IMAGE);
- field->u.image.buffer = g_memdup2(buf, size);
- field->u.image.size = size;
- field->u.image.scale_x = 1;
- field->u.image.scale_y = 1;
-purple_request_field_image_set_scale(PurpleRequestField *field, unsigned int x, unsigned int y)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE);
- field->u.image.scale_x = x;
- field->u.image.scale_y = y;
-purple_request_field_image_get_buffer(PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE, NULL);
- return field->u.image.buffer;
-purple_request_field_image_get_size(PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, 0);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE, 0);
- return field->u.image.size;
-purple_request_field_image_get_scale_x(PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, 0);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE, 0);
- return field->u.image.scale_x;
-purple_request_field_image_get_scale_y(PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, 0);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_IMAGE, 0);
- return field->u.image.scale_y;
-purple_request_field_account_new(const char *id, const char *text,
- PurpleAccount *account)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_ACCOUNT);
- PurpleAccountManager *manager = purple_account_manager_get_default();
- GList *accounts = purple_account_manager_get_connected(manager);
- account = accounts->data;
- purple_request_field_account_set_default_value(field, account);
- purple_request_field_account_set_value(field, account);
-purple_request_field_account_set_default_value(PurpleRequestField *field,
- PurpleAccount *default_value)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT);
- field->u.account.default_account = default_value;
-purple_request_field_account_set_value(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT);
- field->u.account.account = value;
-purple_request_field_account_set_show_all(PurpleRequestField *field,
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT);
- if (field->u.account.show_all == show_all)
- field->u.account.show_all = show_all;
- PurpleAccountManager *manager = purple_account_manager_get_default();
- GList *accounts = purple_account_manager_get_connected(manager);
- if (purple_account_is_connected(field->u.account.default_account))
- purple_request_field_account_set_default_value(field,
- if (purple_account_is_connected(field->u.account.account))
- purple_request_field_account_set_value(field,
-purple_request_field_account_set_filter(PurpleRequestField *field,
- PurpleFilterAccountFunc filter_func)
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT);
- field->u.account.filter_func = filter_func;
-purple_request_field_account_get_default_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT, NULL);
- return field->u.account.default_account;
-purple_request_field_account_get_value(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT, NULL);
- return field->u.account.account;
-purple_request_field_account_get_show_all(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT, FALSE);
- return field->u.account.show_all;
-purple_request_field_account_get_filter(const PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT, FALSE);
- return field->u.account.filter_func;
-purple_request_field_datasheet_new(const char *id,
- const gchar *text, PurpleRequestDatasheet *sheet)
- PurpleRequestField *field;
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(sheet != NULL, NULL);
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_DATASHEET);
- field->u.datasheet.sheet = sheet;
-PurpleRequestDatasheet *
-purple_request_field_datasheet_get_sheet(PurpleRequestField *field)
- g_return_val_if_fail(field != NULL, NULL);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_DATASHEET, NULL);
- return field->u.datasheet.sheet;
-purple_request_field_email_validator(PurpleRequestField *field, gchar **errmsg,
- G_GNUC_UNUSED gpointer user_data)
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, FALSE);
- value = purple_request_field_string_get_value(field);
- if (value != NULL && purple_email_is_valid(value))
- *errmsg = g_strdup(_("Invalid email address"));
-purple_request_field_alphanumeric_validator(PurpleRequestField *field,
- gchar **errmsg, void *allowed_characters)
- gchar invalid_char = '\0';
- g_return_val_if_fail(field != NULL, FALSE);
- g_return_val_if_fail(field->type == PURPLE_REQUEST_FIELD_STRING, FALSE);
- value = purple_request_field_string_get_value(field);
- g_return_val_if_fail(value != NULL, FALSE);
- if (allowed_characters)
- gchar *value_r = g_strdup(value);
- g_strcanon(value_r, allowed_characters, '\0');
- invalid_char = value[strlen(value_r)];
- if (!g_ascii_isalnum(*value))
- *errmsg = g_strdup_printf(_("Invalid character '%c'"),
@@ -2133,16 +1008,15 @@
for (itf = group->fields; itf != NULL; itf = g_list_next(itf)) {
PurpleRequestField *field = itf->data;
- new_label = purple_request_strip_html_custom(
- if (g_strcmp0(new_label, field->label) == 0) {
+ 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);
- field->label = new_label;
--- a/libpurple/request.h Sat Mar 04 06:26:56 2023 -0600
+++ b/libpurple/request.h Sat Mar 04 06:36:41 2023 -0600
@@ -35,13 +35,6 @@
#define PURPLE_TYPE_REQUEST_UI_OPS (purple_request_ui_ops_get_type())
-typedef struct _PurpleRequestField PurpleRequestField;
* Multiple fields request data.
@@ -66,6 +59,7 @@
#include "purpleconversation.h"
+#include "purplerequestfield.h" #include "request-datasheet.h"
#define PURPLE_DEFAULT_ACTION_NONE -1
@@ -95,36 +89,6 @@
- * PurpleRequestFieldType:
- * @PURPLE_REQUEST_FIELD_NONE: No field.
- * @PURPLE_REQUEST_FIELD_STRING: String field.
- * @PURPLE_REQUEST_FIELD_INTEGER: Integer field.
- * @PURPLE_REQUEST_FIELD_BOOLEAN: Boolean field.
- * @PURPLE_REQUEST_FIELD_CHOICE: Choice field (dropdown?).
- * @PURPLE_REQUEST_FIELD_LIST: List field.
- * @PURPLE_REQUEST_FIELD_LABEL: Label field.
- * @PURPLE_REQUEST_FIELD_IMAGE: Image field.
- * @PURPLE_REQUEST_FIELD_ACCOUNT: #PurpleAccount field.
- * @PURPLE_REQUEST_FIELD_DATASHEET: Datasheet field.
- PURPLE_REQUEST_FIELD_NONE,
- PURPLE_REQUEST_FIELD_STRING,
- PURPLE_REQUEST_FIELD_INTEGER,
- PURPLE_REQUEST_FIELD_BOOLEAN,
- PURPLE_REQUEST_FIELD_CHOICE,
- PURPLE_REQUEST_FIELD_LIST,
- PURPLE_REQUEST_FIELD_LABEL,
- PURPLE_REQUEST_FIELD_IMAGE,
- PURPLE_REQUEST_FIELD_ACCOUNT,
- PURPLE_REQUEST_FIELD_DATASHEET
-} PurpleRequestFieldType;
* @PURPLE_REQUEST_FEATURE_HTML: Specifies that HTML should be supported.
@@ -237,9 +201,6 @@
typedef void (*PurpleRequestInputCb)(void *data, const char *value);
-typedef gboolean (*PurpleRequestFieldValidator)(PurpleRequestField *field,
- gchar **errmsg, gpointer user_data);
@@ -820,1005 +781,6 @@
const PurpleRequestFieldGroup *group);
/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_new:
- * @text: The text label of the field.
- * @type: The type of field.
- * Creates a field of the specified type.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_new(const char *id, const char *text,
- PurpleRequestFieldType type);
- * purple_request_field_destroy:
- * @field: The field to destroy.
-void purple_request_field_destroy(PurpleRequestField *field);
- * purple_request_field_set_label:
- * @label: The text label.
- * Sets the label text of a field.
-void purple_request_field_set_label(PurpleRequestField *field, const char *label);
- * purple_request_field_set_visible:
- * @visible: TRUE if visible, or FALSE if not.
- * Sets whether or not a field is visible.
-void purple_request_field_set_visible(PurpleRequestField *field, gboolean visible);
- * purple_request_field_set_type_hint:
- * @type_hint: The type hint.
- * Sets the type hint for the field.
- * This is optionally used by the UIs to provide such features as
- * auto-completion for type hints like "account" and "screenname".
-void purple_request_field_set_type_hint(PurpleRequestField *field,
- const char *type_hint);
- * purple_request_field_set_tooltip:
- * @tooltip: The tooltip text.
- * Sets the tooltip for the field.
- * This is optionally used by the UIs to provide a tooltip for
-void purple_request_field_set_tooltip(PurpleRequestField *field,
- * purple_request_field_set_required:
- * @required: TRUE if required, or FALSE.
- * Sets whether or not a field is required.
-void purple_request_field_set_required(PurpleRequestField *field,
- * purple_request_field_get_field_type:
- * Returns the type of a field.
- * Returns: The field's type.
-PurpleRequestFieldType purple_request_field_get_field_type(const PurpleRequestField *field);
- * purple_request_field_get_group:
- * Returns the group for the field.
- * Returns: (transfer none): The UI data.
-PurpleRequestFieldGroup *purple_request_field_get_group(const PurpleRequestField *field);
- * purple_request_field_get_id:
- * Returns the ID of a field.
-const char *purple_request_field_get_id(const PurpleRequestField *field);
- * purple_request_field_get_label:
- * Returns the label text of a field.
- * Returns: The label text.
-const char *purple_request_field_get_label(const PurpleRequestField *field);
- * purple_request_field_is_visible:
- * Returns whether or not a field is visible.
- * Returns: TRUE if the field is visible. FALSE otherwise.
-gboolean purple_request_field_is_visible(const PurpleRequestField *field);
- * purple_request_field_get_field_type_hint:
- * Returns the field's type hint.
- * Returns: The field's type hint.
-const char *purple_request_field_get_field_type_hint(const PurpleRequestField *field);
- * purple_request_field_get_tooltip:
- * Returns the field's tooltip.
- * Returns: The field's tooltip.
-const char *purple_request_field_get_tooltip(const PurpleRequestField *field);
- * purple_request_field_is_required:
- * Returns whether or not a field is required.
- * Returns: TRUE if the field is required, or FALSE.
-gboolean purple_request_field_is_required(const PurpleRequestField *field);
- * purple_request_field_is_filled:
- * Checks, if specified field has value.
- * Returns: TRUE if the field has value, or FALSE.
-gboolean purple_request_field_is_filled(const PurpleRequestField *field);
- * purple_request_field_set_validator:
- * @validator: (scope notified): The validator callback, NULL to disable validation.
- * @user_data: The data to pass to the callback.
- * Sets validator for a single field.
-void purple_request_field_set_validator(PurpleRequestField *field,
- PurpleRequestFieldValidator validator, void *user_data);
- * purple_request_field_is_validatable:
- * Returns whether or not field has validator set.
- * Returns: TRUE if the field has validator, or FALSE.
-gboolean purple_request_field_is_validatable(PurpleRequestField *field);
- * purple_request_field_is_valid:
- * @errmsg: If non-NULL, the memory area, where the pointer to validation
- * failure message will be set.
- * Checks, if specified field is valid.
- * If detailed message about failure reason is needed, there is an option to
- * return (via errmsg argument) pointer to newly allocated error message.
- * It must be freed with g_free after use.
- * Note: empty, not required fields are valid.
- * Returns: TRUE, if the field is valid, FALSE otherwise.
-gboolean purple_request_field_is_valid(PurpleRequestField *field, gchar **errmsg);
- * purple_request_field_set_sensitive:
- * @sensitive: TRUE if the field should be sensitive for user input.
-void purple_request_field_set_sensitive(PurpleRequestField *field,
- * purple_request_field_is_sensitive:
- * Checks, if field is editable.
- * Returns: TRUE, if the field is sensitive for user input.
-gboolean purple_request_field_is_sensitive(PurpleRequestField *field);
- * purple_request_field_get_ui_data:
- * Returns the ui_data for a field.
- * Returns: The UI data.
-gpointer purple_request_field_get_ui_data(const PurpleRequestField *field);
- * purple_request_field_set_ui_data:
- * @ui_data: The UI data.
- * Sets the ui_data for a field.
-void purple_request_field_set_ui_data(PurpleRequestField *field,
-/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_string_new:
- * @text: The text label of the field.
- * @default_value: The optional default value.
- * @multiline: Whether or not this should be a multiline string.
- * Creates a string request field.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_string_new(const char *id,
- const char *default_value,
- * purple_request_field_string_set_default_value:
- * @default_value: The default value.
- * Sets the default value in a string field.
-void purple_request_field_string_set_default_value(PurpleRequestField *field,
- const char *default_value);
- * purple_request_field_string_set_value:
- * Sets the value in a string field.
-void purple_request_field_string_set_value(PurpleRequestField *field,
- * purple_request_field_string_set_masked:
- * @masked: The masked value.
- * Sets whether or not a string field is masked
- * (commonly used for password fields).
-void purple_request_field_string_set_masked(PurpleRequestField *field,
- * purple_request_field_string_get_default_value:
- * Returns the default value in a string field.
- * Returns: The default value.
-const char *purple_request_field_string_get_default_value(
- const PurpleRequestField *field);
- * purple_request_field_string_get_value:
- * Returns the user-entered value in a string field.
-const char *purple_request_field_string_get_value(const PurpleRequestField *field);
- * purple_request_field_string_is_multiline:
- * Returns whether or not a string field is multi-line.
- * Returns: %TRUE if the field is mulit-line, or %FALSE otherwise.
-gboolean purple_request_field_string_is_multiline(const PurpleRequestField *field);
- * purple_request_field_string_is_masked:
- * Returns whether or not a string field is masked.
- * Returns: %TRUE if the field is masked, or %FALSE otherwise.
-gboolean purple_request_field_string_is_masked(const PurpleRequestField *field);
-/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_int_new:
- * @text: The text label of the field.
- * @default_value: The default value.
- * @lower_bound: The lower bound.
- * @upper_bound: The upper bound.
- * Creates an integer field.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_int_new(const char *id,
- const char *text, int default_value, int lower_bound, int upper_bound);
- * purple_request_field_int_set_default_value:
- * @default_value: The default value.
- * Sets the default value in an integer field.
-void purple_request_field_int_set_default_value(PurpleRequestField *field,
- * purple_request_field_int_set_lower_bound:
- * @lower_bound: The lower bound.
- * Sets the lower bound in an integer field.
-void purple_request_field_int_set_lower_bound(PurpleRequestField *field, int lower_bound);
- * purple_request_field_int_set_upper_bound:
- * @upper_bound: The upper bound.
- * Sets the upper bound in an integer field.
-void purple_request_field_int_set_upper_bound(PurpleRequestField *field, int upper_bound);
- * purple_request_field_int_set_value:
- * Sets the value in an integer field.
-void purple_request_field_int_set_value(PurpleRequestField *field, int value);
- * purple_request_field_int_get_default_value:
- * Returns the default value in an integer field.
- * Returns: The default value.
-int purple_request_field_int_get_default_value(const PurpleRequestField *field);
- * purple_request_field_int_get_lower_bound:
- * Returns the lower bound in an integer field.
- * Returns: The lower bound.
-int purple_request_field_int_get_lower_bound(const PurpleRequestField *field);
- * purple_request_field_int_get_upper_bound:
- * Returns the upper bound in an integer field.
- * Returns: The upper bound.
-int purple_request_field_int_get_upper_bound(const PurpleRequestField *field);
- * purple_request_field_int_get_value:
- * Returns the user-entered value in an integer field.
-int purple_request_field_int_get_value(const PurpleRequestField *field);
-/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_bool_new:
- * @text: The text label of the field.
- * @default_value: The default value.
- * Creates a boolean field.
- * This is often represented as a checkbox.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_bool_new(const char *id,
- gboolean default_value);
- * purple_request_field_bool_set_default_value:
- * @default_value: The default value.
- * Sets the default value in an boolean field.
-void purple_request_field_bool_set_default_value(PurpleRequestField *field,
- gboolean default_value);
- * purple_request_field_bool_set_value:
- * Sets the value in an boolean field.
-void purple_request_field_bool_set_value(PurpleRequestField *field,
- * purple_request_field_bool_get_default_value:
- * Returns the default value in an boolean field.
- * Returns: The default value.
-gboolean purple_request_field_bool_get_default_value(
- const PurpleRequestField *field);
- * purple_request_field_bool_get_value:
- * Returns the user-entered value in an boolean field.
-gboolean purple_request_field_bool_get_value(const PurpleRequestField *field);
-/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_choice_new:
- * @text: The optional label of the field.
- * @default_value: The default choice.
- * Creates a multiple choice field.
- * This is often represented as a group of radio buttons.
- * Returns: (transfer full): The new field.
-purple_request_field_choice_new(const char *id, const char *text,
- gpointer default_value);
- * purple_request_field_choice_add:
- * @field: The choice field.
- * @label: The choice label.
- * @data: The choice value.
- * Adds a choice to a multiple choice field.
-purple_request_field_choice_add(PurpleRequestField *field, const char *label,
- * purple_request_field_choice_add_full:
- * @field: The choice field.
- * @label: The choice label.
- * @data: The choice value.
- * @destroy: The value destroy function.
- * Adds a choice to a multiple choice field with destructor for value.
-purple_request_field_choice_add_full(PurpleRequestField *field, const char *label,
- gpointer data, GDestroyNotify destroy);
- * purple_request_field_choice_set_default_value:
- * @default_value: The default value.
- * Sets the default value in an choice field.
-purple_request_field_choice_set_default_value(PurpleRequestField *field,
- gpointer default_value);
- * purple_request_field_choice_set_value:
- * Sets the value in an choice field.
-purple_request_field_choice_set_value(PurpleRequestField *field,
- * purple_request_field_choice_get_default_value:
- * Returns the default value in an choice field.
- * Returns: The default value.
-purple_request_field_choice_get_default_value(const PurpleRequestField *field);
- * purple_request_field_choice_get_value:
- * Returns the user-entered value in an choice field.
-purple_request_field_choice_get_value(const PurpleRequestField *field);
- * purple_request_field_choice_get_elements:
- * Returns a list of elements in a choice field.
- * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of pairs of {label, value}.
-purple_request_field_choice_get_elements(const PurpleRequestField *field);
-/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_list_new:
- * @text: The optional label of the field.
- * Creates a multiple list item field.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_list_new(const char *id, const char *text);
- * purple_request_field_list_set_multi_select:
- * @field: The list field.
- * @multi_select: TRUE if multiple selection is enabled,
- * Sets whether or not a list field allows multiple selection.
-void purple_request_field_list_set_multi_select(PurpleRequestField *field,
- gboolean multi_select);
- * purple_request_field_list_get_multi_select:
- * @field: The list field.
- * Returns whether or not a list field allows multiple selection.
- * Returns: TRUE if multiple selection is enabled, or FALSE otherwise.
-gboolean purple_request_field_list_get_multi_select(
- const PurpleRequestField *field);
- * purple_request_field_list_get_data:
- * @field: The list field.
- * @text: The item text.
- * Returns the data for a particular item.
- * Returns: The data associated with the item.
-void *purple_request_field_list_get_data(const PurpleRequestField *field,
- * purple_request_field_list_add_icon:
- * @field: The list field.
- * @item: The list item.
- * @icon_path: The path to icon file, or %NULL for no icon.
- * @data: The associated data.
- * Adds an item to a list field.
-void purple_request_field_list_add_icon(PurpleRequestField *field,
- const char *item, const char* icon_path, void* data);
- * purple_request_field_list_add_selected:
- * @item: The item to add.
- * Adds a selected item to the list field.
-void purple_request_field_list_add_selected(PurpleRequestField *field,
- * purple_request_field_list_clear_selected:
- * Clears the list of selected items in a list field.
-void purple_request_field_list_clear_selected(PurpleRequestField *field);
- * purple_request_field_list_set_selected:
- * @items: (element-type utf8) (transfer none): The list of selected items.
- * Sets a list of selected items in a list field.
-void purple_request_field_list_set_selected(PurpleRequestField *field,
- * purple_request_field_list_is_selected:
- * Returns whether or not a particular item is selected in a list field.
- * Returns: TRUE if the item is selected. FALSE otherwise.
-gboolean purple_request_field_list_is_selected(const PurpleRequestField *field,
- * purple_request_field_list_get_selected:
- * Returns a list of selected items in a list field.
- * To retrieve the data for each item, use
- * purple_request_field_list_get_data().
- * Returns: (element-type utf8) (transfer none): The list of selected items.
-GList *purple_request_field_list_get_selected(
- const PurpleRequestField *field);
- * purple_request_field_list_get_items:
- * Returns a list of items in a list field.
- * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of items.
-GList *purple_request_field_list_get_items(const PurpleRequestField *field);
- * purple_request_field_list_has_icons:
- * Indicates if list field has icons.
- * Returns: TRUE if list field has icons, FALSE otherwise.
-gboolean purple_request_field_list_has_icons(const PurpleRequestField *field);
-/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_label_new:
- * @text: The label of the field.
- * Creates a label field.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_label_new(const char *id,
-/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_image_new:
- * @text: The label of the field.
- * @buf: The image data.
- * @size: The size of the data in @buf.
- * Creates an image field.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_image_new(const char *id, const char *text,
- const char *buf, gsize size);
- * purple_request_field_image_set_scale:
- * @field: The image field.
- * @x: The x scale factor.
- * @y: The y scale factor.
- * Sets the scale factors of an image field.
-void purple_request_field_image_set_scale(PurpleRequestField *field, unsigned int x, unsigned int y);
- * purple_request_field_image_get_buffer:
- * @field: The image field.
- * Returns pointer to the image.
- * Returns: Pointer to the image.
-const char *purple_request_field_image_get_buffer(PurpleRequestField *field);
- * purple_request_field_image_get_size:
- * @field: The image field.
- * Returns size (in bytes) of the image.
- * Returns: Size of the image.
-gsize purple_request_field_image_get_size(PurpleRequestField *field);
- * purple_request_field_image_get_scale_x:
- * @field: The image field.
- * Returns X scale coefficient of the image.
- * Returns: X scale coefficient of the image.
-unsigned int purple_request_field_image_get_scale_x(PurpleRequestField *field);
- * purple_request_field_image_get_scale_y:
- * @field: The image field.
- * Returns Y scale coefficient of the image.
- * Returns: Y scale coefficient of the image.
-unsigned int purple_request_field_image_get_scale_y(PurpleRequestField *field);
-/**************************************************************************/
-/**************************************************************************/
- * purple_request_field_account_new:
- * @text: The text label of the field.
- * @account: The optional default account.
- * Creates an account field.
- * By default, this field will not show offline accounts.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_account_new(const char *id,
- PurpleAccount *account);
- * purple_request_field_account_set_default_value:
- * @field: The account field.
- * @default_value: The default account.
- * Sets the default account on an account field.
-void purple_request_field_account_set_default_value(PurpleRequestField *field,
- PurpleAccount *default_value);
- * purple_request_field_account_set_value:
- * @field: The account field.
- * Sets the account in an account field.
-void purple_request_field_account_set_value(PurpleRequestField *field,
- * purple_request_field_account_set_show_all:
- * @field: The account field.
- * @show_all: Whether or not to show all accounts.
- * Sets whether or not to show all accounts in an account field.
- * If TRUE, all accounts, online or offline, will be shown. If FALSE,
- * only online accounts will be shown.
-void purple_request_field_account_set_show_all(PurpleRequestField *field,
- * purple_request_field_account_set_filter:
- * @field: The account field.
- * @filter_func: (scope notified): The account filter function.
- * Sets the account filter function in an account field.
- * This function will determine which accounts get displayed and which
-void purple_request_field_account_set_filter(PurpleRequestField *field,
- PurpleFilterAccountFunc filter_func);
- * purple_request_field_account_get_default_value:
- * Returns the default account in an account field.
- * Returns: (transfer none): The default account.
-PurpleAccount *purple_request_field_account_get_default_value(
- const PurpleRequestField *field);
- * purple_request_field_account_get_value:
- * Returns the user-entered account in an account field.
- * Returns: (transfer none): The user-entered account.
-PurpleAccount *purple_request_field_account_get_value(
- const PurpleRequestField *field);
- * purple_request_field_account_get_show_all:
- * @field: The account field.
- * Returns whether or not to show all accounts in an account field.
- * If TRUE, all accounts, online or offline, will be shown. If FALSE,
- * only online accounts will be shown.
- * Returns: Whether or not to show all accounts.
-gboolean purple_request_field_account_get_show_all(
- const PurpleRequestField *field);
- * purple_request_field_account_get_filter:
- * @field: The account field.
- * Returns the account filter function in an account field.
- * This function will determine which accounts get displayed and which
- * Returns: (transfer none): The account filter function.
-PurpleFilterAccountFunc purple_request_field_account_get_filter(
- const PurpleRequestField *field);
-/**************************************************************************/
-/* Datasheet Field API */
-/**************************************************************************/
- * purple_request_field_datasheet_new:
- * @text: The label of the field, may be %NULL.
- * @sheet: The datasheet.
- * Creates a datasheet item field.
- * Returns: (transfer full): The new field.
-PurpleRequestField *purple_request_field_datasheet_new(const char *id,
- const gchar *text, PurpleRequestDatasheet *sheet);
- * purple_request_field_datasheet_get_sheet:
- * Returns a datasheet for a field.
- * Returns: (transfer none): The datasheet object.
-PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet(
- PurpleRequestField *field);
-/**************************************************************************/
-/* Validators for request fields. */
-/**************************************************************************/
- * purple_request_field_email_validator:
- * @errmsg: (out) (optional): destination for error message.
- * Validates a field which should contain an email address.
- * See purple_request_field_set_validator().
- * Returns: TRUE, if field contains valid email address.
-gboolean purple_request_field_email_validator(PurpleRequestField *field,
- gchar **errmsg, void *user_data);
- * purple_request_field_alphanumeric_validator:
- * @errmsg: (allow-none): destination for error message.
- * @allowed_characters: (allow-none): allowed character list
- * (NULL-terminated string).
- * Validates a field which should contain alphanumeric content.
- * See purple_request_field_set_validator().
- * Returns: TRUE, if field contains only alphanumeric characters.
-gboolean purple_request_field_alphanumeric_validator(PurpleRequestField *field,
- gchar **errmsg, void *allowed_characters);
-/**************************************************************************/
/**************************************************************************/
--- a/po/POTFILES.in Sat Mar 04 06:26:56 2023 -0600
+++ b/po/POTFILES.in Sat Mar 04 06:36:41 2023 -0600
@@ -201,6 +201,7 @@
libpurple/purpleprotocolroomlist.c
libpurple/purpleprotocolserver.c
libpurple/purpleprotocolwhiteboard.c
+libpurple/purplerequestfield.c libpurple/purplesqlitehistoryadapter.c
libpurple/purplewhiteboard.c