1 /*
2 * This file is part of libdom.
3 * Licensed under the MIT License,
4 * http://www.opensource.org/licenses/mit-license.php
5 * Copyright 2009 Bo Yang <struggleyb.nku.com>
6 */
7
8 #include <assert.h>
9 #include <stdlib.h>
10
11 #include "html/html_document.h"
12 #include "html/html_link_element.h"
13
14 #include "core/node.h"
15 #include "core/attr.h"
16 #include "utils/utils.h"
17
18 static struct dom_element_protected_vtable _protect_vtable = {
19 {
20 DOM_NODE_PROTECT_VTABLE_HTML_LINK_ELEMENT
21 },
22 DOM_HTML_LINK_ELEMENT_PROTECT_VTABLE
23 };
24
25 /**
26 * Create a dom_html_link_element object
27 *
28 * \param params The html element creation parameters
29 * \param ele The returned element object
30 * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
31 */
_dom_html_link_element_create(struct dom_html_element_create_params * params,struct dom_html_link_element ** ele)32 dom_exception _dom_html_link_element_create(
33 struct dom_html_element_create_params *params,
34 struct dom_html_link_element **ele)
35 {
36 struct dom_node_internal *node;
37
38 *ele = malloc(sizeof(dom_html_link_element));
39 if (*ele == NULL)
40 return DOM_NO_MEM_ERR;
41
42 /* Set up vtables */
43 node = (struct dom_node_internal *) *ele;
44 node->base.vtable = &_dom_html_element_vtable;
45 node->vtable = &_protect_vtable;
46
47 return _dom_html_link_element_initialise(params, *ele);
48 }
49
50 /**
51 * Initialise a dom_html_link_element object
52 *
53 * \param params The html element creation parameters
54 * \param ele The dom_html_link_element object
55 * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
56 */
_dom_html_link_element_initialise(struct dom_html_element_create_params * params,struct dom_html_link_element * ele)57 dom_exception _dom_html_link_element_initialise(
58 struct dom_html_element_create_params *params,
59 struct dom_html_link_element *ele)
60 {
61 return _dom_html_element_initialise(params, &ele->base);
62 }
63
64 /**
65 * Finalise a dom_html_link_element object
66 *
67 * \param ele The dom_html_link_element object
68 */
_dom_html_link_element_finalise(struct dom_html_link_element * ele)69 void _dom_html_link_element_finalise(struct dom_html_link_element *ele)
70 {
71 _dom_html_element_finalise(&ele->base);
72 }
73
74 /**
75 * Destroy a dom_html_link_element object
76 *
77 * \param ele The dom_html_link_element object
78 */
_dom_html_link_element_destroy(struct dom_html_link_element * ele)79 void _dom_html_link_element_destroy(struct dom_html_link_element *ele)
80 {
81 _dom_html_link_element_finalise(ele);
82 free(ele);
83 }
84
85 /*-----------------------------------------------------------------------*/
86 /* Public APIs */
87
88 /**
89 * Get the disabled property
90 *
91 * \param ele The dom_html_link_element object
92 * \param disabled The returned status
93 * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
94 */
dom_html_link_element_get_disabled(dom_html_link_element * ele,bool * disabled)95 dom_exception dom_html_link_element_get_disabled(dom_html_link_element *ele,
96 bool *disabled)
97 {
98 return dom_html_element_get_bool_property(&ele->base, "disabled",
99 SLEN("disabled"), disabled);
100 }
101
102 /**
103 * Set the disabled property
104 *
105 * \param ele The dom_html_link_element object
106 * \param disabled The status
107 * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
108 */
dom_html_link_element_set_disabled(dom_html_link_element * ele,bool disabled)109 dom_exception dom_html_link_element_set_disabled(dom_html_link_element *ele,
110 bool disabled)
111 {
112 return dom_html_element_set_bool_property(&ele->base, "disabled",
113 SLEN("disabled"), disabled);
114 }
115
116 /*------------------------------------------------------------------------*/
117 /* The protected virtual functions */
118
119 /* The virtual function used to parse attribute value, see src/core/element.c
120 * for detail */
_dom_html_link_element_parse_attribute(dom_element * ele,dom_string * name,dom_string * value,dom_string ** parsed)121 dom_exception _dom_html_link_element_parse_attribute(dom_element *ele,
122 dom_string *name, dom_string *value,
123 dom_string **parsed)
124 {
125 UNUSED(ele);
126 UNUSED(name);
127
128 dom_string_ref(value);
129 *parsed = value;
130
131 return DOM_NO_ERR;
132 }
133
134 /* The virtual destroy function, see src/core/node.c for detail */
_dom_virtual_html_link_element_destroy(dom_node_internal * node)135 void _dom_virtual_html_link_element_destroy(dom_node_internal *node)
136 {
137 _dom_html_link_element_destroy((struct dom_html_link_element *) node);
138 }
139
140 /* The virtual copy function, see src/core/node.c for detail */
_dom_html_link_element_copy(dom_node_internal * old,dom_node_internal ** copy)141 dom_exception _dom_html_link_element_copy(
142 dom_node_internal *old, dom_node_internal **copy)
143 {
144 dom_html_link_element *new_node;
145 dom_exception err;
146
147 new_node = malloc(sizeof(dom_html_link_element));
148 if (new_node == NULL)
149 return DOM_NO_MEM_ERR;
150
151 err = dom_html_link_element_copy_internal(old, new_node);
152 if (err != DOM_NO_ERR) {
153 free(new_node);
154 return err;
155 }
156
157 *copy = (dom_node_internal *) new_node;
158
159 return DOM_NO_ERR;
160 }
161
_dom_html_link_element_copy_internal(dom_html_link_element * old,dom_html_link_element * new)162 dom_exception _dom_html_link_element_copy_internal(
163 dom_html_link_element *old,
164 dom_html_link_element *new)
165 {
166 dom_exception err;
167
168 err = dom_html_element_copy_internal(old, new);
169 if (err != DOM_NO_ERR) {
170 return err;
171 }
172
173 return DOM_NO_ERR;
174 }
175
176 /*-----------------------------------------------------------------------*/
177 /* API functions */
178
179 #define SIMPLE_GET_SET(attr) \
180 dom_exception dom_html_link_element_get_##attr( \
181 dom_html_link_element *element, \
182 dom_string **attr) \
183 { \
184 dom_exception ret; \
185 dom_string *_memo_##attr; \
186 \
187 _memo_##attr = \
188 ((struct dom_html_document *) \
189 ((struct dom_node_internal *)element)->owner)->\
190 memoised[hds_##attr]; \
191 \
192 ret = dom_element_get_attribute(element, _memo_##attr, attr); \
193 \
194 return ret; \
195 } \
196 \
197 dom_exception dom_html_link_element_set_##attr( \
198 dom_html_link_element *element, \
199 dom_string *attr) \
200 { \
201 dom_exception ret; \
202 dom_string *_memo_##attr; \
203 \
204 _memo_##attr = \
205 ((struct dom_html_document *) \
206 ((struct dom_node_internal *)element)->owner)->\
207 memoised[hds_##attr]; \
208 \
209 ret = dom_element_set_attribute(element, _memo_##attr, attr); \
210 \
211 return ret; \
212 }
213
214 SIMPLE_GET_SET(charset)
215 SIMPLE_GET_SET(href)
216 SIMPLE_GET_SET(hreflang)
217 SIMPLE_GET_SET(media)
218 SIMPLE_GET_SET(rel)
219 SIMPLE_GET_SET(rev)
220 SIMPLE_GET_SET(target)
221 SIMPLE_GET_SET(type)
222