Mercurial > pidgin
diff src/protocols/jabber/xdata.c @ 8135:8f4ce853e685
[gaim-migrate @ 8840]
created a convenience function, and used it. a lot.
committer: Tailor Script <tailor@pidgin.im>
| author | Nathan Walp <nwalp@pidgin.im> |
|---|---|
| date | Sat, 17 Jan 2004 19:36:29 +0000 |
| parents | c4b5a35c7a12 |
| children | bc850664b559 |
line wrap: on
line diff
--- a/src/protocols/jabber/xdata.c Sat Jan 17 19:21:39 2004 +0000 +++ b/src/protocols/jabber/xdata.c Sat Jan 17 19:36:29 2004 +0000 @@ -165,163 +165,157 @@ group = gaim_request_field_group_new(NULL); gaim_request_fields_add_group(fields, group); - for(fn = packet->child; fn; fn = fn->next) { - if(fn->type == NODE_TYPE_TAG && !strcmp(fn->name, "field")) { - xmlnode *valuenode; - const char *type = xmlnode_get_attrib(fn, "type"); - const char *label = xmlnode_get_attrib(fn, "label"); - const char *var = xmlnode_get_attrib(fn, "var"); - char *value = NULL; + for(fn = xmlnode_get_child(packet, "field"); fn; fn = xmlnode_get_next_twin(fn)) { + xmlnode *valuenode; + const char *type = xmlnode_get_attrib(fn, "type"); + const char *label = xmlnode_get_attrib(fn, "label"); + const char *var = xmlnode_get_attrib(fn, "var"); + char *value = NULL; + + if(!type) + continue; + + if(!var && strcmp(type, "fixed")) + continue; + if(!label) + label = var; + + if((valuenode = xmlnode_get_child(fn, "value"))) + value = xmlnode_get_data(valuenode); + + + /* XXX: handle <required/> */ + + if(!strcmp(type, "text-private")) { + if((valuenode = xmlnode_get_child(fn, "value"))) + value = xmlnode_get_data(valuenode); + + field = gaim_request_field_string_new(var, label, + value ? value : "", FALSE); + gaim_request_field_string_set_masked(field, TRUE); + gaim_request_field_group_add_field(group, field); + + g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_TEXT_SINGLE)); + + if(value) + g_free(value); + } else if(!strcmp(type, "text-multi") || !strcmp(type, "jid-multi")) { + GString *str = g_string_new(""); + + for(valuenode = xmlnode_get_child(fn, "value"); valuenode; + valuenode = xmlnode_get_next_twin(valuenode)) { + + if(!(value = xmlnode_get_data(valuenode))) + continue; + + g_string_append_printf(str, "%s\n", value); + g_free(value); + } + + field = gaim_request_field_string_new(var, label, + str->str, TRUE); + gaim_request_field_group_add_field(group, field); - if(!type) - continue; + g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_TEXT_MULTI)); + + g_string_free(str, TRUE); + } else if(!strcmp(type, "list-single") || !strcmp(type, "list-multi")) { + xmlnode *optnode; + GList *selected = NULL; + + field = gaim_request_field_list_new(var, label); + + if(!strcmp(type, "list-multi")) { + gaim_request_field_list_set_multi_select(field, TRUE); + g_hash_table_replace(data->fields, g_strdup(var), + GINT_TO_POINTER(JABBER_X_DATA_LIST_MULTI)); + } else { + g_hash_table_replace(data->fields, g_strdup(var), + GINT_TO_POINTER(JABBER_X_DATA_LIST_SINGLE)); + } + + for(valuenode = xmlnode_get_child(fn, "value"); valuenode; + valuenode = xmlnode_get_next_twin(valuenode)) { + selected = g_list_prepend(selected, xmlnode_get_data(valuenode)); + } - if(!var && strcmp(type, "fixed")) - continue; - if(!label) - label = var; + for(optnode = xmlnode_get_child(fn, "option"); optnode; + optnode = xmlnode_get_next_twin(optnode)) { + const char *lbl; + + if(!(valuenode = xmlnode_get_child(optnode, "value"))) + continue; + + if(!(value = xmlnode_get_data(valuenode))) + continue; + + if(!(lbl = xmlnode_get_attrib(optnode, "label"))) + label = value; + + data->values = g_slist_prepend(data->values, value); + + gaim_request_field_list_add(field, lbl, value); + if(g_list_find_custom(selected, value, (GCompareFunc)strcmp)) + gaim_request_field_list_add_selected(field, lbl); + } + gaim_request_field_group_add_field(group, field); + + while(selected) { + g_free(selected->data); + selected = g_list_delete_link(selected, selected); + } + + } else if(!strcmp(type, "boolean")) { + gboolean def = FALSE; if((valuenode = xmlnode_get_child(fn, "value"))) value = xmlnode_get_data(valuenode); - - /* XXX: handle <required/> */ - - if(!strcmp(type, "text-private")) { - if((valuenode = xmlnode_get_child(fn, "value"))) - value = xmlnode_get_data(valuenode); - - field = gaim_request_field_string_new(var, label, - value ? value : "", FALSE); - gaim_request_field_string_set_masked(field, TRUE); - gaim_request_field_group_add_field(group, field); - - g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_TEXT_SINGLE)); + if(value && (!strcasecmp(value, "yes") || + !strcasecmp(value, "true") || !strcasecmp(value, "1"))) + def = TRUE; - if(value) - g_free(value); - } else if(!strcmp(type, "text-multi") || !strcmp(type, "jid-multi")) { - GString *str = g_string_new(""); + field = gaim_request_field_bool_new(var, label, def); + gaim_request_field_group_add_field(group, field); - for(valuenode = fn->child; valuenode; valuenode = valuenode->next) { - if(valuenode->type != NODE_TYPE_TAG || strcmp(valuenode->name, "value")) - continue; - - if(!(value = xmlnode_get_data(valuenode))) - continue; - - g_string_append_printf(str, "%s\n", value); - g_free(value); - } + g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_BOOLEAN)); - field = gaim_request_field_string_new(var, label, - str->str, TRUE); - gaim_request_field_group_add_field(group, field); - - g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_TEXT_MULTI)); - - g_string_free(str, TRUE); - } else if(!strcmp(type, "list-single") || !strcmp(type, "list-multi")) { - xmlnode *optnode; - GList *selected = NULL; - - field = gaim_request_field_list_new(var, label); + if(value) + g_free(value); + } else if(!strcmp(type, "fixed") && value) { + if((valuenode = xmlnode_get_child(fn, "value"))) + value = xmlnode_get_data(valuenode); - if(!strcmp(type, "list-multi")) { - gaim_request_field_list_set_multi_select(field, TRUE); - g_hash_table_replace(data->fields, g_strdup(var), - GINT_TO_POINTER(JABBER_X_DATA_LIST_MULTI)); - } else { - g_hash_table_replace(data->fields, g_strdup(var), - GINT_TO_POINTER(JABBER_X_DATA_LIST_SINGLE)); - } - - for(valuenode = fn->child; valuenode; valuenode = valuenode->next) { - if(valuenode->type != NODE_TYPE_TAG || strcmp(valuenode->name, "value")) - continue; - selected = g_list_prepend(selected, xmlnode_get_data(valuenode)); - } - - for(optnode = fn->child; optnode; optnode = optnode->next) { - const char *lbl; - - if(optnode->type != NODE_TYPE_TAG || strcmp(optnode->name, "option")) - continue; - - if(!(valuenode = xmlnode_get_child(optnode, "value"))) - continue; + field = gaim_request_field_label_new("", value); + gaim_request_field_group_add_field(group, field); - if(!(value = xmlnode_get_data(valuenode))) - continue; - - if(!(lbl = xmlnode_get_attrib(optnode, "label"))) - label = value; - - data->values = g_slist_prepend(data->values, value); - - gaim_request_field_list_add(field, lbl, value); - if(g_list_find_custom(selected, value, (GCompareFunc)strcmp)) - gaim_request_field_list_add_selected(field, lbl); - } - gaim_request_field_group_add_field(group, field); + if(value) + g_free(value); + } else if(!strcmp(type, "hidden")) { + if((valuenode = xmlnode_get_child(fn, "value"))) + value = xmlnode_get_data(valuenode); - while(selected) { - g_free(selected->data); - selected = g_list_delete_link(selected, selected); - } - - } else if(!strcmp(type, "boolean")) { - gboolean def = FALSE; + field = gaim_request_field_string_new(var, "", value ? value : "", + FALSE); + gaim_request_field_set_visible(field, FALSE); + gaim_request_field_group_add_field(group, field); - if((valuenode = xmlnode_get_child(fn, "value"))) - value = xmlnode_get_data(valuenode); - - if(value && (!strcasecmp(value, "yes") || - !strcasecmp(value, "true") || !strcasecmp(value, "1"))) - def = TRUE; - - field = gaim_request_field_bool_new(var, label, def); - gaim_request_field_group_add_field(group, field); - - g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_BOOLEAN)); + g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_TEXT_SINGLE)); - if(value) - g_free(value); - } else if(!strcmp(type, "fixed") && value) { - if((valuenode = xmlnode_get_child(fn, "value"))) - value = xmlnode_get_data(valuenode); - - field = gaim_request_field_label_new("", value); - gaim_request_field_group_add_field(group, field); - - if(value) - g_free(value); - } else if(!strcmp(type, "hidden")) { - if((valuenode = xmlnode_get_child(fn, "value"))) - value = xmlnode_get_data(valuenode); + if(value) + g_free(value); + } else { /* text-single, jid-single, and the default */ + if((valuenode = xmlnode_get_child(fn, "value"))) + value = xmlnode_get_data(valuenode); - field = gaim_request_field_string_new(var, "", value ? value : "", - FALSE); - gaim_request_field_set_visible(field, FALSE); - gaim_request_field_group_add_field(group, field); - - g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_TEXT_SINGLE)); + field = gaim_request_field_string_new(var, label, + value ? value : "", FALSE); + gaim_request_field_group_add_field(group, field); - if(value) - g_free(value); - } else { /* text-single, jid-single, and the default */ - if((valuenode = xmlnode_get_child(fn, "value"))) - value = xmlnode_get_data(valuenode); + g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_TEXT_SINGLE)); - field = gaim_request_field_string_new(var, label, - value ? value : "", FALSE); - gaim_request_field_group_add_field(group, field); - - g_hash_table_replace(data->fields, g_strdup(var), GINT_TO_POINTER(JABBER_X_DATA_TEXT_SINGLE)); - - if(value) - g_free(value); - } + if(value) + g_free(value); } }
