pidgin/pidgin

Split PurpleRequestField into its own files

14 months ago, Elliott Sales de Andrade
8a001a903e90
Parents d80a59dc4c91
Children 97bc84c5233e
Split PurpleRequestField into its own files

Note that I `hg cp` the original files to preserve their history, so this _looks_ like a bunch of deleting, but it really isn't.

I've also added a bit of private API for the cross-struct access, but that may go away later. I did _not_ do any other API changes to make this a simpler review.

Testing Done:
Compiled, and opened Request Fields from the demo.

Reviewed at https://reviews.imfreedom.org/r/2311/
--- 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',
'purpleproxyinfo.c',
+ 'purplerequestfield.c',
'purpleroomlistroom.c',
'purplesqlite3.c',
'purplesqlitehistoryadapter.c',
@@ -190,6 +191,7 @@
'purpleprotocolserver.h',
'purpleprotocolwhiteboard.h',
'purpleproxyinfo.h',
+ 'purplerequestfield.h',
'purpleroomlistroom.h',
'purplesqlite3.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);
+
G_END_DECLS
#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
+ *
+ * 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
+ * source distribution.
+ *
+ * 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 "glibcompat.h"
+#include "request.h"
+#include "debug.h"
+#include "purpleaccountmanager.h"
+#include "purplekeyvaluepair.h"
+#include "purpleprivate.h"
+
+struct _PurpleRequestField
+{
+ PurpleRequestFieldType type;
+ PurpleRequestFieldGroup *group;
+
+ char *id;
+ char *label;
+ char *type_hint;
+
+ gboolean visible;
+ gboolean required;
+ gboolean sensitive;
+
+ union
+ {
+ struct
+ {
+ gboolean multiline;
+ gboolean masked;
+ char *default_value;
+ char *value;
+
+ } string;
+
+ struct
+ {
+ int default_value;
+ int value;
+ int lower_bound;
+ int upper_bound;
+ } integer;
+
+ struct
+ {
+ gboolean default_value;
+ gboolean value;
+
+ } boolean;
+
+ struct
+ {
+ gpointer default_value;
+ gpointer value;
+
+ GList *elements;
+ } choice;
+
+ struct
+ {
+ GList *items;
+ gboolean has_icons;
+ GHashTable *item_data;
+ GList *selected;
+ GHashTable *selected_table;
+
+ gboolean multiple_selection;
+
+ } list;
+
+ struct
+ {
+ PurpleAccount *default_account;
+ PurpleAccount *account;
+ gboolean show_all;
+
+ PurpleFilterAccountFunc filter_func;
+
+ } account;
+
+ struct
+ {
+ unsigned int scale_x;
+ unsigned int scale_y;
+ char *buffer;
+ gsize size;
+ } image;
+
+ struct
+ {
+ PurpleRequestDatasheet *sheet;
+ } datasheet;
+ } u;
+
+ void *ui_data;
+ char *tooltip;
+
+ PurpleRequestFieldValidator validator;
+ void *validator_data;
+};
+
+gpointer
+purple_request_field_get_ui_data(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, NULL);
+
+ return field->ui_data;
+}
+
+void
+purple_request_field_set_ui_data(PurpleRequestField *field,
+ gpointer ui_data)
+{
+ g_return_if_fail(field != NULL);
+
+ field->ui_data = ui_data;
+}
+
+PurpleRequestField *
+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);
+ field->type = type;
+
+ purple_request_field_set_label(field, text);
+ purple_request_field_set_visible(field, TRUE);
+ purple_request_field_set_sensitive(field, TRUE);
+
+ return field;
+}
+
+void
+purple_request_field_destroy(PurpleRequestField *field)
+{
+ g_return_if_fail(field != NULL);
+
+ g_free(field->id);
+ g_free(field->label);
+ 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);
+ }
+
+ g_free(field);
+}
+
+void
+_purple_request_field_set_group(PurpleRequestField *field,
+ PurpleRequestFieldGroup *group)
+{
+ g_return_if_fail(field != NULL);
+
+ field->group = group;
+}
+
+void
+purple_request_field_set_label(PurpleRequestField *field, const char *label)
+{
+ g_return_if_fail(field != NULL);
+
+ g_free(field->label);
+ field->label = g_strdup(label);
+}
+
+void
+purple_request_field_set_visible(PurpleRequestField *field, gboolean visible)
+{
+ g_return_if_fail(field != NULL);
+
+ field->visible = visible;
+}
+
+void
+purple_request_field_set_type_hint(PurpleRequestField *field,
+ const char *type_hint)
+{
+ g_return_if_fail(field != NULL);
+
+ g_free(field->type_hint);
+ field->type_hint = g_strdup(type_hint);
+}
+
+void
+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);
+}
+
+void
+purple_request_field_set_required(PurpleRequestField *field, gboolean required)
+{
+ g_return_if_fail(field != NULL);
+
+ if (field->required == required)
+ return;
+
+ field->required = required;
+
+ if(field->group != NULL) {
+ _purple_request_field_group_set_field_required(field->group, field,
+ required);
+ }
+}
+
+PurpleRequestFieldType
+purple_request_field_get_field_type(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, PURPLE_REQUEST_FIELD_NONE);
+
+ return field->type;
+}
+
+PurpleRequestFieldGroup *
+purple_request_field_get_group(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, NULL);
+
+ return field->group;
+}
+
+const char *
+purple_request_field_get_id(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, NULL);
+
+ return field->id;
+}
+
+const char *
+purple_request_field_get_label(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, NULL);
+
+ return field->label;
+}
+
+gboolean
+purple_request_field_is_visible(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, FALSE);
+
+ return field->visible;
+}
+
+const char *
+purple_request_field_get_field_type_hint(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, NULL);
+
+ return field->type_hint;
+}
+
+const char *
+purple_request_field_get_tooltip(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, NULL);
+
+ return field->tooltip;
+}
+
+gboolean
+purple_request_field_is_required(const PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, FALSE);
+
+ return field->required;
+}
+
+gboolean
+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');
+ default:
+ return TRUE;
+ }
+}
+
+void
+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,
+ validator != NULL);
+ }
+}
+
+gboolean
+purple_request_field_is_validatable(PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, FALSE);
+
+ return field->validator != NULL;
+}
+
+gboolean
+purple_request_field_is_valid(PurpleRequestField *field, gchar **errmsg)
+{
+ gboolean valid;
+
+ g_return_val_if_fail(field != NULL, FALSE);
+
+ if (!field->validator)
+ return TRUE;
+
+ if (!purple_request_field_is_required(field) &&
+ !purple_request_field_is_filled(field))
+ return TRUE;
+
+ valid = field->validator(field, errmsg, field->validator_data);
+
+ if (valid && errmsg)
+ *errmsg = NULL;
+
+ return valid;
+}
+
+void
+purple_request_field_set_sensitive(PurpleRequestField *field,
+ gboolean sensitive)
+{
+ g_return_if_fail(field != NULL);
+
+ field->sensitive = sensitive;
+}
+
+gboolean
+purple_request_field_is_sensitive(PurpleRequestField *field)
+{
+ g_return_val_if_fail(field != NULL, FALSE);
+
+ return field->sensitive;
+}
+
+PurpleRequestField *
+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);
+
+ return field;
+}
+
+void
+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);
+}
+
+void
+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);
+}
+
+void
+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;
+}
+
+const char *
+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;
+}
+
+const char *
+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;
+}
+
+gboolean
+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;
+}
+
+gboolean
+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;
+}
+
+PurpleRequestField *
+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);
+
+ return field;
+}
+
+void
+purple_request_field_int_set_default_value(PurpleRequestField *field,
+ int default_value)
+{
+ g_return_if_fail(field != NULL);
+ g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
+
+ field->u.integer.default_value = default_value;
+}
+
+void
+purple_request_field_int_set_lower_bound(PurpleRequestField *field,
+ int lower_bound)
+{
+ g_return_if_fail(field != NULL);
+ g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
+
+ field->u.integer.lower_bound = lower_bound;
+}
+
+void
+purple_request_field_int_set_upper_bound(PurpleRequestField *field,
+ int upper_bound)
+{
+ g_return_if_fail(field != NULL);
+ g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
+
+ field->u.integer.upper_bound = upper_bound;
+}
+
+void
+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");
+ return;
+ }
+
+ field->u.integer.value = value;
+}
+
+int
+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;
+}
+
+int
+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;
+}
+
+int
+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;
+}
+
+int
+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;
+}
+
+PurpleRequestField *
+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);
+
+ return field;
+}
+
+void
+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;
+}
+
+void
+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;
+}
+
+gboolean
+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;
+}
+
+gboolean
+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;
+}
+
+PurpleRequestField *
+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);
+
+ return field;
+}
+
+void
+purple_request_field_choice_add(PurpleRequestField *field, const char *label,
+ gpointer value)
+{
+ purple_request_field_choice_add_full(field, label, value, NULL);
+}
+
+void
+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,
+ choice);
+}
+
+void
+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;
+}
+
+void
+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;
+}
+
+gpointer
+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;
+}
+
+gpointer
+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;
+}
+
+GList *
+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;
+}
+
+PurpleRequestField *
+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,
+ g_free, NULL);
+
+ field->u.list.selected_table =
+ g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+
+ return field;
+}
+
+void
+purple_request_field_list_set_multi_select(PurpleRequestField *field,
+ gboolean multi_select)
+{
+ g_return_if_fail(field != NULL);
+ g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);
+
+ field->u.list.multiple_selection = multi_select;
+}
+
+gboolean
+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;
+}
+
+void *
+purple_request_field_list_get_data(const PurpleRequestField *field,
+ const char *text)
+{
+ 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);
+}
+
+void
+purple_request_field_list_add_icon(PurpleRequestField *field, const char *item, const char* icon_path,
+ void *data)
+{
+ 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);
+}
+
+void
+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 "
+ "field %s\n",
+ purple_request_field_get_id(field));
+ return;
+ }
+
+ field->u.list.selected = g_list_append(field->u.list.selected,
+ g_strdup(item));
+
+ g_hash_table_add(field->u.list.selected_table, g_strdup(item));
+}
+
+void
+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);
+}
+
+void
+purple_request_field_list_set_selected(PurpleRequestField *field, GList *items)
+{
+ GList *l;
+
+ 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 "
+ "field %s\n",
+ purple_request_field_get_id(field));
+ return;
+ }
+
+ for (l = items; l != NULL; l = l->next) {
+ char *selected = l->data;
+ field->u.list.selected = g_list_append(field->u.list.selected,
+ g_strdup(selected));
+ g_hash_table_add(field->u.list.selected_table, g_strdup(selected));
+ }
+}
+
+gboolean
+purple_request_field_list_is_selected(const PurpleRequestField *field,
+ const char *item)
+{
+ 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);
+}
+
+GList *
+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;
+}
+
+GList *
+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;
+}
+
+gboolean
+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;
+}
+
+PurpleRequestField *
+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);
+
+ return field;
+}
+
+PurpleRequestField *
+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;
+
+ return field;
+}
+
+void
+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;
+}
+
+const char *
+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;
+}
+
+gsize
+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;
+}
+
+unsigned int
+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;
+}
+
+unsigned int
+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;
+}
+
+PurpleRequestField *
+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);
+
+ if(account == NULL) {
+ PurpleAccountManager *manager = purple_account_manager_get_default();
+ GList *accounts = purple_account_manager_get_connected(manager);
+
+ if(accounts != NULL) {
+ account = accounts->data;
+ g_list_free(accounts);
+ }
+ }
+
+ purple_request_field_account_set_default_value(field, account);
+ purple_request_field_account_set_value(field, account);
+
+ return field;
+}
+
+void
+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;
+}
+
+void
+purple_request_field_account_set_value(PurpleRequestField *field,
+ PurpleAccount *value)
+{
+ g_return_if_fail(field != NULL);
+ g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT);
+
+ field->u.account.account = value;
+}
+
+void
+purple_request_field_account_set_show_all(PurpleRequestField *field,
+ gboolean show_all)
+{
+ g_return_if_fail(field != NULL);
+ g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT);
+
+ if (field->u.account.show_all == show_all)
+ return;
+
+ field->u.account.show_all = show_all;
+
+ if(!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,
+ accounts->data);
+ }
+
+ if (purple_account_is_connected(field->u.account.account))
+ {
+ purple_request_field_account_set_value(field,
+ accounts->data);
+ }
+
+ g_list_free(accounts);
+ }
+}
+
+void
+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;
+}
+
+PurpleAccount *
+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;
+}
+
+PurpleAccount *
+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;
+}
+
+gboolean
+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;
+}
+
+PurpleFilterAccountFunc
+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;
+}
+
+PurpleRequestField *
+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;
+
+ return field;
+}
+
+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;
+}
+
+/* -- */
+
+gboolean
+purple_request_field_email_validator(PurpleRequestField *field, gchar **errmsg,
+ G_GNUC_UNUSED gpointer user_data)
+{
+ const char *value;
+
+ 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))
+ return TRUE;
+
+ if (errmsg)
+ *errmsg = g_strdup(_("Invalid email address"));
+ return FALSE;
+}
+
+gboolean
+purple_request_field_alphanumeric_validator(PurpleRequestField *field,
+ gchar **errmsg, void *allowed_characters)
+{
+ const char *value;
+ 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)];
+ g_free(value_r);
+ }
+ else
+ {
+ while (value)
+ {
+ if (!g_ascii_isalnum(*value))
+ {
+ invalid_char = *value;
+ break;
+ }
+ value++;
+ }
+ }
+ if (!invalid_char)
+ return TRUE;
+
+ if (errmsg)
+ *errmsg = g_strdup_printf(_("Invalid character '%c'"),
+ invalid_char);
+ return FALSE;
+}
--- /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
+ * source distribution.
+ *
+ * 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"
+#endif
+
+#ifndef PURPLE_REQUEST_FIELD_H
+#define PURPLE_REQUEST_FIELD_H
+
+#include <stdlib.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+/**
+ * PurpleRequestField:
+ *
+ * A request field.
+ */
+typedef struct _PurpleRequestField PurpleRequestField;
+
+#include "account.h"
+#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.
+ *
+ * A type of field.
+ */
+typedef enum
+{
+ 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);
+
+G_BEGIN_DECLS
+
+/**************************************************************************/
+/* Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_new:
+ * @id: The field ID.
+ * @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.
+ *
+ * Destroys a field.
+ */
+void purple_request_field_destroy(PurpleRequestField *field);
+
+/**
+ * purple_request_field_set_label:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ * @tooltip: The tooltip text.
+ *
+ * Sets the tooltip for the field.
+ *
+ * This is optionally used by the UIs to provide a tooltip for
+ * the field.
+ */
+void purple_request_field_set_tooltip(PurpleRequestField *field,
+ const char *tooltip);
+
+/**
+ * purple_request_field_set_required:
+ * @field: The field.
+ * @required: TRUE if required, or FALSE.
+ *
+ * Sets whether or not a field is required.
+ */
+void purple_request_field_set_required(PurpleRequestField *field,
+ gboolean required);
+
+/**
+ * purple_request_field_get_field_type:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * Returns the ID of a field.
+ *
+ * Returns: The ID
+ */
+const char *purple_request_field_get_id(const PurpleRequestField *field);
+
+/**
+ * purple_request_field_get_label:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ * @sensitive: TRUE if the field should be sensitive for user input.
+ *
+ * Sets field editable.
+ */
+void purple_request_field_set_sensitive(PurpleRequestField *field,
+ gboolean sensitive);
+
+/**
+ * purple_request_field_is_sensitive:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ * @ui_data: The UI data.
+ *
+ * Sets the ui_data for a field.
+ */
+void purple_request_field_set_ui_data(PurpleRequestField *field,
+ gpointer ui_data);
+
+/**************************************************************************/
+/* String Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_string_new:
+ * @id: The field ID.
+ * @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 *text,
+ const char *default_value,
+ gboolean multiline);
+
+/**
+ * purple_request_field_string_set_default_value:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ * @value: The value.
+ *
+ * Sets the value in a string field.
+ */
+void purple_request_field_string_set_value(PurpleRequestField *field,
+ const char *value);
+
+/**
+ * purple_request_field_string_set_masked:
+ * @field: The field.
+ * @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,
+ gboolean masked);
+
+/**
+ * purple_request_field_string_get_default_value:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * Returns the user-entered value in a string field.
+ *
+ * Returns: The value.
+ */
+const char *purple_request_field_string_get_value(const PurpleRequestField *field);
+
+/**
+ * purple_request_field_string_is_multiline:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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);
+
+/**************************************************************************/
+/* Integer Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_int_new:
+ * @id: The field ID.
+ * @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:
+ * @field: The field.
+ * @default_value: The default value.
+ *
+ * Sets the default value in an integer field.
+ */
+void purple_request_field_int_set_default_value(PurpleRequestField *field,
+ int default_value);
+
+/**
+ * purple_request_field_int_set_lower_bound:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ * @value: The 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * Returns the user-entered value in an integer field.
+ *
+ * Returns: The value.
+ */
+int purple_request_field_int_get_value(const PurpleRequestField *field);
+
+/**************************************************************************/
+/* Boolean Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_bool_new:
+ * @id: The field ID.
+ * @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,
+ const char *text,
+ gboolean default_value);
+
+/**
+ * purple_request_field_bool_set_default_value:
+ * @field: The field.
+ * @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:
+ * @field: The field.
+ * @value: The value.
+ *
+ * Sets the value in an boolean field.
+ */
+void purple_request_field_bool_set_value(PurpleRequestField *field,
+ gboolean value);
+
+/**
+ * purple_request_field_bool_get_default_value:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * Returns the user-entered value in an boolean field.
+ *
+ * Returns: The value.
+ */
+gboolean purple_request_field_bool_get_value(const PurpleRequestField *field);
+
+/**************************************************************************/
+/* Choice Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_choice_new:
+ * @id: The field ID.
+ * @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.
+ */
+PurpleRequestField *
+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.
+ */
+void
+purple_request_field_choice_add(PurpleRequestField *field, const char *label,
+ gpointer data);
+
+/**
+ * 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.
+ *
+ * Since: 3.0.0
+ */
+void
+purple_request_field_choice_add_full(PurpleRequestField *field, const char *label,
+ gpointer data, GDestroyNotify destroy);
+
+/**
+ * purple_request_field_choice_set_default_value:
+ * @field: The field.
+ * @default_value: The default value.
+ *
+ * Sets the default value in an choice field.
+ */
+void
+purple_request_field_choice_set_default_value(PurpleRequestField *field,
+ gpointer default_value);
+
+/**
+ * purple_request_field_choice_set_value:
+ * @field: The field.
+ * @value: The value.
+ *
+ * Sets the value in an choice field.
+ */
+void
+purple_request_field_choice_set_value(PurpleRequestField *field,
+ gpointer value);
+
+/**
+ * purple_request_field_choice_get_default_value:
+ * @field: The field.
+ *
+ * Returns the default value in an choice field.
+ *
+ * Returns: The default value.
+ */
+gpointer
+purple_request_field_choice_get_default_value(const PurpleRequestField *field);
+
+/**
+ * purple_request_field_choice_get_value:
+ * @field: The field.
+ *
+ * Returns the user-entered value in an choice field.
+ *
+ * Returns: The value.
+ */
+gpointer
+purple_request_field_choice_get_value(const PurpleRequestField *field);
+
+/**
+ * purple_request_field_choice_get_elements:
+ * @field: The field.
+ *
+ * Returns a list of elements in a choice field.
+ *
+ * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of pairs of {label, value}.
+ */
+GList *
+purple_request_field_choice_get_elements(const PurpleRequestField *field);
+
+/**************************************************************************/
+/* List Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_list_new:
+ * @id: The field ID.
+ * @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,
+ * or FALSE otherwise.
+ *
+ * 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,
+ const char *text);
+
+/**
+ * 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:
+ * @field: The field.
+ * @item: The item to add.
+ *
+ * Adds a selected item to the list field.
+ */
+void purple_request_field_list_add_selected(PurpleRequestField *field,
+ const char *item);
+
+/**
+ * purple_request_field_list_clear_selected:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ * @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,
+ GList *items);
+
+/**
+ * purple_request_field_list_is_selected:
+ * @field: The field.
+ * @item: The item.
+ *
+ * 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,
+ const char *item);
+
+/**
+ * purple_request_field_list_get_selected:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * Indicates if list field has icons.
+ *
+ * Returns: TRUE if list field has icons, FALSE otherwise.
+ *
+ * Since: 3.0.0
+ */
+gboolean purple_request_field_list_has_icons(const PurpleRequestField *field);
+
+/**************************************************************************/
+/* Label Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_label_new:
+ * @id: The field ID.
+ * @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,
+ const char *text);
+
+/**************************************************************************/
+/* Image Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_image_new:
+ * @id: The field ID.
+ * @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);
+
+/**************************************************************************/
+/* Account Field API */
+/**************************************************************************/
+
+/**
+ * purple_request_field_account_new:
+ * @id: The field ID.
+ * @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,
+ const char *text,
+ 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.
+ * @value: The account.
+ *
+ * Sets the account in an account field.
+ */
+void purple_request_field_account_set_value(PurpleRequestField *field,
+ PurpleAccount *value);
+
+/**
+ * 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,
+ gboolean show_all);
+
+/**
+ * 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
+ * don't.
+ */
+void purple_request_field_account_set_filter(PurpleRequestField *field,
+ PurpleFilterAccountFunc filter_func);
+
+/**
+ * purple_request_field_account_get_default_value:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ *
+ * 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
+ * don't.
+ *
+ * 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:
+ * @id: The field ID.
+ * @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:
+ * @field: The field.
+ *
+ * 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:
+ * @field: The field.
+ * @errmsg: (out) (optional): destination for error message.
+ * @user_data: Ignored.
+ *
+ * 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:
+ * @field: The field.
+ * @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);
+
+G_END_DECLS
+
+#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 "request.h"
#include "debug.h"
-#include "purpleaccountmanager.h"
#include "purplekeyvaluepair.h"
+#include "purpleprivate.h"
static PurpleRequestUiOps *request_ui_ops = NULL;
static GList *handles = NULL;
@@ -46,96 +46,6 @@
GSList *notify_on_close;
} PurpleRequestInfo;
-struct _PurpleRequestField
-{
- PurpleRequestFieldType type;
- PurpleRequestFieldGroup *group;
-
- char *id;
- char *label;
- char *type_hint;
-
- gboolean visible;
- gboolean required;
- gboolean sensitive;
-
- union
- {
- struct
- {
- gboolean multiline;
- gboolean masked;
- char *default_value;
- char *value;
-
- } string;
-
- struct
- {
- int default_value;
- int value;
- int lower_bound;
- int upper_bound;
- } integer;
-
- struct
- {
- gboolean default_value;
- gboolean value;
-
- } boolean;
-
- struct
- {
- gpointer default_value;
- gpointer value;
-
- GList *elements;
- } choice;
-
- struct
- {
- GList *items;
- gboolean has_icons;
- GHashTable *item_data;
- GList *selected;
- GHashTable *selected_table;
-
- gboolean multiple_selection;
-
- } list;
-
- struct
- {
- PurpleAccount *default_account;
- PurpleAccount *account;
- gboolean show_all;
-
- PurpleFilterAccountFunc filter_func;
-
- } account;
-
- struct
- {
- unsigned int scale_x;
- unsigned int scale_y;
- char *buffer;
- gsize size;
- } image;
-
- struct
- {
- PurpleRequestDatasheet *sheet;
- } datasheet;
- } u;
-
- void *ui_data;
- char *tooltip;
-
- PurpleRequestFieldValidator validator;
- void *validator_data;
-};
-
struct _PurpleRequestFields
{
GList *groups;
@@ -567,23 +477,6 @@
return purple_request_field_is_required(field);
}
-gpointer
-purple_request_field_get_ui_data(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, NULL);
-
- return field->ui_data;
-}
-
-void
-purple_request_field_set_ui_data(PurpleRequestField *field,
- gpointer ui_data)
-{
- g_return_if_fail(field != NULL);
-
- field->ui_data = ui_data;
-}
-
gboolean
purple_request_fields_all_required_filled(const PurpleRequestFields *fields)
{
@@ -748,6 +641,35 @@
}
void
+_purple_request_field_group_set_field_required(PurpleRequestFieldGroup *group,
+ PurpleRequestField *field,
+ gboolean required)
+{
+ if(required) {
+ group->fields_list->required_fields =
+ g_list_append(group->fields_list->required_fields,
+ field);
+ } else {
+ group->fields_list->required_fields =
+ g_list_remove(group->fields_list->required_fields,
+ field);
+ }
+}
+
+void
+_purple_request_field_group_set_field_validator(PurpleRequestFieldGroup *group,
+ PurpleRequestField *field,
+ gboolean validator)
+{
+ PurpleRequestFields *flist = group->fields_list;
+ flist->validated_fields = g_list_remove(flist->validated_fields, field);
+ if(validator) {
+ flist->validated_fields = g_list_append(flist->validated_fields,
+ field);
+ }
+}
+
+void
purple_request_field_group_add_field(PurpleRequestFieldGroup *group,
PurpleRequestField *field)
{
@@ -774,8 +696,7 @@
}
}
- field->group = group;
-
+ _purple_request_field_set_group(field, group);
}
const char *
@@ -802,1052 +723,6 @@
return group->fields_list;
}
-PurpleRequestField *
-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);
- field->type = type;
-
- purple_request_field_set_label(field, text);
- purple_request_field_set_visible(field, TRUE);
- purple_request_field_set_sensitive(field, TRUE);
-
- return field;
-}
-
-void
-purple_request_field_destroy(PurpleRequestField *field)
-{
- g_return_if_fail(field != NULL);
-
- g_free(field->id);
- g_free(field->label);
- 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);
- }
-
- g_free(field);
-}
-
-void
-purple_request_field_set_label(PurpleRequestField *field, const char *label)
-{
- g_return_if_fail(field != NULL);
-
- g_free(field->label);
- field->label = g_strdup(label);
-}
-
-void
-purple_request_field_set_visible(PurpleRequestField *field, gboolean visible)
-{
- g_return_if_fail(field != NULL);
-
- field->visible = visible;
-}
-
-void
-purple_request_field_set_type_hint(PurpleRequestField *field,
- const char *type_hint)
-{
- g_return_if_fail(field != NULL);
-
- g_free(field->type_hint);
- field->type_hint = g_strdup(type_hint);
-}
-
-void
-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);
-}
-
-void
-purple_request_field_set_required(PurpleRequestField *field, gboolean required)
-{
- g_return_if_fail(field != NULL);
-
- if (field->required == required)
- return;
-
- field->required = required;
-
- if (field->group != NULL)
- {
- if (required)
- {
- field->group->fields_list->required_fields =
- g_list_append(field->group->fields_list->required_fields,
- field);
- }
- else
- {
- field->group->fields_list->required_fields =
- g_list_remove(field->group->fields_list->required_fields,
- field);
- }
- }
-}
-
-PurpleRequestFieldType
-purple_request_field_get_field_type(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, PURPLE_REQUEST_FIELD_NONE);
-
- return field->type;
-}
-
-PurpleRequestFieldGroup *
-purple_request_field_get_group(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, NULL);
-
- return field->group;
-}
-
-const char *
-purple_request_field_get_id(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, NULL);
-
- return field->id;
-}
-
-const char *
-purple_request_field_get_label(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, NULL);
-
- return field->label;
-}
-
-gboolean
-purple_request_field_is_visible(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, FALSE);
-
- return field->visible;
-}
-
-const char *
-purple_request_field_get_field_type_hint(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, NULL);
-
- return field->type_hint;
-}
-
-const char *
-purple_request_field_get_tooltip(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, NULL);
-
- return field->tooltip;
-}
-
-gboolean
-purple_request_field_is_required(const PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, FALSE);
-
- return field->required;
-}
-
-gboolean
-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');
- default:
- return TRUE;
- }
-}
-
-void
-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,
- field);
- if (validator)
- {
- flist->validated_fields = g_list_append(
- flist->validated_fields, field);
- }
- }
-}
-
-gboolean
-purple_request_field_is_validatable(PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, FALSE);
-
- return field->validator != NULL;
-}
-
-gboolean
-purple_request_field_is_valid(PurpleRequestField *field, gchar **errmsg)
-{
- gboolean valid;
-
- g_return_val_if_fail(field != NULL, FALSE);
-
- if (!field->validator)
- return TRUE;
-
- if (!purple_request_field_is_required(field) &&
- !purple_request_field_is_filled(field))
- return TRUE;
-
- valid = field->validator(field, errmsg, field->validator_data);
-
- if (valid && errmsg)
- *errmsg = NULL;
-
- return valid;
-}
-
-void
-purple_request_field_set_sensitive(PurpleRequestField *field,
- gboolean sensitive)
-{
- g_return_if_fail(field != NULL);
-
- field->sensitive = sensitive;
-}
-
-gboolean
-purple_request_field_is_sensitive(PurpleRequestField *field)
-{
- g_return_val_if_fail(field != NULL, FALSE);
-
- return field->sensitive;
-}
-
-PurpleRequestField *
-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);
-
- return field;
-}
-
-void
-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);
-}
-
-void
-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);
-}
-
-void
-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;
-}
-
-const char *
-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;
-}
-
-const char *
-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;
-}
-
-gboolean
-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;
-}
-
-gboolean
-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;
-}
-
-PurpleRequestField *
-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);
-
- return field;
-}
-
-void
-purple_request_field_int_set_default_value(PurpleRequestField *field,
- int default_value)
-{
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
-
- field->u.integer.default_value = default_value;
-}
-
-void
-purple_request_field_int_set_lower_bound(PurpleRequestField *field,
- int lower_bound)
-{
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
-
- field->u.integer.lower_bound = lower_bound;
-}
-
-void
-purple_request_field_int_set_upper_bound(PurpleRequestField *field,
- int upper_bound)
-{
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_INTEGER);
-
- field->u.integer.upper_bound = upper_bound;
-}
-
-void
-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");
- return;
- }
-
- field->u.integer.value = value;
-}
-
-int
-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;
-}
-
-int
-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;
-}
-
-int
-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;
-}
-
-int
-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;
-}
-
-PurpleRequestField *
-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);
-
- return field;
-}
-
-void
-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;
-}
-
-void
-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;
-}
-
-gboolean
-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;
-}
-
-gboolean
-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;
-}
-
-PurpleRequestField *
-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);
-
- return field;
-}
-
-void
-purple_request_field_choice_add(PurpleRequestField *field, const char *label,
- gpointer value)
-{
- purple_request_field_choice_add_full(field, label, value, NULL);
-}
-
-void
-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,
- choice);
-}
-
-void
-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;
-}
-
-void
-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;
-}
-
-gpointer
-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;
-}
-
-gpointer
-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;
-}
-
-GList *
-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;
-}
-
-PurpleRequestField *
-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,
- g_free, NULL);
-
- field->u.list.selected_table =
- g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-
- return field;
-}
-
-void
-purple_request_field_list_set_multi_select(PurpleRequestField *field,
- gboolean multi_select)
-{
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);
-
- field->u.list.multiple_selection = multi_select;
-}
-
-gboolean
-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;
-}
-
-void *
-purple_request_field_list_get_data(const PurpleRequestField *field,
- const char *text)
-{
- 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);
-}
-
-void
-purple_request_field_list_add_icon(PurpleRequestField *field, const char *item, const char* icon_path,
- void *data)
-{
- 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);
-}
-
-void
-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 "
- "field %s\n",
- purple_request_field_get_id(field));
- return;
- }
-
- field->u.list.selected = g_list_append(field->u.list.selected,
- g_strdup(item));
-
- g_hash_table_add(field->u.list.selected_table, g_strdup(item));
-}
-
-void
-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);
-}
-
-void
-purple_request_field_list_set_selected(PurpleRequestField *field, GList *items)
-{
- GList *l;
-
- 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 "
- "field %s\n",
- purple_request_field_get_id(field));
- return;
- }
-
- for (l = items; l != NULL; l = l->next) {
- char *selected = l->data;
- field->u.list.selected = g_list_append(field->u.list.selected,
- g_strdup(selected));
- g_hash_table_add(field->u.list.selected_table, g_strdup(selected));
- }
-}
-
-gboolean
-purple_request_field_list_is_selected(const PurpleRequestField *field,
- const char *item)
-{
- 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);
-}
-
-GList *
-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;
-}
-
-GList *
-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;
-}
-
-gboolean
-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;
-}
-
-PurpleRequestField *
-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);
-
- return field;
-}
-
-PurpleRequestField *
-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;
-
- return field;
-}
-
-void
-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;
-}
-
-const char *
-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;
-}
-
-gsize
-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;
-}
-
-unsigned int
-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;
-}
-
-unsigned int
-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;
-}
-
-PurpleRequestField *
-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);
-
- if(account == NULL) {
- PurpleAccountManager *manager = purple_account_manager_get_default();
- GList *accounts = purple_account_manager_get_connected(manager);
-
- if(accounts != NULL) {
- account = accounts->data;
- g_list_free(accounts);
- }
- }
-
- purple_request_field_account_set_default_value(field, account);
- purple_request_field_account_set_value(field, account);
-
- return field;
-}
-
-void
-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;
-}
-
-void
-purple_request_field_account_set_value(PurpleRequestField *field,
- PurpleAccount *value)
-{
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT);
-
- field->u.account.account = value;
-}
-
-void
-purple_request_field_account_set_show_all(PurpleRequestField *field,
- gboolean show_all)
-{
- g_return_if_fail(field != NULL);
- g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_ACCOUNT);
-
- if (field->u.account.show_all == show_all)
- return;
-
- field->u.account.show_all = show_all;
-
- if(!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,
- accounts->data);
- }
-
- if (purple_account_is_connected(field->u.account.account))
- {
- purple_request_field_account_set_value(field,
- accounts->data);
- }
-
- g_list_free(accounts);
- }
-}
-
-void
-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;
-}
-
-PurpleAccount *
-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;
-}
-
-PurpleAccount *
-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;
-}
-
-gboolean
-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;
-}
-
-PurpleFilterAccountFunc
-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;
-}
-
-PurpleRequestField *
-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;
-
- return field;
-}
-
-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;
-}
-
-/* -- */
-
-gboolean
-purple_request_field_email_validator(PurpleRequestField *field, gchar **errmsg,
- G_GNUC_UNUSED gpointer user_data)
-{
- const char *value;
-
- 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))
- return TRUE;
-
- if (errmsg)
- *errmsg = g_strdup(_("Invalid email address"));
- return FALSE;
-}
-
-gboolean
-purple_request_field_alphanumeric_validator(PurpleRequestField *field,
- gchar **errmsg, void *allowed_characters)
-{
- const char *value;
- 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)];
- g_free(value_r);
- }
- else
- {
- while (value)
- {
- if (!g_ascii_isalnum(*value))
- {
- invalid_char = *value;
- break;
- }
- value++;
- }
- }
- if (!invalid_char)
- return TRUE;
-
- if (errmsg)
- *errmsg = g_strdup_printf(_("Invalid character '%c'"),
- invalid_char);
- return FALSE;
-}
-
/* -- */
static gchar *
@@ -2133,16 +1008,15 @@
for (itf = group->fields; itf != NULL; itf = g_list_next(itf)) {
PurpleRequestField *field = itf->data;
+ const char *old_label;
gchar *new_label;
- new_label = purple_request_strip_html_custom(
- field->label);
- if (g_strcmp0(new_label, field->label) == 0) {
- g_free(new_label);
- continue;
+ old_label = purple_request_field_get_label(field);
+ new_label = purple_request_strip_html_custom(old_label);
+ if(g_strcmp0(new_label, old_label) != 0) {
+ purple_request_field_set_label(field, new_label);
}
- g_free(field->label);
- field->label = new_label;
+ g_free(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())
/**
- * PurpleRequestField:
- *
- * A request field.
- */
-typedef struct _PurpleRequestField PurpleRequestField;
-
-/**
* PurpleRequestFields:
*
* Multiple fields request data.
@@ -66,6 +59,7 @@
#include "account.h"
#include "purpleconversation.h"
+#include "purplerequestfield.h"
#include "request-datasheet.h"
#define PURPLE_DEFAULT_ACTION_NONE -1
@@ -95,36 +89,6 @@
} PurpleRequestType;
/**
- * 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.
- *
- * A type of field.
- */
-typedef enum
-{
- 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;
-
-/**
* PurpleRequestFeature:
* @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);
-
/**
* PurpleRequestActionCb:
* @data: user-data
@@ -820,1005 +781,6 @@
const PurpleRequestFieldGroup *group);
/**************************************************************************/
-/* Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_new:
- * @id: The field ID.
- * @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.
- *
- * Destroys a field.
- */
-void purple_request_field_destroy(PurpleRequestField *field);
-
-/**
- * purple_request_field_set_label:
- * @field: The field.
- * @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:
- * @field: The field.
- * @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:
- * @field: The field.
- * @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:
- * @field: The field.
- * @tooltip: The tooltip text.
- *
- * Sets the tooltip for the field.
- *
- * This is optionally used by the UIs to provide a tooltip for
- * the field.
- */
-void purple_request_field_set_tooltip(PurpleRequestField *field,
- const char *tooltip);
-
-/**
- * purple_request_field_set_required:
- * @field: The field.
- * @required: TRUE if required, or FALSE.
- *
- * Sets whether or not a field is required.
- */
-void purple_request_field_set_required(PurpleRequestField *field,
- gboolean required);
-
-/**
- * purple_request_field_get_field_type:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * Returns the ID of a field.
- *
- * Returns: The ID
- */
-const char *purple_request_field_get_id(const PurpleRequestField *field);
-
-/**
- * purple_request_field_get_label:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- * @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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- * @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:
- * @field: The field.
- * @sensitive: TRUE if the field should be sensitive for user input.
- *
- * Sets field editable.
- */
-void purple_request_field_set_sensitive(PurpleRequestField *field,
- gboolean sensitive);
-
-/**
- * purple_request_field_is_sensitive:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- * @ui_data: The UI data.
- *
- * Sets the ui_data for a field.
- */
-void purple_request_field_set_ui_data(PurpleRequestField *field,
- gpointer ui_data);
-
-/**************************************************************************/
-/* String Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_string_new:
- * @id: The field ID.
- * @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 *text,
- const char *default_value,
- gboolean multiline);
-
-/**
- * purple_request_field_string_set_default_value:
- * @field: The field.
- * @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:
- * @field: The field.
- * @value: The value.
- *
- * Sets the value in a string field.
- */
-void purple_request_field_string_set_value(PurpleRequestField *field,
- const char *value);
-
-/**
- * purple_request_field_string_set_masked:
- * @field: The field.
- * @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,
- gboolean masked);
-
-/**
- * purple_request_field_string_get_default_value:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * Returns the user-entered value in a string field.
- *
- * Returns: The value.
- */
-const char *purple_request_field_string_get_value(const PurpleRequestField *field);
-
-/**
- * purple_request_field_string_is_multiline:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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);
-
-/**************************************************************************/
-/* Integer Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_int_new:
- * @id: The field ID.
- * @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:
- * @field: The field.
- * @default_value: The default value.
- *
- * Sets the default value in an integer field.
- */
-void purple_request_field_int_set_default_value(PurpleRequestField *field,
- int default_value);
-
-/**
- * purple_request_field_int_set_lower_bound:
- * @field: The field.
- * @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:
- * @field: The field.
- * @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:
- * @field: The field.
- * @value: The 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * Returns the user-entered value in an integer field.
- *
- * Returns: The value.
- */
-int purple_request_field_int_get_value(const PurpleRequestField *field);
-
-/**************************************************************************/
-/* Boolean Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_bool_new:
- * @id: The field ID.
- * @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,
- const char *text,
- gboolean default_value);
-
-/**
- * purple_request_field_bool_set_default_value:
- * @field: The field.
- * @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:
- * @field: The field.
- * @value: The value.
- *
- * Sets the value in an boolean field.
- */
-void purple_request_field_bool_set_value(PurpleRequestField *field,
- gboolean value);
-
-/**
- * purple_request_field_bool_get_default_value:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * Returns the user-entered value in an boolean field.
- *
- * Returns: The value.
- */
-gboolean purple_request_field_bool_get_value(const PurpleRequestField *field);
-
-/**************************************************************************/
-/* Choice Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_choice_new:
- * @id: The field ID.
- * @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.
- */
-PurpleRequestField *
-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.
- */
-void
-purple_request_field_choice_add(PurpleRequestField *field, const char *label,
- gpointer data);
-
-/**
- * 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.
- *
- * Since: 3.0.0
- */
-void
-purple_request_field_choice_add_full(PurpleRequestField *field, const char *label,
- gpointer data, GDestroyNotify destroy);
-
-/**
- * purple_request_field_choice_set_default_value:
- * @field: The field.
- * @default_value: The default value.
- *
- * Sets the default value in an choice field.
- */
-void
-purple_request_field_choice_set_default_value(PurpleRequestField *field,
- gpointer default_value);
-
-/**
- * purple_request_field_choice_set_value:
- * @field: The field.
- * @value: The value.
- *
- * Sets the value in an choice field.
- */
-void
-purple_request_field_choice_set_value(PurpleRequestField *field,
- gpointer value);
-
-/**
- * purple_request_field_choice_get_default_value:
- * @field: The field.
- *
- * Returns the default value in an choice field.
- *
- * Returns: The default value.
- */
-gpointer
-purple_request_field_choice_get_default_value(const PurpleRequestField *field);
-
-/**
- * purple_request_field_choice_get_value:
- * @field: The field.
- *
- * Returns the user-entered value in an choice field.
- *
- * Returns: The value.
- */
-gpointer
-purple_request_field_choice_get_value(const PurpleRequestField *field);
-
-/**
- * purple_request_field_choice_get_elements:
- * @field: The field.
- *
- * Returns a list of elements in a choice field.
- *
- * Returns: (element-type PurpleKeyValuePair) (transfer none): The list of pairs of {label, value}.
- */
-GList *
-purple_request_field_choice_get_elements(const PurpleRequestField *field);
-
-/**************************************************************************/
-/* List Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_list_new:
- * @id: The field ID.
- * @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,
- * or FALSE otherwise.
- *
- * 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,
- const char *text);
-
-/**
- * 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:
- * @field: The field.
- * @item: The item to add.
- *
- * Adds a selected item to the list field.
- */
-void purple_request_field_list_add_selected(PurpleRequestField *field,
- const char *item);
-
-/**
- * purple_request_field_list_clear_selected:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- * @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,
- GList *items);
-
-/**
- * purple_request_field_list_is_selected:
- * @field: The field.
- * @item: The item.
- *
- * 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,
- const char *item);
-
-/**
- * purple_request_field_list_get_selected:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * Indicates if list field has icons.
- *
- * Returns: TRUE if list field has icons, FALSE otherwise.
- *
- * Since: 3.0.0
- */
-gboolean purple_request_field_list_has_icons(const PurpleRequestField *field);
-
-/**************************************************************************/
-/* Label Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_label_new:
- * @id: The field ID.
- * @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,
- const char *text);
-
-/**************************************************************************/
-/* Image Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_image_new:
- * @id: The field ID.
- * @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);
-
-/**************************************************************************/
-/* Account Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_account_new:
- * @id: The field ID.
- * @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,
- const char *text,
- 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.
- * @value: The account.
- *
- * Sets the account in an account field.
- */
-void purple_request_field_account_set_value(PurpleRequestField *field,
- PurpleAccount *value);
-
-/**
- * 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,
- gboolean show_all);
-
-/**
- * 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
- * don't.
- */
-void purple_request_field_account_set_filter(PurpleRequestField *field,
- PurpleFilterAccountFunc filter_func);
-
-/**
- * purple_request_field_account_get_default_value:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- *
- * 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
- * don't.
- *
- * 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:
- * @id: The field ID.
- * @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:
- * @field: The field.
- *
- * 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:
- * @field: The field.
- * @errmsg: (out) (optional): destination for error message.
- * @user_data: Ignored.
- *
- * 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:
- * @field: The field.
- * @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);
-
-/**************************************************************************/
/* Request API */
/**************************************************************************/
--- 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/purpleui.c
libpurple/purplewhiteboard.c