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