int post_form(FORM *f) { int x, y, v; if (!f) return (E_BAD_ARGUMENT); if (Status(f, POSTED)) return (E_POSTED); if (!f->field) return (E_NOT_CONNECTED); getmaxyx(Sub(f), y, x); if (f->rows > y || f->cols > x) return (E_NO_ROOM); v = _set_form_page(f, P(f), C(f)); if (v != E_OK) return (v); Set(f, POSTED); init_form(f); init_field(f); (void) _update_current(f); return (E_OK); }
int set_form_page(FORM *f, int page) { if (!f || !ValidPage(f, page)) return (E_BAD_ARGUMENT); if (!Status(f, POSTED)) { P(f) = page; C(f) = _first_active(f); return (E_OK); } if (Status(f, DRIVER)) return (E_BAD_STATE); if (page != P(f)) { if (_validate(f)) { int v; term_field(f); term_form(f); v = _set_form_page(f, page, (FIELD *) 0); init_form(f); init_field(f); (void) _update_current(f); return (v); } else return (E_INVALID_FIELD); } return (E_OK); }
int set_current_field(FORM *f, FIELD *c) { if (!f || !c || c->form != f) return (E_BAD_ARGUMENT); if (!Opt(c, O_ACTIVE) || !Opt(c, O_VISIBLE)) return (E_REQUEST_DENIED); if (!Status(f, POSTED)) { C(f) = c; P(f) = c->page; return (E_OK); } if (Status(f, DRIVER)) return (E_BAD_STATE); if (c != C(f)) { if (_validate(f)) { int v; term_field(f); if (c -> page != P(f)) { /* page change */ term_form(f); v = _set_form_page(f, c->page, c); init_form(f); } else v = _set_current_field(f, c); init_field(f); (void) _update_current(f); return (v); } else return (E_INVALID_FIELD); } return (E_OK); }
void html_form(struct html_context *html_context, unsigned char *a, unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5) { unsigned char *al; struct form *form; html_context->was_br = 1; form = init_form(); if (!form) return; form->method = FORM_METHOD_GET; form->form_num = a - html_context->startf; al = get_attr_val(a, (unsigned char *)"method", html_context->doc_cp); if (al) { if (!c_strcasecmp((const char *)al, "post")) { unsigned char *enctype; enctype = get_attr_val(a, (unsigned char *)"enctype", html_context->doc_cp); form->method = FORM_METHOD_POST; if (enctype) { if (!c_strcasecmp((const char *)enctype, "multipart/form-data")) form->method = FORM_METHOD_POST_MP; else if (!c_strcasecmp((const char *)enctype, "text/plain")) form->method = FORM_METHOD_POST_TEXT_PLAIN; mem_free(enctype); } } mem_free(al); } form->onsubmit = get_attr_val(a, (unsigned char *)"onsubmit", html_context->doc_cp); al = get_attr_val(a, (unsigned char *)"name", html_context->doc_cp); if (al) form->name = al; al = get_attr_val(a, (unsigned char *)"action", html_context->doc_cp); /* The HTML specification at * http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.3 states * that the behavior of an empty action attribute should be undefined. * Mozilla handles action="" as action="<current-URI>" which seems * reasonable. (bug 615) */ if (al && *al) { form->action = join_urls(html_context->base_href, trim_chars(al, ' ', NULL)); mem_free(al); } else { enum uri_component components = URI_ORIGINAL; mem_free_if(al); /* We have to do following for GET method, because we would end * up with two '?' otherwise. */ if (form->method == FORM_METHOD_GET) components = URI_FORM_GET; form->action = get_uri_string(html_context->base_href, components); /* No action URI should contain post data */ assert(!form->action || !strchr((char *)form->action, POST_CHAR)); /* GET method URIs should not have '?'. */ assert(!form->action || form->method != FORM_METHOD_GET || !strchr((char *)form->action, '?')); } al = get_target(html_context->options, a); form->target = al ? al : stracpy(html_context->base_target); html_context->special_f(html_context, SP_FORM, form); }