summaryrefslogtreecommitdiff
path: root/render/form.h
blob: 10e357ec71a99960cb6c667422345151a10e8d21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
 * This file is part of NetSurf, http://netsurf.sourceforge.net/
 * Licensed under the GNU General Public License,
 *                http://www.opensource.org/licenses/gpl-license
 * Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
 * Copyright 2003 James Bursa <bursa@users.sourceforge.net>
 */

/** \file
 * Form handling functions (interface).
 */

#ifndef _NETSURF_RENDER_FORM_H_
#define _NETSURF_RENDER_FORM_H_

#include <stdbool.h>

struct box;
struct form_control;
struct form_option;

/** HTML form. */
struct form {
	char *action;				/**< Url to submit to. */
	enum {
		method_GET,		/**< GET, always url encoded. */
		method_POST_URLENC,	/**< POST, url encoded. */
		method_POST_MULTIPART	/**< POST, multipart/form-data. */
	} method;				/**< Method and enctype. */
	struct form_control *controls;		/**< Linked list of controls. */
	struct form_control *last_control;	/**< Last control in list. */
};

/** Form control. */
struct form_control {
	enum { GADGET_HIDDEN, GADGET_TEXTBOX, GADGET_RADIO, GADGET_CHECKBOX,
			GADGET_SELECT, GADGET_TEXTAREA, GADGET_IMAGE,
			GADGET_PASSWORD, GADGET_SUBMIT, GADGET_RESET } type;
	char *name;
	char *value;
	char *initial_value;
	bool disabled;
	struct form *form;
	struct box *box;
	struct box *caret_inline_container;
	struct box *caret_text_box;
	int caret_char_offset;
	unsigned int maxlength;
	union {
		struct {
                        int mx, my;
		} image;
		struct {
			int num_items;
			struct form_option *items, *last_item;
			bool multiple;
			int num_selected;
			/** Currently selected item, if num_selected == 1. */
			struct form_option *current;
		} select;
		struct {
			int selected;
		} checkbox;
		struct {
			int selected;
		} radio;
	} data;
	struct form_control *next;	/**< Next control in this form. */
};

/** Option in a select. */
struct form_option {
	bool selected;
	bool initial_selected;
	char* value;
	char* text;
	struct form_option* next;
};

/** Successful control, as defined by HTML 4.01 17.13. */
struct form_successful_control {
	char *name;				/**< Control name. */
	char *value;				/**< Current value. */
	struct form_successful_control *next;	/**< Next in linked list. */
};

void form_add_control(struct form *form, struct form_control *control);
struct form_successful_control *form_successful_controls(struct form *form,
		struct form_control *submit_button);
char *form_url_encode(struct form_successful_control *control);
void form_free_successful(struct form_successful_control *control);

#endif