changeset 5807:11001789cb22

[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 <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Sun, 08 Jun 2003 04:06:21 +0000
parents a997762fbaeb
children 133e86584f4b
files src/request.c src/request.h
diffstat 2 files changed, 1065 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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)
 {
--- 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