summaryrefslogtreecommitdiff
path: root/src/core/element.h
blob: f987fcd9441108b5cd1b9c812438c0cab7e5705a (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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*
 * This file is part of libdom.
 * Licensed under the MIT License,
 *                http://www.opensource.org/licenses/mit-license.php
 * Copyright 2007 John-Mark Bell <jmb@netsurf-browser.org>
 */

#ifndef dom_internal_core_element_h_
#define dom_internal_core_element_h_

#include <stdbool.h>

#include <dom/core/exceptions.h>

struct dom_document;
struct dom_element;
struct dom_namednodemap;
struct dom_node;
struct dom_string;
struct dom_attr;
struct dom_type_info;
struct dom_hash_table;

/**
 * DOM element node
 */
struct dom_element {
	struct dom_node_internal base;		/**< Base node */

	struct dom_hash_table *attributes;	/**< Element attributes */

	struct dom_hash_table *ns_attributes;
			/**< Attributes with prefix */

	struct lwc_string_s *id_ns;	/**< The id attribute's namespace */

	struct lwc_string_s *id_name; 	/**< The id attribute's name */

	struct dom_type_info *schema_type_info;	/**< Type information */
};

dom_exception _dom_element_create(struct dom_document *doc,
		struct lwc_string_s *name, struct lwc_string_s *namespace,
		struct lwc_string_s *prefix, struct dom_element **result);

dom_exception _dom_element_initialise(struct dom_element *el, 
		struct dom_document *doc, struct lwc_string_s *name, 
		struct lwc_string_s *namespace, struct lwc_string_s *prefix, 
		struct dom_element **result);

void _dom_element_destroy(struct dom_document *doc,
		struct dom_element *element);


/* The virtual functions of dom_element */
dom_exception _dom_element_get_tag_name(struct dom_element *element,
		struct dom_string **name);
dom_exception _dom_element_get_attribute(struct dom_element *element,
		struct dom_string *name, struct dom_string **value);
dom_exception _dom_element_set_attribute(struct dom_element *element,
		struct dom_string *name, struct dom_string *value);
dom_exception _dom_element_remove_attribute(struct dom_element *element, 
		struct dom_string *name);
dom_exception _dom_element_get_attribute_node(struct dom_element *element, 
		struct dom_string *name, struct dom_attr **result);
dom_exception _dom_element_set_attribute_node(struct dom_element *element, 
		struct dom_attr *attr, struct dom_attr **result);
dom_exception _dom_element_remove_attribute_node(struct dom_element *element, 
		struct dom_attr *attr, struct dom_attr **result);
dom_exception _dom_element_get_elements_by_tag_name(
		struct dom_element *element, struct dom_string *name,
		struct dom_nodelist **result);
dom_exception _dom_element_get_attribute_ns(struct dom_element *element, 
		struct dom_string *namespace,  struct dom_string *localname, 
		struct dom_string **value);
dom_exception _dom_element_set_attribute_ns(struct dom_element *element,
		struct dom_string *namespace, struct dom_string *qname,
		struct dom_string *value);
dom_exception _dom_element_remove_attribute_ns(struct dom_element *element,
		struct dom_string *namespace, struct dom_string *localname);
dom_exception _dom_element_get_attribute_node_ns(struct dom_element *element,
		struct dom_string *namespace, struct dom_string *localname, 
		struct dom_attr **result);
dom_exception _dom_element_set_attribute_node_ns(struct dom_element *element, 
		struct dom_attr *attr, struct dom_attr **result);
dom_exception _dom_element_get_elements_by_tag_name_ns(
		struct dom_element *element, struct dom_string *namespace, 
		struct dom_string *localname, struct dom_nodelist **result);
dom_exception _dom_element_has_attribute(struct dom_element *element,
		struct dom_string *name, bool *result);
dom_exception _dom_element_has_attribute_ns(struct dom_element *element,
		struct dom_string *namespace, struct dom_string *localname, 
		bool *result);
dom_exception _dom_element_get_schema_type_info(struct dom_element *element, 
		struct dom_type_info **result);
dom_exception _dom_element_set_id_attribute(struct dom_element *element, 
		struct dom_string *name, bool is_id);
dom_exception _dom_element_set_id_attribute_ns(struct dom_element *element, 
		struct dom_string *namespace, struct dom_string *localname, 
		bool is_id);
dom_exception _dom_element_set_id_attribute_node(struct dom_element *element,
		struct dom_attr *id_attr, bool is_id);

#define DOM_ELEMENT_VTABLE \
	_dom_element_get_tag_name, \
	_dom_element_get_attribute, \
	_dom_element_set_attribute, \
	_dom_element_remove_attribute, \
	_dom_element_get_attribute_node, \
	_dom_element_set_attribute_node, \
	_dom_element_remove_attribute_node, \
	_dom_element_get_elements_by_tag_name, \
	_dom_element_get_attribute_ns, \
	_dom_element_set_attribute_ns, \
	_dom_element_remove_attribute_ns, \
	_dom_element_get_attribute_node_ns, \
	_dom_element_set_attribute_node_ns, \
	_dom_element_get_elements_by_tag_name_ns, \
	_dom_element_has_attribute, \
	_dom_element_has_attribute_ns, \
	_dom_element_get_schema_type_info, \
	_dom_element_set_id_attribute, \
	_dom_element_set_id_attribute_ns, \
	_dom_element_set_id_attribute_node

/* Overloading dom_node functions */
dom_exception _dom_element_get_attributes(dom_node_internal *node,
		struct dom_namednodemap **result);
dom_exception _dom_element_has_attributes(dom_node_internal *node,
		bool *result);
dom_exception _dom_element_normalize(dom_node_internal *node);
dom_exception _dom_element_lookup_prefix(dom_node_internal *node,
		struct dom_string *namespace, struct dom_string **result);
dom_exception _dom_element_is_default_namespace(dom_node_internal *node,
		struct dom_string *namespace, bool *result);
dom_exception _dom_element_lookup_namespace(dom_node_internal *node,
		struct dom_string *prefix, struct dom_string **result);
#define DOM_NODE_VTABLE_ELEMENT \
	_dom_node_get_node_name, \
	_dom_node_get_node_value, \
	_dom_node_set_node_value, \
	_dom_node_get_node_type, \
	_dom_node_get_parent_node, \
	_dom_node_get_child_nodes, \
	_dom_node_get_first_child, \
	_dom_node_get_last_child, \
	_dom_node_get_previous_sibling, \
	_dom_node_get_next_sibling, \
	_dom_element_get_attributes, /*overload*/\
	_dom_node_get_owner_document, \
	_dom_node_insert_before, \
	_dom_node_replace_child, \
	_dom_node_remove_child, \
	_dom_node_append_child, \
	_dom_node_has_child_nodes, \
	_dom_node_clone_node, \
	_dom_node_normalize, \
	_dom_node_is_supported, \
	_dom_node_get_namespace, \
	_dom_node_get_prefix, \
	_dom_node_set_prefix, \
	_dom_node_get_local_name, \
	_dom_element_has_attributes, /*overload*/\
	_dom_node_get_base, \
	_dom_node_compare_document_position, \
	_dom_node_get_text_content, \
	_dom_node_set_text_content, \
	_dom_node_is_same, \
	_dom_element_lookup_prefix, /*overload*/\
	_dom_element_is_default_namespace, /*overload*/\
	_dom_element_lookup_namespace, /*overload*/\
	_dom_node_is_equal, \
	_dom_node_get_feature, \
	_dom_node_set_user_data, \
	_dom_node_get_user_data


/* The protected virtual function */
void __dom_element_destroy(dom_node_internal *node);
dom_exception _dom_element_alloc(struct dom_document *doc, 
		struct dom_node_internal *n, struct dom_node_internal **ret);
dom_exception _dom_element_copy(struct dom_node_internal *new, 
		struct dom_node_internal *old);

#define DOM_ELEMENT_PROTECT_VTABLE \
	__dom_element_destroy, \
	_dom_element_alloc, \
	_dom_element_copy

/* Helper functions*/
dom_exception _dom_element_get_id(struct dom_element *ele, 
		struct lwc_string_s **id);

#endif