Mercurial > pidgin.yaz
diff src/request.c @ 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 | b7c0be69c749 |
children | 133e86584f4b |
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) {