static struct dfui_response * response_construct_from_curses_form_single(const struct dfui_form *f, const struct curses_form *cf, const struct curses_widget *cw) { struct dfui_response *r = NULL; struct dfui_action *selected = NULL; struct dfui_dataset *ds = NULL; const char *id; const char *value; selected = cw->userdata; r = dfui_response_new(dfui_form_get_id(f), dfui_action_get_id(selected)); ds = dfui_dataset_new(); for (cw = cf->widget_head; cw != NULL; cw = cw->next) { if (cw->user_id > 0) { id = dfui_field_get_id((struct dfui_field *)cw->userdata); value = curses_widget_xlat_value(cw); dfui_dataset_celldata_add(ds, id, value); } } dfui_response_dataset_add(r, ds); return(r); }
struct dfui_response * dfui_decode_response(struct aura_buffer *e) { char *form_id; char *action_id; struct dfui_response *r; if (!aura_buffer_expect(e, "R{")) return(NULL); form_id = dfui_decode_string(e); action_id = dfui_decode_string(e); r = dfui_response_new(form_id, action_id); r->dataset_head = dfui_decode_datasets(e); free(form_id); free(action_id); aura_buffer_expect(e, "}"); return(r); }
static struct dfui_response * response_construct_from_curses_form_multiple(const struct dfui_form *f, const struct curses_form *cf, const struct curses_widget *cw) { struct dfui_response *r = NULL; struct dfui_action *selected = NULL; struct dfui_dataset *ds = NULL; const char *id; const char *value; int row = 0; int rows = 100; /* XXX obviously we'd prefer something more efficient here! */ int cds_added = 0; selected = cw->userdata; r = dfui_response_new(dfui_form_get_id(f), dfui_action_get_id(selected)); /* Create one dataset per row. */ for (row = 1; row < rows; row++) { ds = dfui_dataset_new(); cds_added = 0; for (cw = cf->widget_head; cw != NULL; cw = cw->next) { if (cw->user_id == row && (cw->type == CURSES_TEXTBOX || cw->type == CURSES_CHECKBOX)) { id = dfui_field_get_id((struct dfui_field *)cw->userdata); value = curses_widget_xlat_value(cw); dfui_dataset_celldata_add(ds, id, value); cds_added += 1; } } if (cds_added > 0) { dfui_response_dataset_add(r, ds); } else { dfui_dataset_free(ds); } } return(r); }