# HG changeset patch # User Christian Hammond # Date 1055045181 0 # Node ID 11001789cb224bfc6a9101f21758538c2d2c9a09 # Parent a997762fbaebbd39d577cb963377e83985435284 [gaim-migrate @ 6237] Added a multi-field request API. Haven't tested it yet, or written a UI implementation, so parts may change. committer: Tailor Script diff -r a997762fbaeb -r 11001789cb22 src/request.c --- a/src/request.c Sun Jun 08 03:48:06 2003 +0000 +++ b/src/request.c Sun Jun 08 04:06:21 2003 +0000 @@ -34,6 +34,501 @@ } GaimRequestInfo; +GaimRequestFields * +gaim_request_fields_new(void) +{ + GaimRequestFields *fields; + + fields = g_new0(GaimRequestFields, 1); + + fields->fields = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, NULL); + + return fields; +} + +void +gaim_request_fields_destroy(GaimRequestFields *fields) +{ + GList *l; + GaimRequestFieldGroup *group; + + g_return_if_fail(fields != NULL); + + for (l = fields->groups; l != NULL; l = l->next) { + group = l->data; + + gaim_request_field_group_destroy(group); + } + + g_list_free(fields->groups); + + g_hash_table_destroy(fields->fields); + + g_free(fields); +} + +void +gaim_request_fields_add_group(GaimRequestFields *fields, + GaimRequestFieldGroup *group) +{ + GList *l; + GaimRequestField *field; + + g_return_if_fail(fields != NULL); + g_return_if_fail(group != NULL); + + fields->groups = g_list_append(fields->groups, group); + + group->fields_list = fields; + + for (l = gaim_request_field_group_get_fields(group); + l != NULL; + l = l->next) { + + field = l->data; + + g_hash_table_insert(fields->fields, + g_strdup(gaim_request_field_get_id(field)), field); + } +} + +GList * +gaim_request_fields_get_groups(const GaimRequestFields *fields) +{ + g_return_val_if_fail(fields != NULL, NULL); + + return fields->groups; +} + +GaimRequestField * +gaim_request_fields_get_field(const GaimRequestFields *fields, const char *id) +{ + GaimRequestField *field; + + g_return_val_if_fail(fields != NULL, NULL); + g_return_val_if_fail(id != NULL, NULL); + + field = g_hash_table_lookup(fields->fields, id); + + g_return_val_if_fail(field != NULL, NULL); + + return field; +} + +const char * +gaim_request_fields_get_string(const GaimRequestFields *fields, const char *id) +{ + GaimRequestField *field; + + g_return_val_if_fail(fields != NULL, NULL); + g_return_val_if_fail(id != NULL, NULL); + + if ((field = gaim_request_fields_get_field(fields, id)) == NULL) + return NULL; + + return gaim_request_field_string_get_value(field); +} + +int +gaim_request_fields_get_integer(const GaimRequestFields *fields, + const char *id) +{ + GaimRequestField *field; + + g_return_val_if_fail(fields != NULL, 0); + g_return_val_if_fail(id != NULL, 0); + + if ((field = gaim_request_fields_get_field(fields, id)) == NULL) + return 0; + + return gaim_request_field_int_get_value(field); +} + +gboolean +gaim_request_fields_get_bool(const GaimRequestFields *fields, const char *id) +{ + GaimRequestField *field; + + g_return_val_if_fail(fields != NULL, FALSE); + g_return_val_if_fail(id != NULL, FALSE); + + if ((field = gaim_request_fields_get_field(fields, id)) == NULL) + return FALSE; + + return gaim_request_field_bool_get_value(field); +} + +int +gaim_request_fields_get_choice(const GaimRequestFields *fields, const char *id) +{ + GaimRequestField *field; + + g_return_val_if_fail(fields != NULL, -1); + g_return_val_if_fail(id != NULL, -1); + + if ((field = gaim_request_fields_get_field(fields, id)) == NULL) + return -1; + + return gaim_request_field_choice_get_value(field); +} + +GaimRequestFieldGroup * +gaim_request_field_group_new(const char *title) +{ + GaimRequestFieldGroup *group; + + group = g_new0(GaimRequestFieldGroup, 1); + + if (title != NULL) + group->title = g_strdup(title); + + return group; +} + +void +gaim_request_field_group_destroy(GaimRequestFieldGroup *group) +{ + GaimRequestField *field; + GList *l; + + g_return_if_fail(group != NULL); + + if (group->title != NULL) + g_free(group->title); + + for (l = group->fields; l != NULL; l = l->next) { + field = l->data; + + gaim_request_field_destroy(field); + } + + g_list_free(group->fields); + + g_free(group); +} + +void +gaim_request_field_group_add_field(GaimRequestFieldGroup *group, + GaimRequestField *field) +{ + g_return_if_fail(group != NULL); + g_return_if_fail(field != NULL); + + group->fields = g_list_append(group->fields, field); + + if (group->fields_list != NULL) { + g_hash_table_insert(group->fields_list->fields, + g_strdup(gaim_request_field_get_id(field)), field); + } +} + +const char * +gaim_request_field_group_get_title(const GaimRequestFieldGroup *group) +{ + g_return_val_if_fail(group != NULL, NULL); + + return group->title; +} + +GList * +gaim_request_field_group_get_fields(const GaimRequestFieldGroup *group) +{ + g_return_val_if_fail(group != NULL, NULL); + + return group->fields; +} + +GaimRequestField * +gaim_request_field_new(const char *id, const char *text, + GaimRequestFieldType type) +{ + GaimRequestField *field; + + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(type != GAIM_REQUEST_FIELD_NONE, NULL); + + field = g_new0(GaimRequestField, 1); + + field->id = g_strdup(id); + field->type = type; + + gaim_request_field_set_label(field, text); + + return field; +} + +void +gaim_request_field_destroy(GaimRequestField *field) +{ + g_return_if_fail(field != NULL); + + if (field->id != NULL) + g_free(field->id); + + if (field->label != NULL) + g_free(field->label); + + if (field->type == GAIM_REQUEST_FIELD_STRING) { + if (field->u.string.default_value != NULL) + g_free(field->u.string.default_value); + + if (field->u.string.value != NULL) + g_free(field->u.string.value); + } + else if (field->type == GAIM_REQUEST_FIELD_CHOICE) { + GList *l; + + for (l = field->u.choice.labels; l != NULL; l = l->next) { + g_free(l->data); + } + + if (field->u.choice.labels != NULL) + g_list_free(field->u.choice.labels); + } + + g_free(field); +} + +void +gaim_request_field_set_label(GaimRequestField *field, const char *label) +{ + g_return_if_fail(field != NULL); + + if (field->label != NULL) + g_free(field->label); + + field->label = (label == NULL ? NULL : g_strdup(label)); +} + +GaimRequestFieldType +gaim_request_field_get_type(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, GAIM_REQUEST_FIELD_NONE); + + return field->type; +} + +const char * +gaim_request_field_get_id(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, NULL); + + return field->id; +} + +const char * +gaim_request_field_get_label(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, NULL); + + return field->label; +} + +GaimRequestField * +gaim_request_field_string_new(const char *id, const char *text, + const char *default_value, gboolean multiline) +{ + GaimRequestField *field; + + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + + field = gaim_request_field_new(id, text, GAIM_REQUEST_FIELD_STRING); + + field->u.string.multiline = multiline; + + gaim_request_field_string_set_default_value(field, default_value); + + return field; +} + +void +gaim_request_field_string_set_default_value(GaimRequestField *field, + const char *default_value) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == GAIM_REQUEST_FIELD_STRING); + + if (field->u.string.default_value != NULL) + g_free(field->u.string.default_value); + + field->u.string.default_value = (default_value == NULL + ? NULL : g_strdup(default_value)); +} + +const char * +gaim_request_field_string_get_default_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_STRING, NULL); + + return field->u.string.default_value; +} + +const char * +gaim_request_field_string_get_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_STRING, NULL); + + return field->u.string.value; +} + +gboolean +gaim_request_field_string_is_multiline(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_STRING, FALSE); + + return field->u.string.multiline; +} + +GaimRequestField * +gaim_request_field_int_new(const char *id, const char *text, + int default_value) +{ + GaimRequestField *field; + + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + + field = gaim_request_field_new(id, text, GAIM_REQUEST_FIELD_INTEGER); + + gaim_request_field_int_set_default_value(field, default_value); + + return field; +} + +void +gaim_request_field_int_set_default_value(GaimRequestField *field, + int default_value) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == GAIM_REQUEST_FIELD_INTEGER); + + field->u.integer.default_value = default_value; +} + +int +gaim_request_field_int_get_default_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_INTEGER, 0); + + return field->u.integer.default_value; +} + +int +gaim_request_field_int_get_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, 0); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_INTEGER, 0); + + return field->u.integer.value; +} + +GaimRequestField * +gaim_request_field_bool_new(const char *id, const char *text, + gboolean default_value) +{ + GaimRequestField *field; + + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + + field = gaim_request_field_new(id, text, GAIM_REQUEST_FIELD_BOOLEAN); + + gaim_request_field_bool_set_default_value(field, default_value); + + return field; +} + +void +gaim_request_field_bool_set_default_value(GaimRequestField *field, + gboolean default_value) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == GAIM_REQUEST_FIELD_BOOLEAN); + + field->u.boolean.default_value = default_value; +} + +gboolean +gaim_request_field_bool_get_default_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_BOOLEAN, FALSE); + + return field->u.boolean.default_value; +} + +gboolean +gaim_request_field_bool_get_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_BOOLEAN, FALSE); + + return field->u.boolean.value; +} + +GaimRequestField * +gaim_request_field_choice_new(const char *id, const char *text, + int default_value) +{ + GaimRequestField *field; + + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + + field = gaim_request_field_new(id, text, GAIM_REQUEST_FIELD_CHOICE); + + gaim_request_field_choice_set_default_value(field, default_value); + + return field; +} + +void +gaim_request_field_choice_add(GaimRequestField *field, const char *label) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(label != NULL); + g_return_if_fail(field->type == GAIM_REQUEST_FIELD_CHOICE); + + field->u.choice.labels = g_list_append(field->u.choice.labels, + g_strdup(label)); +} + +void +gaim_request_field_choice_set_default_value(GaimRequestField *field, + int default_value) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == GAIM_REQUEST_FIELD_CHOICE); + + field->u.choice.default_value = default_value; +} + +int +gaim_request_field_choice_get_default_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, -1); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_CHOICE, -1); + + return field->u.choice.default_value; +} + +int +gaim_request_field_choice_get_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, -1); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_CHOICE, -1); + + return field->u.choice.value; +} + +/* -- */ + void * gaim_request_input(void *handle, const char *title, const char *primary, const char *secondary, const char *default_value, @@ -185,6 +680,40 @@ return NULL; } +void * +gaim_request_fields(void *handle, const char *title, const char *primary, + const char *secondary, GaimRequestFields *fields, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + void *user_data) +{ + GaimRequestUiOps *ops; + + g_return_val_if_fail(fields != NULL, NULL); + g_return_val_if_fail(ok_text != NULL, NULL); + g_return_val_if_fail(ok_cb != NULL, NULL); + + ops = gaim_get_request_ui_ops(); + + if (ops != NULL && ops->request_fields != NULL) { + GaimRequestInfo *info; + + info = g_new0(GaimRequestInfo, 1); + info->type = GAIM_REQUEST_FIELDS; + info->handle = handle; + info->ui_handle = ops->request_fields(title, primary, secondary, + fields, ok_text, ok_cb, + cancel_text, cancel_cb, + user_data); + + handles = g_list_append(handles, info); + + return info->ui_handle; + } + + return NULL; +} + void gaim_request_close(GaimRequestType type, void *ui_handle) { diff -r a997762fbaeb -r 11001789cb22 src/request.h --- a/src/request.h Sun Jun 08 03:48:06 2003 +0000 +++ b/src/request.h Sun Jun 08 04:06:21 2003 +0000 @@ -34,11 +34,96 @@ { GAIM_REQUEST_INPUT = 0, /**< Text input request. */ GAIM_REQUEST_CHOICE, /**< Multiple-choice request. */ - GAIM_REQUEST_ACTION /**< Action request. */ + GAIM_REQUEST_ACTION, /**< Action request. */ + GAIM_REQUEST_FIELDS /**< Multiple fields request. */ } GaimRequestType; /** + * A type of field. + */ +typedef enum +{ + GAIM_REQUEST_FIELD_NONE, + GAIM_REQUEST_FIELD_STRING, + GAIM_REQUEST_FIELD_INTEGER, + GAIM_REQUEST_FIELD_BOOLEAN, + GAIM_REQUEST_FIELD_CHOICE + +} GaimRequestFieldType; + +/** + * A request field. + */ +typedef struct +{ + GaimRequestFieldType type; + + char *id; + char *label; + + union + { + struct + { + gboolean multiline; + char *default_value; + char *value; + + } string; + + struct + { + int default_value; + int value; + + } integer; + + struct + { + gboolean default_value; + gboolean value; + + } boolean; + + struct + { + int default_value; + int value; + + GList *labels; + + } choice; + + } u; + +} GaimRequestField; + +/** + * Multiple fields request data. + */ +typedef struct +{ + GList *groups; + + GHashTable *fields; + +} GaimRequestFields; + +/** + * A group of fields with a title. + */ +typedef struct +{ + GaimRequestFields *fields_list; + + char *title; + + GList *fields; + +} GaimRequestFieldGroup; + +/** * Request UI operations. */ typedef struct @@ -59,6 +144,11 @@ const char *secondary, unsigned int default_action, void *user_data, size_t action_count, va_list actions); + void *(*request_fields)(const char *title, const char *primary, + const char *secondary, GaimRequestFields *fields, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + void *user_data); void (*close_request)(GaimRequestType type, void *ui_handle); @@ -66,6 +156,428 @@ typedef void (*GaimRequestInputCb)(void *, const char *); typedef void (*GaimRequestActionCb)(void *, int); +typedef void (*GaimRequestFieldsCb)(void *, GaimRequestFields *fields); + +/**************************************************************************/ +/** @name Field List API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a list of fields to pass to gaim_request_fields(). + * + * @return A GaimRequestFields structure. + */ +GaimRequestFields *gaim_request_fields_new(void); + +/** + * Destroys a list of fields. + * + * @param fields The list of fields to destroy. + */ +void gaim_request_fields_destroy(GaimRequestFields *fields); + +/** + * Adds a group of fields to the list. + * + * @param fields The fields list. + * @param group The group to add. + */ +void gaim_request_fields_add_group(GaimRequestFields *fields, + GaimRequestFieldGroup *group); + +/** + * Returns a list of all groups in a field list. + * + * @param fields The fields list. + * + * @return A list of groups. + */ +GList *gaim_request_fields_get_groups(const GaimRequestFields *fields); + +/** + * Return the field with the specified ID. + * + * @param fields The fields list. + * @param id The ID of the field. + * + * @return The field, if found. + */ +GaimRequestField *gaim_request_fields_get_field( + const GaimRequestFields *fields, const char *id); + +/** + * Returns the string value of a field with the specified ID. + * + * @param fields The fields list. + * @param id The ID of the field. + * + * @return The string value, if found, or @c NULL otherwise. + */ +const char *gaim_request_fields_get_string(const GaimRequestFields *fields, + const char *id); + +/** + * Returns the integer value of a field with the specified ID. + * + * @param fields The fields list. + * @param id The ID of the field. + * + * @return The integer value, if found, or 0 otherwise. + */ +int gaim_request_fields_get_integer(const GaimRequestFields *fields, + const char *id); + +/** + * Returns the boolean value of a field with the specified ID. + * + * @param fields The fields list. + * @param id The ID of the field. + * + * @return The boolean value, if found, or @c FALSE otherwise. + */ +gboolean gaim_request_fields_get_bool(const GaimRequestFields *fields, + const char *id); + +/** + * Returns the choice index of a field with the specified ID. + * + * @param fields The fields list. + * @param id The ID of the field. + * + * @return The choice index, if found, or -1 otherwise. + */ +int gaim_request_fields_get_choice(const GaimRequestFields *fields, + const char *id); + +/*@}*/ + +/**************************************************************************/ +/** @name Fields Group API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a fields group with an optional title. + * + * @param title The optional title to give the group. + * + * @return A new fields group + */ +GaimRequestFieldGroup *gaim_request_field_group_new(const char *title); + +/** + * Destroys a fields group. + * + * @param group The group to destroy. + */ +void gaim_request_field_group_destroy(GaimRequestFieldGroup *group); + +/** + * Adds a field to the group. + * + * @param group The group to add the field to. + * @param field The field to add to the group. + */ +void gaim_request_field_group_add_field(GaimRequestFieldGroup *group, + GaimRequestField *field); + +/** + * Returns the title of a fields group. + * + * @param group The group. + * + * @return The title, if set. + */ +const char *gaim_request_field_group_get_title( + const GaimRequestFieldGroup *group); + +/** + * Returns a list of all fields in a group. + * + * @param group The group. + * + * @return The list of fields in the group. + */ +GList *gaim_request_field_group_get_fields( + const GaimRequestFieldGroup *group); + +/*@}*/ + +/**************************************************************************/ +/** @name Field API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a field of the specified type. + * + * @param id The field ID. + * @param text The text label of the field. + * @param type The type of field. + * + * @return The new field. + */ +GaimRequestField *gaim_request_field_new(const char *id, const char *text, + GaimRequestFieldType type); + +/** + * Destroys a field. + * + * @param field The field to destroy. + */ +void gaim_request_field_destroy(GaimRequestField *field); + +/** + * Sets the label text of a field. + * + * @param field The field. + * @param label The text label. + */ +void gaim_request_field_set_label(GaimRequestField *field, const char *label); + +/** + * Returns the type of a field. + * + * @param field The field. + * + * @return The field's type. + */ +GaimRequestFieldType gaim_request_field_get_type(const GaimRequestField *field); + +/** + * Returns the ID of a field. + * + * @param field The field. + * + * @return The ID + */ +const char *gaim_request_field_get_id(const GaimRequestField *field); + +/** + * Returns the label text of a field. + * + * @param field The field. + * + * @return The label text. + */ +const char *gaim_request_field_get_label(const GaimRequestField *field); + +/*@}*/ + +/**************************************************************************/ +/** @name String Field API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a string request field. + * + * @param id The field ID. + * @param text The text label of the field. + * @param default_value The optional default value. + * @param multiline Whether or not this should be a multiline string. + * + * @return The new field. + */ +GaimRequestField *gaim_request_field_string_new(const char *id, + const char *text, + const char *default_value, + gboolean multiline); + +/** + * Sets the default value in a string field. + * + * @param field The field. + * @param value The default value. + */ +void gaim_request_field_string_set_default_value(GaimRequestField *field, + const char *default_value); + +/** + * Returns the default value in a string field. + * + * @param field The field. + * + * @return The default value. + */ +const char *gaim_request_field_string_get_default_value( + const GaimRequestField *field); + +/** + * Returns the user-entered value in a string field. + * + * @param field The field. + * + * @return The value. + */ +const char *gaim_request_field_string_get_value(const GaimRequestField *field); + +/** + * Returns whether or not a string field is multi-line. + * + * @param field The field. + * + * @return @c TRUE if the field is mulit-line, or @c FALSE otherwise. + */ +gboolean gaim_request_field_string_is_multiline(const GaimRequestField *field); + +/*@}*/ + +/**************************************************************************/ +/** @name Integer Field API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates an integer field. + * + * @param id The field ID. + * @param text The text label of the field. + * @param default_value The default value. + * + * @return The new field. + */ +GaimRequestField *gaim_request_field_int_new(const char *id, + const char *text, + int default_value); + +/** + * Sets the default value in an integer field. + * + * @param field The field. + * @param value The default value. + */ +void gaim_request_field_int_set_default_value(GaimRequestField *field, + int default_value); + +/** + * Returns the default value in an integer field. + * + * @param field The field. + * + * @return The default value. + */ +int gaim_request_field_int_get_default_value(const GaimRequestField *field); + +/** + * Returns the user-entered value in an integer field. + * + * @param field The field. + * + * @return The value. + */ +int gaim_request_field_int_get_value(const GaimRequestField *field); + +/*@}*/ + +/**************************************************************************/ +/** @name Boolean Field API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a boolean field. + * + * This is often represented as a checkbox. + * + * @param id The field ID. + * @param text The text label of the field. + * @param default_value The default value. + * + * @return The new field. + */ +GaimRequestField *gaim_request_field_bool_new(const char *id, + const char *text, + gboolean default_value); + +/** + * Sets the default value in an boolean field. + * + * @param field The field. + * @param value The default value. + */ +void gaim_request_field_bool_set_default_value(GaimRequestField *field, + gboolean default_value); + +/** + * Returns the default value in an boolean field. + * + * @param field The field. + * + * @return The default value. + */ +gboolean gaim_request_field_bool_get_default_value( + const GaimRequestField *field); + +/** + * Returns the user-entered value in an boolean field. + * + * @param field The field. + * + * @return The value. + */ +gboolean gaim_request_field_bool_get_value(const GaimRequestField *field); + +/*@}*/ + +/**************************************************************************/ +/** @name Choice Field API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a multiple choice field. + * + * This is often represented as a group of radio buttons. + * + * @param id The field ID. + * @param text The optional label of the field. + * @param default_value The default choice. + * + * @return The new field. + */ +GaimRequestField *gaim_request_field_choice_new(const char *id, + const char *text, + int default_value); + +/** + * Adds a choice to a multiple choice field. + * + * @param field The choice field. + * @param label The choice label. + */ +void gaim_request_field_choice_add(GaimRequestField *field, + const char *label); + +/** + * Sets the default value in an choice field. + * + * @param field The field. + * @param value The default value. + */ +void gaim_request_field_choice_set_default_value(GaimRequestField *field, + int default_value); + +/** + * Returns the default value in an choice field. + * + * @param field The field. + * + * @return The default value. + */ +int gaim_request_field_choice_get_default_value(const GaimRequestField *field); + +/** + * Returns the user-entered value in an choice field. + * + * @param field The field. + * + * @return The value. + */ +int gaim_request_field_choice_get_value(const GaimRequestField *field); + +/*@}*/ /**************************************************************************/ /** @name Request API */ @@ -191,6 +703,29 @@ va_list actions); /** + * Displays groups of fields for the user to fill in. + * + * @param handle The plugin or connection handle. + * @param title The title of the message. + * @param primary The main point of the message. + * @param secondary The secondary information. + * @param fields The list of fields. + * @param ok_text The text for the OK button. + * @param ok_cb The callback for the OK button. + * @param cancel_text The text for the cancel button. + * @param cancel_cb The callback for the cancel button. + * @param user_data The data to pass to the callback. + * + * @return A UI-specific handle. + */ +void *gaim_request_fields(void *handle, const char *title, + const char *primary, const char *secondary, + GaimRequestFields *fields, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + void *user_data); + +/** * Closes a request. * * This should be used only by the UI operation functions and part of the