From f1375fe19db064fcebf00433ce73eab99be038ef Mon Sep 17 00:00:00 2001 From: James Bursa Date: Sat, 25 Oct 2003 00:35:49 +0000 Subject: [project @ 2003-10-25 00:35:49 by bursa] Split out and clean up form submit code. svn path=/import/netsurf/; revision=374 --- desktop/browser.c | 159 ++++++++++-------------------------------------------- 1 file changed, 28 insertions(+), 131 deletions(-) (limited to 'desktop/browser.c') diff --git a/desktop/browser.c b/desktop/browser.c index 1eb881f1c..67a4670dc 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -21,6 +21,7 @@ #include "netsurf/desktop/browser.h" #include "netsurf/render/box.h" #include "netsurf/render/font.h" +#include "netsurf/render/form.h" #include "netsurf/render/layout.h" #include "netsurf/utils/log.h" #include "netsurf/utils/messages.h" @@ -41,14 +42,13 @@ static void browser_window_callback(content_msg msg, struct content *c, void *p1, void *p2, const char *error); static void download_window_callback(content_msg msg, struct content *c, void *p1, void *p2, const char *error); -static void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct gui_gadget* group); -static void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct gui_gadget* g, +static void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct form_control* group); +static void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct form_control* g, unsigned long x, unsigned long y); -static void browser_window_gadget_select(struct browser_window* bw, struct gui_gadget* g, int item); +static void browser_window_gadget_select(struct browser_window* bw, struct form_control* g, int item); static int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x, unsigned long click_y); -static void browser_form_submit(struct browser_window *bw, struct form *form); -static char* browser_form_construct_get(struct page_elements *elements, struct formsubmit* fs); -static void browser_form_get_append(char **s, int *length, char sep, char *name, char *value); +static void browser_form_submit(struct browser_window *bw, struct form *form, + struct form_control *submit_button); static void browser_window_textarea_click(struct browser_window* bw, unsigned long actual_x, unsigned long actual_y, long x, long y, @@ -370,8 +370,7 @@ void browser_window_callback(content_msg msg, struct content *c, break; case CONTENT_MSG_REFORMAT: - if (bw->current_content->status == CONTENT_STATUS_DONE) - browser_window_reformat(bw, 0); + browser_window_reformat(bw, 0); break; default: @@ -413,7 +412,7 @@ void download_window_callback(content_msg msg, struct content *c, } } -void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct gui_gadget* group) +void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct form_control* group) { struct box* c; if (box == NULL) @@ -440,7 +439,7 @@ void clear_radio_gadgets(struct browser_window* bw, struct box* box, struct gui_ clear_radio_gadgets(bw, c, group); } -void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct gui_gadget* g, +void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct form_control* g, unsigned long x, unsigned long y) { struct box* c; @@ -458,15 +457,15 @@ void gui_redraw_gadget2(struct browser_window* bw, struct box* box, struct gui_g gui_redraw_gadget2(bw, c, g, box->x + x, box->y + y); } -void gui_redraw_gadget(struct browser_window* bw, struct gui_gadget* g) +void gui_redraw_gadget(struct browser_window* bw, struct form_control* g) { assert(bw->current_content->type == CONTENT_HTML); gui_redraw_gadget2(bw, bw->current_content->data.html.layout->children, g, 0, 0); } -void browser_window_gadget_select(struct browser_window* bw, struct gui_gadget* g, int item) +void browser_window_gadget_select(struct browser_window* bw, struct form_control* g, int item) { - struct formoption* o; + struct form_option* o; int count; struct box *inline_box = g->box->children->children; int x, y; @@ -533,7 +532,7 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x if (click_boxes[i].box->gadget) { - struct gui_gadget* g = click_boxes[i].box->gadget; + struct form_control* g = click_boxes[i].box->gadget; /* gadget clicked */ switch (g->type) @@ -551,7 +550,7 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x gui_redraw_gadget(bw, g); break; case GADGET_SUBMIT: - browser_form_submit(bw, g->form); + browser_form_submit(bw, g->form, g); break; case GADGET_TEXTAREA: browser_window_textarea_click(bw, @@ -576,7 +575,7 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x box_coords(click_boxes[i].box, &x, &y); g->data.image.mx = click_x - x; g->data.image.my = click_y - y; - browser_form_submit(bw, g->form); + browser_form_submit(bw, g->form, g); break; } @@ -1068,7 +1067,7 @@ void browser_window_input_callback(struct browser_window *bw, char key, void *p) char_offset--; } else if (key == 10 || key == 13) { /* Return/Enter hit */ - browser_form_submit(bw, form); + browser_form_submit(bw, form, 0); /*TODO: remove caret from new page */ } else if (key == 9) { /* Tab */ @@ -1570,31 +1569,28 @@ void browser_window_redraw_boxes(struct browser_window* bw, struct box_position* } -void browser_form_submit(struct browser_window *bw, struct form *form) +void browser_form_submit(struct browser_window *bw, struct form *form, + struct form_control *submit_button) { - /*create submission request*/ - struct formsubmit* fs = (struct formsubmit*) xcalloc(1, sizeof(struct formsubmit)); - fs->form = form; - /*fs->items = g;*/ - LOG(("Submission request created")); + struct form_successful_control *success; - if (fs->form->method == method_GET) { + success = form_successful_controls(form, submit_button); + + if (form->method == method_GET) { /*GET request*/ /*GET basically munges the entire form data into one URL. */ - char *url = browser_form_construct_get(&bw->current_content->data.html.elements, - fs); - - LOG(("GET request")); - - /*send request*/ + char *data = form_url_encode(success); + char *url = xcalloc(1, strlen(form->action) + strlen(data) + 2); + sprintf(url, "%s?%s", form->action, data); + free(data); browser_window_open_location(bw, url); xfree(url); } else { /*POST request*/ - assert(fs->form->method == method_POST); + assert(form->method == method_POST); LOG(("POST request - not implemented yet")); @@ -1604,104 +1600,5 @@ void browser_form_submit(struct browser_window *bw, struct form *form) body.*/ } - xfree(fs); -} - - -char* browser_form_construct_get(struct page_elements *elements, struct formsubmit* fs) -{ - char *ret; - int i,j, length; - struct formoption* opt; - - ret = xstrdup(fs->form->action); - length = strlen(ret); - - j=0; - for (i=0;inumGadgets;i++){ - if(elements->gadgets[i]->form == fs->form){ - - if(elements->gadgets[i]->name != 0){ - char *value = 0; - - switch(elements->gadgets[i]->type){ - - case GADGET_HIDDEN: value = elements->gadgets[i]->data.hidden.value; - break; - case GADGET_TEXTBOX: value = elements->gadgets[i]->value; - break; - case GADGET_PASSWORD: value = elements->gadgets[i]->value; - break; - case GADGET_RADIO: if(elements->gadgets[i]->data.radio.selected == -1) - value = elements->gadgets[i]->data.radio.value; - break; - case GADGET_CHECKBOX: if(elements->gadgets[i]->data.checkbox.selected == 1) - value = elements->gadgets[i]->data.checkbox.value; - break; - case GADGET_SELECT: opt = elements->gadgets[i]->data.select.items; - while(opt != NULL){ - if(opt->selected == -1 || opt->selected == 1) { - browser_form_get_append(&ret, &length, j == 0 ? '?' : '&', - elements->gadgets[i]->name, opt->value); - j++; - } - opt = opt->next; - } - break; - case GADGET_TEXTAREA: /* TODO */ - break; - case GADGET_IMAGE: sprintf(elements->gadgets[i]->data.image.name, - "%s.x", - elements->gadgets[i]->data.image.n); - sprintf(elements->gadgets[i]->data.image.value, - "%d", - elements->gadgets[i]->data.image.mx); - browser_form_get_append(&ret, &length, - j == 0 ? '?' : '&', - elements->gadgets[i]->data.image.name, - elements->gadgets[i]->data.image.value); - sprintf(elements->gadgets[i]->data.image.name, - "%s.y", - elements->gadgets[i]->data.image.n); - sprintf(elements->gadgets[i]->data.image.value, - "%d", - elements->gadgets[i]->data.image.my); - browser_form_get_append(&ret, &length, - j == 0 ? '?' : '&', - elements->gadgets[i]->data.image.name, - elements->gadgets[i]->data.image.value); - j++; - break; - default: break; - } - - if (value != 0) { - browser_form_get_append(&ret, &length, j == 0 ? '?' : '&', - elements->gadgets[i]->name, value); - j++; - } - } - - } - } - return ret; -} - - -void browser_form_get_append(char **s, int *length, char sep, char *name, char *value) -{ - unsigned int length1; - - name = curl_escape(name, 0); - value = curl_escape(value, 0); - length1 = 2 + strlen(name) + strlen(value); - - LOG(("append %c%s=%s, length1 %i, *s %p", sep, name, value, length1, *s)); - *s = xrealloc(*s, *length + length1 + 1); - - sprintf(*s + *length, "%c%s=%s", sep, name, value); - *length += length1; - - curl_free(name); - curl_free(value); + form_free_successful(success); } -- cgit v1.2.3