diff options
author | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2023-03-04 06:36:41 -0600 |
---|---|---|
committer | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2023-03-04 06:36:41 -0600 |
commit | f9b41b220e65711fcb3bdaeab1aa31eedb02ba47 (patch) | |
tree | 0146b5fbf209152958e875b2068302dd39df3ce4 /libpurple | |
parent | 6a6a7c78e592efb5a90f7e904df0e059dfc3990f (diff) | |
download | pidgin-f9b41b220e65711fcb3bdaeab1aa31eedb02ba47.tar.gz |
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/
Diffstat (limited to 'libpurple')
-rw-r--r-- | libpurple/meson.build | 2 | ||||
-rw-r--r-- | libpurple/purpleprivate.h | 4 | ||||
-rw-r--r-- | libpurple/purplerequestfield.c | 1173 | ||||
-rw-r--r-- | libpurple/purplerequestfield.h | 1083 | ||||
-rw-r--r-- | libpurple/request.c | 1200 | ||||
-rw-r--r-- | libpurple/request.h | 1040 |
6 files changed, 2300 insertions, 2202 deletions
diff --git a/libpurple/meson.build b/libpurple/meson.build index ffc7097e64..46bb7cd7fb 100644 --- a/libpurple/meson.build +++ b/libpurple/meson.build @@ -84,6 +84,7 @@ purple_coresources = [ 'purpleprotocolserver.c', 'purpleprotocolwhiteboard.c', 'purpleproxyinfo.c', + 'purplerequestfield.c', 'purpleroomlistroom.c', 'purplesqlite3.c', 'purplesqlitehistoryadapter.c', @@ -190,6 +191,7 @@ purple_coreheaders = [ 'purpleprotocolserver.h', 'purpleprotocolwhiteboard.h', 'purpleproxyinfo.h', + 'purplerequestfield.h', 'purpleroomlistroom.h', 'purplesqlite3.h', 'purplesqlitehistoryadapter.h', diff --git a/libpurple/purpleprivate.h b/libpurple/purpleprivate.h index 701dfb5118..1759d4ddd1 100644 --- a/libpurple/purpleprivate.h +++ b/libpurple/purpleprivate.h @@ -338,6 +338,10 @@ void purple_whiteboard_manager_shutdown(void); */ G_GNUC_INTERNAL void purple_account_set_enabled_plain(PurpleAccount *account, gboolean enabled); +G_GNUC_INTERNAL void _purple_request_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 */ diff --git a/libpurple/purplerequestfield.c b/libpurple/purplerequestfield.c new file mode 100644 index 0000000000..2c10b69a3b --- /dev/null +++ b/libpurple/purplerequestfield.c @@ -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; +} diff --git a/libpurple/purplerequestfield.h b/libpurple/purplerequestfield.h new file mode 100644 index 0000000000..3a47f057ee --- /dev/null +++ b/libpurple/purplerequestfield.h @@ -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 */ diff --git a/libpurple/request.c b/libpurple/request.c index bfa3f87348..d206ae9ca9 100644 --- a/libpurple/request.c +++ b/libpurple/request.c @@ -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 @@ typedef struct 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 @@ purple_request_fields_is_field_required(const PurpleRequestFields *fields, 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 @@ purple_request_field_group_destroy(PurpleRequestFieldGroup *group) } 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 @@ purple_request_field_group_add_field(PurpleRequestFieldGroup *group, } } - field->group = group; - + _purple_request_field_set_group(field, group); } const char * @@ -802,1052 +723,6 @@ purple_request_field_group_get_fields_list(const PurpleRequestFieldGroup *group) 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 @@ purple_request_fields_strip_html(PurpleRequestFields *fields) 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); } } } diff --git a/libpurple/request.h b/libpurple/request.h index a7d306b65f..ff3257ed75 100644 --- a/libpurple/request.h +++ b/libpurple/request.h @@ -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 @@ typedef struct _PurpleRequestUiOps PurpleRequestUiOps; #include "account.h" #include "purpleconversation.h" +#include "purplerequestfield.h" #include "request-datasheet.h" #define PURPLE_DEFAULT_ACTION_NONE -1 @@ -95,36 +89,6 @@ typedef enum } 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 @@ struct _PurpleRequestUiOps 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 @@ PurpleRequestFields *purple_request_field_group_get_fields_list( 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 */ /**************************************************************************/ |