Added support for <input type='hidden'>.

Hidden form fields are aded to the page attribute buffer like text form fields so there's no need for special treatment in formsubmit(). However they are not added as widgets to the window so there's no user interaction.
This commit is contained in:
Oliver Schmidt 2013-03-13 10:50:11 +01:00
parent c7b8bac006
commit 66fa843389
6 changed files with 63 additions and 49 deletions

View file

@ -32,4 +32,5 @@ html_action "action\0"
html_name "name\0" html_name "name\0"
html_text "text\0" html_text "text\0"
html_size "size\0" html_size "size\0"
html_image "image\0" html_image "image\0"
html_hidden "hidden\0"

View file

@ -103,3 +103,6 @@ const char html_size[6] =
const char html_image[7] = const char html_image[7] =
/* "image\0" */ /* "image\0" */
{0x69, 0x6d, 0x61, 0x67, 0x65, 00, }; {0x69, 0x6d, 0x61, 0x67, 0x65, 00, };
const char html_hidden[8] =
/* "hidden\0" */
{0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 00, };

View file

@ -33,3 +33,4 @@ extern const char html_name[6];
extern const char html_text[6]; extern const char html_text[6];
extern const char html_size[6]; extern const char html_size[6];
extern const char html_image[7]; extern const char html_image[7];
extern const char html_hidden[8];

View file

