1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 The PHP Group |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 3.01 of the PHP license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.php.net/license/3_01.txt |
11 : | If you did not receive a copy of the PHP license and are unable to |
12 : | obtain it through the world-wide-web, please send a note to |
13 : | license@php.net so we can mail you a copy immediately. |
14 : +----------------------------------------------------------------------+
15 : | Authors: Christian Stocker <chregu@php.net> |
16 : | Rob Richards <rrichards@php.net> |
17 : +----------------------------------------------------------------------+
18 : */
19 :
20 : /* $Id: namednodemap.c 272374 2008-12-31 11:17:49Z sebastian $ */
21 :
22 : #ifdef HAVE_CONFIG_H
23 : #include "config.h"
24 : #endif
25 :
26 : #include "php.h"
27 : #if HAVE_LIBXML && HAVE_DOM
28 : #include "php_dom.h"
29 :
30 :
31 : /* {{{ arginfo */
32 : static
33 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_get_named_item, 0, 0, 1)
34 : ZEND_ARG_INFO(0, name)
35 : ZEND_END_ARG_INFO();
36 :
37 : static
38 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_set_named_item, 0, 0, 1)
39 : ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
40 : ZEND_END_ARG_INFO();
41 :
42 : static
43 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_remove_named_item, 0, 0, 0)
44 : ZEND_ARG_INFO(0, name)
45 : ZEND_END_ARG_INFO();
46 :
47 : static
48 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_item, 0, 0, 0)
49 : ZEND_ARG_INFO(0, index)
50 : ZEND_END_ARG_INFO();
51 :
52 : static
53 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_get_named_item_ns, 0, 0, 0)
54 : ZEND_ARG_INFO(0, namespaceURI)
55 : ZEND_ARG_INFO(0, localName)
56 : ZEND_END_ARG_INFO();
57 :
58 : static
59 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_set_named_item_ns, 0, 0, 0)
60 : ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
61 : ZEND_END_ARG_INFO();
62 :
63 : static
64 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_remove_named_item_ns, 0, 0, 0)
65 : ZEND_ARG_INFO(0, namespaceURI)
66 : ZEND_ARG_INFO(0, localName)
67 : ZEND_END_ARG_INFO();
68 : /* }}} */
69 :
70 : /*
71 : * class DOMNamedNodeMap
72 : *
73 : * URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1780488922
74 : * Since:
75 : */
76 :
77 : zend_function_entry php_dom_namednodemap_class_functions[] = {
78 : PHP_FALIAS(getNamedItem, dom_namednodemap_get_named_item, arginfo_dom_namednodemap_get_named_item)
79 : PHP_FALIAS(setNamedItem, dom_namednodemap_set_named_item, arginfo_dom_namednodemap_set_named_item)
80 : PHP_FALIAS(removeNamedItem, dom_namednodemap_remove_named_item, arginfo_dom_namednodemap_remove_named_item)
81 : PHP_FALIAS(item, dom_namednodemap_item, arginfo_dom_namednodemap_item)
82 : PHP_FALIAS(getNamedItemNS, dom_namednodemap_get_named_item_ns, arginfo_dom_namednodemap_get_named_item_ns)
83 : PHP_FALIAS(setNamedItemNS, dom_namednodemap_set_named_item_ns, arginfo_dom_namednodemap_set_named_item_ns)
84 : PHP_FALIAS(removeNamedItemNS, dom_namednodemap_remove_named_item_ns, arginfo_dom_namednodemap_remove_named_item_ns)
85 : {NULL, NULL, NULL}
86 : };
87 :
88 : /* {{{ length int
89 : readonly=yes
90 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D0FB19E
91 : Since:
92 : */
93 : int dom_namednodemap_length_read(dom_object *obj, zval **retval TSRMLS_DC)
94 2 : {
95 : dom_nnodemap_object *objmap;
96 : xmlAttrPtr curnode;
97 : xmlNodePtr nodep;
98 2 : int count = 0;
99 :
100 2 : objmap = (dom_nnodemap_object *)obj->ptr;
101 :
102 2 : if (objmap != NULL) {
103 4 : if ((objmap->nodetype == XML_NOTATION_NODE) ||
104 : objmap->nodetype == XML_ENTITY_NODE) {
105 2 : if (objmap->ht) {
106 2 : count = xmlHashSize(objmap->ht);
107 : }
108 : } else {
109 0 : nodep = dom_object_get_node(objmap->baseobj);
110 0 : if (nodep) {
111 0 : curnode = nodep->properties;
112 0 : if (curnode) {
113 0 : count++;
114 0 : while (curnode->next != NULL) {
115 0 : count++;
116 0 : curnode = curnode->next;
117 : }
118 : }
119 : }
120 : }
121 : }
122 :
123 2 : MAKE_STD_ZVAL(*retval);
124 2 : ZVAL_LONG(*retval, count);
125 2 : return SUCCESS;
126 : }
127 :
128 : /* }}} */
129 :
130 :
131 :
132 :
133 : /* {{{ proto DOMNode dom_namednodemap_get_named_item(string name);
134 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1074577549
135 : Since:
136 : */
137 : PHP_FUNCTION(dom_namednodemap_get_named_item)
138 2 : {
139 2 : zval *id, *rv = NULL;
140 2 : int ret, namedlen=0;
141 : dom_object *intern;
142 2 : xmlNodePtr itemnode = NULL;
143 : char *named;
144 :
145 : dom_nnodemap_object *objmap;
146 : xmlNodePtr nodep;
147 2 : xmlNotation *notep = NULL;
148 :
149 2 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_namednodemap_class_entry, &named, &namedlen) == FAILURE) {
150 0 : return;
151 : }
152 :
153 2 : intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
154 :
155 2 : objmap = (dom_nnodemap_object *)intern->ptr;
156 :
157 2 : if (objmap != NULL) {
158 4 : if ((objmap->nodetype == XML_NOTATION_NODE) ||
159 : objmap->nodetype == XML_ENTITY_NODE) {
160 2 : if (objmap->ht) {
161 2 : if (objmap->nodetype == XML_ENTITY_NODE) {
162 1 : itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, named);
163 : } else {
164 1 : notep = (xmlNotation *)xmlHashLookup(objmap->ht, named);
165 1 : if (notep) {
166 0 : itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID);
167 : }
168 : }
169 : }
170 : } else {
171 0 : nodep = dom_object_get_node(objmap->baseobj);
172 0 : if (nodep) {
173 0 : itemnode = (xmlNodePtr)xmlHasProp(nodep, named);
174 : }
175 : }
176 : }
177 :
178 2 : if (itemnode) {
179 0 : DOM_RET_OBJ(rv, itemnode, &ret, objmap->baseobj);
180 0 : return;
181 : } else {
182 2 : RETVAL_NULL();
183 : }
184 : }
185 : /* }}} end dom_namednodemap_get_named_item */
186 :
187 :
188 : /* {{{ proto DOMNode dom_namednodemap_set_named_item(DOMNode arg);
189 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1025163788
190 : Since:
191 : */
192 : PHP_FUNCTION(dom_namednodemap_set_named_item)
193 0 : {
194 0 : DOM_NOT_IMPLEMENTED();
195 : }
196 : /* }}} end dom_namednodemap_set_named_item */
197 :
198 :
199 : /* {{{ proto DOMNode dom_namednodemap_remove_named_item(string name);
200 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D58B193
201 : Since:
202 : */
203 : PHP_FUNCTION(dom_namednodemap_remove_named_item)
204 0 : {
205 0 : DOM_NOT_IMPLEMENTED();
206 : }
207 : /* }}} end dom_namednodemap_remove_named_item */
208 :
209 :
210 : /* {{{ proto DOMNode dom_namednodemap_item(int index);
211 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-349467F9
212 : Since:
213 : */
214 : PHP_FUNCTION(dom_namednodemap_item)
215 10 : {
216 10 : zval *id, *rv = NULL;
217 : long index;
218 : int ret;
219 : dom_object *intern;
220 10 : xmlNodePtr itemnode = NULL;
221 :
222 : dom_nnodemap_object *objmap;
223 : xmlNodePtr nodep, curnode;
224 : int count;
225 :
226 10 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &id, dom_namednodemap_class_entry, &index) == FAILURE) {
227 0 : return;
228 : }
229 10 : if (index >= 0) {
230 10 : intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
231 :
232 10 : objmap = (dom_nnodemap_object *)intern->ptr;
233 :
234 10 : if (objmap != NULL) {
235 19 : if ((objmap->nodetype == XML_NOTATION_NODE) ||
236 : objmap->nodetype == XML_ENTITY_NODE) {
237 9 : if (objmap->ht) {
238 9 : if (objmap->nodetype == XML_ENTITY_NODE) {
239 5 : itemnode = php_dom_libxml_hash_iter(objmap->ht, index);
240 : } else {
241 4 : itemnode = php_dom_libxml_notation_iter(objmap->ht, index);
242 : }
243 : }
244 : } else {
245 1 : nodep = dom_object_get_node(objmap->baseobj);
246 1 : if (nodep) {
247 1 : curnode = (xmlNodePtr)nodep->properties;
248 1 : count = 0;
249 2 : while (count < index && curnode != NULL) {
250 0 : count++;
251 0 : curnode = (xmlNodePtr)curnode->next;
252 : }
253 1 : itemnode = curnode;
254 : }
255 : }
256 : }
257 :
258 10 : if (itemnode) {
259 9 : DOM_RET_OBJ(rv, itemnode, &ret, objmap->baseobj);
260 9 : return;
261 : }
262 : }
263 :
264 1 : RETVAL_NULL();
265 : }
266 : /* }}} end dom_namednodemap_item */
267 :
268 :
269 : /* {{{ proto DOMNode dom_namednodemap_get_named_item_ns(string namespaceURI, string localName);
270 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getNamedItemNS
271 : Since: DOM Level 2
272 : */
273 : PHP_FUNCTION(dom_namednodemap_get_named_item_ns)
274 0 : {
275 0 : zval *id, *rv = NULL;
276 0 : int ret, namedlen=0, urilen=0;
277 : dom_object *intern;
278 0 : xmlNodePtr itemnode = NULL;
279 : char *uri, *named;
280 :
281 : dom_nnodemap_object *objmap;
282 : xmlNodePtr nodep;
283 0 : xmlNotation *notep = NULL;
284 :
285 0 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!s", &id, dom_namednodemap_class_entry, &uri, &urilen, &named, &namedlen) == FAILURE) {
286 0 : return;
287 : }
288 :
289 0 : intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
290 :
291 0 : objmap = (dom_nnodemap_object *)intern->ptr;
292 :
293 0 : if (objmap != NULL) {
294 0 : if ((objmap->nodetype == XML_NOTATION_NODE) ||
295 : objmap->nodetype == XML_ENTITY_NODE) {
296 0 : if (objmap->ht) {
297 0 : if (objmap->nodetype == XML_ENTITY_NODE) {
298 0 : itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, named);
299 : } else {
300 0 : notep = (xmlNotation *)xmlHashLookup(objmap->ht, named);
301 0 : if (notep) {
302 0 : itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID);
303 : }
304 : }
305 : }
306 : } else {
307 0 : nodep = dom_object_get_node(objmap->baseobj);
308 0 : if (nodep) {
309 0 : itemnode = (xmlNodePtr)xmlHasNsProp(nodep, named, uri);
310 : }
311 : }
312 : }
313 :
314 0 : if (itemnode) {
315 0 : DOM_RET_OBJ(rv, itemnode, &ret, objmap->baseobj);
316 0 : return;
317 : } else {
318 0 : RETVAL_NULL();
319 : }
320 : }
321 : /* }}} end dom_namednodemap_get_named_item_ns */
322 :
323 :
324 : /* {{{ proto DOMNode dom_namednodemap_set_named_item_ns(DOMNode arg);
325 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-setNamedItemNS
326 : Since: DOM Level 2
327 : */
328 : PHP_FUNCTION(dom_namednodemap_set_named_item_ns)
329 0 : {
330 0 : DOM_NOT_IMPLEMENTED();
331 : }
332 : /* }}} end dom_namednodemap_set_named_item_ns */
333 :
334 :
335 : /* {{{ proto DOMNode dom_namednodemap_remove_named_item_ns(string namespaceURI, string localName);
336 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-removeNamedItemNS
337 : Since: DOM Level 2
338 : */
339 : PHP_FUNCTION(dom_namednodemap_remove_named_item_ns)
340 0 : {
341 0 : DOM_NOT_IMPLEMENTED();
342 : }
343 : /* }}} end dom_namednodemap_remove_named_item_ns */
344 : #endif
|