@ -149,20 +149,20 @@ struct htmlparser_state {
unsigned char tagptr; unsigned char tagptr;
char tagattr[20]; char tagattr[20];
unsigned char tagattrptr; unsigned char tagattrptr;
char tagattrparam[WWW_CONF_MAX_URLLEN]; char tagattrparam[WWW_CONF_MAX_URLLEN + 1];
unsigned char tagattrparamptr; unsigned char tagattrparamptr;
unsigned char lastchar, quotechar; unsigned char lastchar, quotechar;
unsigned char majorstate, lastmajorstate; unsigned char majorstate, lastmajorstate;
char linkurl[WWW_CONF_MAX_URLLEN]; char linkurl[WWW_CONF_MAX_URLLEN + 1];
char word[WWW_CONF_WEBPAGE_WIDTH]; char word[WWW_CONF_WEBPAGE_WIDTH];
unsigned char wordlen; unsigned char wordlen;
#if WWW_CONF_FORMS #if WWW_CONF_FORMS
char formaction[WWW_CONF_MAX_FORMACTIONLEN]; char formaction[WWW_CONF_MAX_FORMACTIONLEN + 1];
unsigned char inputtype; unsigned char inputtype;
char inputname[WWW_CONF_MAX_INPUTNAMELEN]; char inputname[WWW_CONF_MAX_INPUTNAMELEN + 1];
char inputvalue[WWW_CONF_MAX_INPUTVALUELEN]; char inputvalue[WWW_CONF_MAX_INPUTVALUELEN + 1];
unsigned char inputvaluesize; unsigned char inputvaluesize;
#endif /* WWW_CONF_FORMS */ #endif /* WWW_CONF_FORMS */
}; };
@ -241,7 +241,10 @@ static void
init_input(void) init_input(void)
{ {
s.inputtype = HTMLPARSER_INPUTTYPE_NONE; s.inputtype = HTMLPARSER_INPUTTYPE_NONE;
s.inputname[0] = s.inputvalue[0] = 0; s.inputname[0] = s.inputvalue[0] =
s.formaction[WWW_CONF_MAX_FORMACTIONLEN] =
s.inputname[WWW_CONF_MAX_INPUTNAMELEN] =
s.inputvalue[WWW_CONF_MAX_INPUTVALUELEN] = 0;
s.inputvaluesize = 20; /* De facto default size */ s.inputvaluesize = 20; /* De facto default size */
} }
#endif /* WWW_CONF_FORMS */ #endif /* WWW_CONF_FORMS */
@ -474,8 +477,8 @@ parse_tag(void)
switch(s.inputtype) { switch(s.inputtype) {
case HTMLPARSER_INPUTTYPE_NONE: case HTMLPARSER_INPUTTYPE_NONE:
case HTMLPARSER_INPUTTYPE_TEXT: case HTMLPARSER_INPUTTYPE_TEXT:
s.inputvalue[s.inputvaluesize] = 0; case HTMLPARSER_INPUTTYPE_HIDDEN:
htmlparser_inputfield(s.inputvaluesize, s.inputvalue, s.inputname); htmlparser_inputfield(s.inputtype, s.inputvaluesize, s.inputvalue, s.inputname);
break; break;
case HTMLPARSER_INPUTTYPE_SUBMIT: case HTMLPARSER_INPUTTYPE_SUBMIT:
case HTMLPARSER_INPUTTYPE_IMAGE: case HTMLPARSER_INPUTTYPE_IMAGE:
@ -492,14 +495,16 @@ parse_tag(void)
s.inputtype = HTMLPARSER_INPUTTYPE_IMAGE; s.inputtype = HTMLPARSER_INPUTTYPE_IMAGE;
} else if(strncmp(s.tagattrparam, html_text, sizeof(html_text)) == 0) { } else if(strncmp(s.tagattrparam, html_text, sizeof(html_text)) == 0) {
s.inputtype = HTMLPARSER_INPUTTYPE_TEXT; s.inputtype = HTMLPARSER_INPUTTYPE_TEXT;
} else if(strncmp(s.tagattrparam, html_hidden, sizeof(html_hidden)) == 0) {
s.inputtype = HTMLPARSER_INPUTTYPE_HIDDEN;
} else { } else {
s.inputtype = HTMLPARSER_INPUTTYPE_OTHER; s.inputtype = HTMLPARSER_INPUTTYPE_OTHER;
} }
} else if(strncmp(s.tagattr, html_name, sizeof(html_name)) == 0) { } else if(strncmp(s.tagattr, html_name, sizeof(html_name)) == 0) {
strncpy(s.inputname, s.tagattrparam, WWW_CONF_MAX_INPUTNAMELEN); strncpy(s.inputname, s.tagattrparam, WWW_CONF_MAX_INPUTNAMELEN);
} else if(strncmp(s.tagattr, html_alt, sizeof(html_alt)) == 0 && } else if(strncmp(s.tagattr, html_alt, sizeof(html_alt)) == 0 &&
s.inputtype == HTMLPARSER_INPUTTYPE_IMAGE) { s.inputtype == HTMLPARSER_INPUTTYPE_IMAGE) {
strncpy(s.inputvalue, s.tagattrparam, WWW_CONF_MAX_INPUTVALUELEN); strncpy(s.inputvalue, s.tagattrparam, WWW_CONF_MAX_INPUTVALUELEN);
} else if(strncmp(s.tagattr, html_value, sizeof(html_value)) == 0) { } else if(strncmp(s.tagattr, html_value, sizeof(html_value)) == 0) {
strncpy(s.inputvalue, s.tagattrparam, WWW_CONF_MAX_INPUTVALUELEN); strncpy(s.inputvalue, s.tagattrparam, WWW_CONF_MAX_INPUTVALUELEN);
} else if(strncmp(s.tagattr, html_size, sizeof(html_size)) == 0) { } else if(strncmp(s.tagattr, html_size, sizeof(html_size)) == 0) {

View file

@ -41,19 +41,20 @@ void htmlparser_link(char *text, unsigned char textlen, char *url);
void htmlparser_form(char *action); void htmlparser_form(char *action);
void htmlparser_submitbutton(char *value, void htmlparser_submitbutton(char *value,
char *name); char *name);
void htmlparser_inputfield(unsigned char size, void htmlparser_inputfield(unsigned char type,
unsigned char size,
char *value, char *value,
char *name); char *name);
void htmlparser_newline(void); void htmlparser_newline(void);
void htmlparser_word(char *word, unsigned char wordlen); void htmlparser_word(char *word, unsigned char wordlen);
#define HTMLPARSER_INPUTTYPE_NONE 0 #define HTMLPARSER_INPUTTYPE_NONE 0
#define HTMLPARSER_INPUTTYPE_TEXT 1 #define HTMLPARSER_INPUTTYPE_TEXT 1
#define HTMLPARSER_INPUTTYPE_PASSWORD 2 #define HTMLPARSER_INPUTTYPE_HIDDEN 2
#define HTMLPARSER_INPUTTYPE_SUBMIT 3 #define HTMLPARSER_INPUTTYPE_SUBMIT 3
#define HTMLPARSER_INPUTTYPE_IMAGE 4 #define HTMLPARSER_INPUTTYPE_IMAGE 4
#define HTMLPARSER_INPUTTYPE_OTHER 5 #define HTMLPARSER_INPUTTYPE_OTHER 5
/* Functions. */ /* Functions. */

View file

@ -684,7 +684,7 @@ webclient_datahandler(char *data, uint16_t len)
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
static void CC_FASTCALL static void CC_FASTCALL
add_pagewidget(char *text, unsigned char textlen, char *attrib, unsigned char type, add_pagewidget(char *text, unsigned char size, char *attrib, unsigned char type,
unsigned char border) unsigned char border)
{ {
char *wptr; char *wptr;
@ -694,16 +694,13 @@ add_pagewidget(char *text, unsigned char textlen, char *attrib, unsigned char ty
return; return;
} }
if(textlen + border == 0) { maxwidth = size ? WWW_CONF_WEBPAGE_WIDTH - (1 + 2 * border)
return; : WWW_CONF_WEBPAGE_WIDTH;
}
maxwidth = WWW_CONF_WEBPAGE_WIDTH - (1 + 2 * border);
/* If the text of the link is too long so that it does not fit into /* If the text of the link is too long so that it does not fit into
the width of the current window, counting from the current x the width of the current window, counting from the current x
coordinate, we first try to jump to the next line. */ coordinate, we first try to jump to the next line. */
if(textlen + x > maxwidth) { if(size + x > maxwidth) {
htmlparser_newline(); htmlparser_newline();
if(!loading) { if(!loading) {
return; return;
@ -714,9 +711,9 @@ add_pagewidget(char *text, unsigned char textlen, char *attrib, unsigned char ty
XXX: this is not really the right thing to do, we should probably XXX: this is not really the right thing to do, we should probably
either make a link into a multiline link, or add multiple either make a link into a multiline link, or add multiple
buttons. But this will do for now. */ buttons. But this will do for now. */
if(textlen > maxwidth) { if(size > maxwidth) {
text[maxwidth] = 0; text[maxwidth] = 0;
textlen = maxwidth; size = maxwidth;
} }
if(firsty == pagey) { if(firsty == pagey) {
@ -727,17 +724,16 @@ add_pagewidget(char *text, unsigned char textlen, char *attrib, unsigned char ty
drawing area and reference it from there. */ drawing area and reference it from there. */
wptr[0] = 0; wptr[0] = 0;
wptr += border; wptr += border;
memcpy(wptr, text, textlen); memcpy(wptr, text, size);
wptr[textlen] = 0; wptr[size] = 0;
wptr[textlen + border] = ' '; wptr[size + border] = ' ';
switch(type) { switch(type) {
case CTK_WIDGET_HYPERLINK: { case CTK_WIDGET_HYPERLINK: {
struct linkattrib *linkptr; struct linkattrib *linkptr =
(struct linkattrib *)add_pageattrib(sizeof(struct linkattrib) /* incl 1 attrib char */ + attriblen);
linkptr = (struct linkattrib *)add_pageattrib(sizeof(struct linkattrib) /* incl 1 attrib char */ + attriblen);
if(linkptr != NULL) { if(linkptr != NULL) {
CTK_HYPERLINK_NEW(&linkptr->hyperlink, x, y + 3, textlen, wptr, linkptr->url); CTK_HYPERLINK_NEW(&linkptr->hyperlink, x, y + 3, size, wptr, linkptr->url);
strcpy(linkptr->url, attrib); strcpy(linkptr->url, attrib);
CTK_WIDGET_SET_FLAG(&linkptr->hyperlink, CTK_WIDGET_FLAG_MONOSPACE); CTK_WIDGET_SET_FLAG(&linkptr->hyperlink, CTK_WIDGET_FLAG_MONOSPACE);
CTK_WIDGET_ADD(&mainwindow, &linkptr->hyperlink); CTK_WIDGET_ADD(&mainwindow, &linkptr->hyperlink);
@ -746,11 +742,10 @@ add_pagewidget(char *text, unsigned char textlen, char *attrib, unsigned char ty
} }
#if WWW_CONF_FORMS #if WWW_CONF_FORMS
case CTK_WIDGET_BUTTON: { case CTK_WIDGET_BUTTON: {
struct submitattrib *submitptr; struct submitattrib *submitptr =
(struct submitattrib *)add_pageattrib(sizeof(struct submitattrib) /* incl 1 attrib char */ + attriblen);
submitptr = (struct submitattrib *)add_pageattrib(sizeof(struct submitattrib) /* incl 1 attrib char */ + attriblen);
if(submitptr != NULL) { if(submitptr != NULL) {
CTK_BUTTON_NEW((struct ctk_button *)&submitptr->button, x, y + 3, textlen, wptr); CTK_BUTTON_NEW((struct ctk_button *)&submitptr->button, x, y + 3, size, wptr);
add_forminput((struct inputattrib *)submitptr); add_forminput((struct inputattrib *)submitptr);
submitptr->formptr = formptr; submitptr->formptr = formptr;
strcpy(submitptr->name, attrib); strcpy(submitptr->name, attrib);
@ -760,18 +755,20 @@ add_pagewidget(char *text, unsigned char textlen, char *attrib, unsigned char ty
break; break;
} }
case CTK_WIDGET_TEXTENTRY: { case CTK_WIDGET_TEXTENTRY: {
struct textattrib *textptr; struct textattrib *textptr =
(struct textattrib *)add_pageattrib(sizeof(struct textattrib) /* incl 1 attrib char */ + attriblen
textptr = (struct textattrib *)add_pageattrib(sizeof(struct textattrib) /* incl 1 attrib char */ + attriblen + WWW_CONF_MAX_INPUTVALUELEN); + (size ? WWW_CONF_MAX_INPUTVALUELEN : strlen(text)) + 1);
if(textptr != NULL) { if(textptr != NULL) {
CTK_TEXTENTRY_NEW((struct ctk_textentry *)&textptr->textentry, x, y + 3, textlen, 1, CTK_TEXTENTRY_NEW((struct ctk_textentry *)&textptr->textentry, x, y + 3, size, 1,
textptr->name + attriblen + 1, WWW_CONF_MAX_INPUTVALUELEN); textptr->name + attriblen + 1, WWW_CONF_MAX_INPUTVALUELEN);
add_forminput((struct inputattrib *)textptr); add_forminput((struct inputattrib *)textptr);
textptr->formptr = formptr; textptr->formptr = formptr;
strcpy(textptr->textentry.text, text); strcpy(textptr->textentry.text, text);
strcpy(textptr->name, attrib); strcpy(textptr->name, attrib);
CTK_WIDGET_SET_FLAG(&textptr->textentry, CTK_WIDGET_FLAG_MONOSPACE); if(size) {
CTK_WIDGET_ADD(&mainwindow, &textptr->textentry); CTK_WIDGET_SET_FLAG(&textptr->textentry, CTK_WIDGET_FLAG_MONOSPACE);
CTK_WIDGET_ADD(&mainwindow, &textptr->textentry);
}
} }
break; break;
} }
@ -780,11 +777,13 @@ add_pagewidget(char *text, unsigned char textlen, char *attrib, unsigned char ty
} }
/* Increase the x coordinate with the length of the link text plus /* Increase the x coordinate with the length of the link text plus
the extra space behind it and the CTK button markers. */ the extra space behind it and the CTK button markers. */
textlen = textlen + 1 + 2 * border; if(size) {
x += textlen; size += 1 + 2 * border;
}
x += size;
if(firsty == pagey) { if(firsty == pagey) {
webpageptr += textlen; webpageptr += size;
} }
if(x == WWW_CONF_WEBPAGE_WIDTH) { if(x == WWW_CONF_WEBPAGE_WIDTH) {
@ -868,9 +867,13 @@ htmlparser_submitbutton(char *text, char *name)
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
void void
htmlparser_inputfield(unsigned char size, char *text, char *name) htmlparser_inputfield(unsigned char type, unsigned char size, char *text, char *name)
{ {
add_pagewidget(text, size, name, CTK_WIDGET_TEXTENTRY, 1); if(type == HTMLPARSER_INPUTTYPE_HIDDEN) {
add_pagewidget(text, 0, name, CTK_WIDGET_TEXTENTRY, 0);
} else {
add_pagewidget(text, size, name, CTK_WIDGET_TEXTENTRY, 1);
}
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
static void CC_FASTCALL static void CC_FASTCALL