1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 6 |
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: element.c 281094 2009-05-25 14:32:15Z felipe $ */
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 : /* {{{ arginfo */
31 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_attribute, 0, 0, 1)
32 : ZEND_ARG_INFO(0, name)
33 : ZEND_END_ARG_INFO();
34 :
35 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_attribute, 0, 0, 2)
36 : ZEND_ARG_INFO(0, name)
37 : ZEND_ARG_INFO(0, value)
38 : ZEND_END_ARG_INFO();
39 :
40 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_remove_attribute, 0, 0, 1)
41 : ZEND_ARG_INFO(0, name)
42 : ZEND_END_ARG_INFO();
43 :
44 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_attribute_node, 0, 0, 1)
45 : ZEND_ARG_INFO(0, name)
46 : ZEND_END_ARG_INFO();
47 :
48 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_attribute_node, 0, 0, 1)
49 : ZEND_ARG_OBJ_INFO(0, newAttr, DOMAttr, 0)
50 : ZEND_END_ARG_INFO();
51 :
52 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_remove_attribute_node, 0, 0, 1)
53 : ZEND_ARG_OBJ_INFO(0, oldAttr, DOMAttr, 0)
54 : ZEND_END_ARG_INFO();
55 :
56 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_elements_by_tag_name, 0, 0, 1)
57 : ZEND_ARG_INFO(0, name)
58 : ZEND_END_ARG_INFO();
59 :
60 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_attribute_ns, 0, 0, 2)
61 : ZEND_ARG_INFO(0, namespaceURI)
62 : ZEND_ARG_INFO(0, localName)
63 : ZEND_END_ARG_INFO();
64 :
65 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_attribute_ns, 0, 0, 3)
66 : ZEND_ARG_INFO(0, namespaceURI)
67 : ZEND_ARG_INFO(0, qualifiedName)
68 : ZEND_ARG_INFO(0, value)
69 : ZEND_END_ARG_INFO();
70 :
71 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_remove_attribute_ns, 0, 0, 2)
72 : ZEND_ARG_INFO(0, namespaceURI)
73 : ZEND_ARG_INFO(0, localName)
74 : ZEND_END_ARG_INFO();
75 :
76 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_attribute_node_ns, 0, 0, 2)
77 : ZEND_ARG_INFO(0, namespaceURI)
78 : ZEND_ARG_INFO(0, localName)
79 : ZEND_END_ARG_INFO();
80 :
81 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_attribute_node_ns, 0, 0, 1)
82 : ZEND_ARG_OBJ_INFO(0, newAttr, DOMAttr, 0)
83 : ZEND_END_ARG_INFO();
84 :
85 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_get_elements_by_tag_name_ns, 0, 0, 2)
86 : ZEND_ARG_INFO(0, namespaceURI)
87 : ZEND_ARG_INFO(0, localName)
88 : ZEND_END_ARG_INFO();
89 :
90 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_has_attribute, 0, 0, 1)
91 : ZEND_ARG_INFO(0, name)
92 : ZEND_END_ARG_INFO();
93 :
94 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_has_attribute_ns, 0, 0, 2)
95 : ZEND_ARG_INFO(0, namespaceURI)
96 : ZEND_ARG_INFO(0, localName)
97 : ZEND_END_ARG_INFO();
98 :
99 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_id_attribute, 0, 0, 2)
100 : ZEND_ARG_INFO(0, name)
101 : ZEND_ARG_INFO(0, isId)
102 : ZEND_END_ARG_INFO();
103 :
104 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_id_attribute_ns, 0, 0, 3)
105 : ZEND_ARG_INFO(0, namespaceURI)
106 : ZEND_ARG_INFO(0, localName)
107 : ZEND_ARG_INFO(0, isId)
108 : ZEND_END_ARG_INFO();
109 :
110 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_set_id_attribute_node, 0, 0, 2)
111 : ZEND_ARG_OBJ_INFO(0, attr, DOMAttr, 0)
112 : ZEND_ARG_INFO(0, isId)
113 : ZEND_END_ARG_INFO();
114 :
115 : ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_element_construct, 0, 0, 1)
116 : ZEND_ARG_INFO(0, name)
117 : ZEND_ARG_INFO(0, value)
118 : ZEND_ARG_INFO(0, uri)
119 : ZEND_END_ARG_INFO();
120 : /* }}} */
121 :
122 : /*
123 : * class DOMElement extends DOMNode
124 : *
125 : * URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-745549614
126 : * Since:
127 : */
128 :
129 : const zend_function_entry php_dom_element_class_functions[] = { /* {{{ */
130 : PHP_FALIAS(getAttribute, dom_element_get_attribute, arginfo_dom_element_get_attribute)
131 : PHP_FALIAS(setAttribute, dom_element_set_attribute, arginfo_dom_element_set_attribute)
132 : PHP_FALIAS(removeAttribute, dom_element_remove_attribute, arginfo_dom_element_remove_attribute)
133 : PHP_FALIAS(getAttributeNode, dom_element_get_attribute_node, arginfo_dom_element_get_attribute_node)
134 : PHP_FALIAS(setAttributeNode, dom_element_set_attribute_node, arginfo_dom_element_set_attribute_node)
135 : PHP_FALIAS(removeAttributeNode, dom_element_remove_attribute_node, arginfo_dom_element_remove_attribute_node)
136 : PHP_FALIAS(getElementsByTagName, dom_element_get_elements_by_tag_name, arginfo_dom_element_get_elements_by_tag_name)
137 : PHP_FALIAS(getAttributeNS, dom_element_get_attribute_ns, arginfo_dom_element_get_attribute_ns)
138 : PHP_FALIAS(setAttributeNS, dom_element_set_attribute_ns, arginfo_dom_element_set_attribute_ns)
139 : PHP_FALIAS(removeAttributeNS, dom_element_remove_attribute_ns, arginfo_dom_element_remove_attribute_ns)
140 : PHP_FALIAS(getAttributeNodeNS, dom_element_get_attribute_node_ns, arginfo_dom_element_get_attribute_node_ns)
141 : PHP_FALIAS(setAttributeNodeNS, dom_element_set_attribute_node_ns, arginfo_dom_element_set_attribute_node_ns)
142 : PHP_FALIAS(getElementsByTagNameNS, dom_element_get_elements_by_tag_name_ns, arginfo_dom_element_get_elements_by_tag_name_ns)
143 : PHP_FALIAS(hasAttribute, dom_element_has_attribute, arginfo_dom_element_has_attribute)
144 : PHP_FALIAS(hasAttributeNS, dom_element_has_attribute_ns, arginfo_dom_element_has_attribute_ns)
145 : PHP_FALIAS(setIdAttribute, dom_element_set_id_attribute, arginfo_dom_element_set_id_attribute)
146 : PHP_FALIAS(setIdAttributeNS, dom_element_set_id_attribute_ns, arginfo_dom_element_set_id_attribute_ns)
147 : PHP_FALIAS(setIdAttributeNode, dom_element_set_id_attribute_node, arginfo_dom_element_set_id_attribute_node)
148 : PHP_ME(domelement, __construct, arginfo_dom_element_construct, ZEND_ACC_PUBLIC)
149 : {NULL, NULL, NULL}
150 : };
151 : /* }}} */
152 :
153 : /* {{{ proto void DOMElement::__construct(string name, [string value], [string uri]) U */
154 : PHP_METHOD(domelement, __construct)
155 37 : {
156 :
157 : zval *id;
158 37 : xmlNodePtr nodep = NULL, oldnode = NULL;
159 : dom_object *intern;
160 37 : char *name, *value = NULL, *uri = NULL;
161 37 : char *localname = NULL, *prefix = NULL;
162 37 : int errorcode = 0, uri_len = 0;
163 37 : int name_len, value_len = 0, name_valid;
164 37 : xmlNsPtr nsptr = NULL;
165 : zend_error_handling error_handling;
166 :
167 37 : zend_replace_error_handling(EH_THROW, dom_domexception_class_entry, &error_handling TSRMLS_CC);
168 37 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&|s!&s&", &id, dom_element_class_entry, &name, &name_len, UG(utf8_conv), &value, &value_len, UG(utf8_conv), &uri, &uri_len, UG(utf8_conv)) == FAILURE) {
169 0 : zend_restore_error_handling(&error_handling TSRMLS_CC);
170 0 : return;
171 : }
172 37 : zend_restore_error_handling(&error_handling TSRMLS_CC);
173 :
174 37 : name_valid = xmlValidateName((xmlChar *) name, 0);
175 37 : if (name_valid != 0) {
176 4 : php_dom_throw_error(INVALID_CHARACTER_ERR, 1 TSRMLS_CC);
177 4 : RETURN_FALSE;
178 : }
179 :
180 : /* Namespace logic is seperate and only when uri passed in to insure no BC breakage */
181 33 : if (uri_len > 0) {
182 12 : errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
183 12 : if (errorcode == 0) {
184 10 : nodep = xmlNewNode (NULL, (xmlChar *)localname);
185 10 : if (nodep != NULL && uri != NULL) {
186 10 : nsptr = dom_get_ns(nodep, uri, &errorcode, prefix);
187 10 : xmlSetNs(nodep, nsptr);
188 : }
189 : }
190 12 : xmlFree(localname);
191 12 : if (prefix != NULL) {
192 11 : xmlFree(prefix);
193 : }
194 12 : if (errorcode != 0) {
195 6 : if (nodep != NULL) {
196 4 : xmlFreeNode(nodep);
197 : }
198 6 : php_dom_throw_error(errorcode, 1 TSRMLS_CC);
199 6 : RETURN_FALSE;
200 : }
201 : } else {
202 : /* If you don't pass a namespace uri, then you can't set a prefix */
203 21 : localname = xmlSplitQName2((xmlChar *)name, (xmlChar **) &prefix);
204 21 : if (prefix != NULL) {
205 2 : xmlFree(localname);
206 2 : xmlFree(prefix);
207 2 : php_dom_throw_error(NAMESPACE_ERR, 1 TSRMLS_CC);
208 2 : RETURN_FALSE;
209 : }
210 19 : nodep = xmlNewNode(NULL, (xmlChar *) name);
211 : }
212 :
213 25 : if (!nodep) {
214 0 : php_dom_throw_error(INVALID_STATE_ERR, 1 TSRMLS_CC);
215 0 : RETURN_FALSE;
216 : }
217 :
218 25 : if (value_len > 0) {
219 4 : xmlNodeSetContentLen(nodep, (xmlChar *) value, value_len);
220 : }
221 :
222 25 : intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
223 25 : if (intern != NULL) {
224 25 : oldnode = dom_object_get_node(intern);
225 25 : if (oldnode != NULL) {
226 0 : php_libxml_node_free_resource(oldnode TSRMLS_CC);
227 : }
228 25 : php_libxml_increment_node_ptr((php_libxml_node_object *)intern, nodep, (void *)intern TSRMLS_CC);
229 : }
230 : }
231 : /* }}} end DOMElement::__construct */
232 :
233 : /* {{{ tagName string
234 : readonly=yes
235 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-104682815
236 : Since:
237 : */
238 : int dom_element_tag_name_read(dom_object *obj, zval **retval TSRMLS_DC)
239 2 : {
240 : xmlNodePtr nodep;
241 : xmlNsPtr ns;
242 : xmlChar *qname;
243 :
244 2 : nodep = dom_object_get_node(obj);
245 :
246 2 : if (nodep == NULL) {
247 0 : php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
248 0 : return FAILURE;
249 : }
250 :
251 2 : ALLOC_ZVAL(*retval);
252 2 : ns = nodep->ns;
253 2 : if (ns != NULL && ns->prefix) {
254 0 : qname = xmlStrdup(ns->prefix);
255 0 : qname = xmlStrcat(qname, (xmlChar *)":");
256 0 : qname = xmlStrcat(qname, nodep->name);
257 0 : ZVAL_XML_STRING(*retval, (char *)qname, ZSTR_DUPLICATE);
258 0 : xmlFree(qname);
259 : } else {
260 2 : ZVAL_XML_STRING(*retval, (char *) nodep->name, ZSTR_DUPLICATE);
261 : }
262 :
263 2 : return SUCCESS;
264 : }
265 :
266 : /* }}} */
267 :
268 : /* {{{ schemaTypeInfo typeinfo
269 : readonly=yes
270 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Element-schemaTypeInfo
271 : Since: DOM Level 3
272 : */
273 : int dom_element_schema_type_info_read(dom_object *obj, zval **retval TSRMLS_DC)
274 0 : {
275 0 : ALLOC_ZVAL(*retval);
276 0 : ZVAL_NULL(*retval);
277 0 : return SUCCESS;
278 : }
279 :
280 : /* }}} */
281 :
282 : static xmlNodePtr dom_get_dom1_attribute(xmlNodePtr elem, xmlChar *name) /* {{{ */
283 67 : {
284 : int len;
285 : const xmlChar *nqname;
286 :
287 67 : nqname = xmlSplitQName3(name, &len);
288 67 : if (nqname != NULL) {
289 : xmlNsPtr ns;
290 12 : xmlChar *prefix = xmlStrndup(name, len);
291 12 : if (prefix && xmlStrEqual(prefix, (xmlChar *)"xmlns")) {
292 2 : ns = elem->nsDef;
293 5 : while (ns) {
294 2 : if (xmlStrEqual(ns->prefix, nqname)) {
295 1 : break;
296 : }
297 1 : ns = ns->next;
298 : }
299 2 : xmlFree(prefix);
300 2 : return (xmlNodePtr)ns;
301 : }
302 10 : ns = xmlSearchNs(elem->doc, elem, prefix);
303 10 : if (prefix != NULL) {
304 10 : xmlFree(prefix);
305 : }
306 10 : if (ns != NULL) {
307 8 : return (xmlNodePtr)xmlHasNsProp(elem, nqname, ns->href);
308 : }
309 : } else {
310 55 : if (xmlStrEqual(name, (xmlChar *)"xmlns")) {
311 2 : xmlNsPtr nsPtr = elem->nsDef;
312 4 : while (nsPtr) {
313 1 : if (nsPtr->prefix == NULL) {
314 1 : return (xmlNodePtr)nsPtr;
315 : }
316 0 : nsPtr = nsPtr->next;
317 : }
318 1 : return NULL;
319 : }
320 : }
321 55 : return (xmlNodePtr)xmlHasNsProp(elem, name, NULL);
322 : }
323 : /* }}} */
324 :
325 : /* {{{ proto string dom_element_get_attribute(string name) U
326 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-666EE0F9
327 : Since:
328 : */
329 : PHP_FUNCTION(dom_element_get_attribute)
330 28 : {
331 : zval *id;
332 : xmlNode *nodep;
333 : char *name;
334 28 : xmlChar *value = NULL;
335 : dom_object *intern;
336 : xmlNodePtr attr;
337 : int name_len;
338 :
339 28 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_element_class_entry, &name, &name_len) == FAILURE) {
340 0 : return;
341 : }
342 :
343 28 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
344 :
345 28 : attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
346 28 : if (attr) {
347 22 : switch (attr->type) {
348 : case XML_ATTRIBUTE_NODE:
349 20 : value = xmlNodeListGetString(attr->doc, attr->children, 1);
350 20 : break;
351 : case XML_NAMESPACE_DECL:
352 2 : value = xmlStrdup(((xmlNsPtr)attr)->href);
353 2 : break;
354 : default:
355 0 : value = xmlStrdup(((xmlAttributePtr)attr)->defaultValue);
356 : }
357 : }
358 :
359 28 : if (value == NULL) {
360 6 : RETURN_EMPTY_UNICODE();
361 : } else {
362 22 : RETVAL_XML_STRING(value, ZSTR_DUPLICATE);
363 22 : xmlFree(value);
364 : }
365 : }
366 : /* }}} end dom_element_get_attribute */
367 :
368 : /* {{{ proto void dom_element_set_attribute(string name, string value) U
369 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68F082
370 : Since:
371 : */
372 : PHP_FUNCTION(dom_element_set_attribute)
373 18 : {
374 18 : zval *id, *rv = NULL;
375 : xmlNode *nodep;
376 18 : xmlNodePtr attr = NULL;
377 : int ret, name_len, value_len, name_valid;
378 : dom_object *intern;
379 : char *name, *value;
380 :
381 18 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&s&", &id, dom_element_class_entry, &name, &name_len, UG(utf8_conv), &value, &value_len, UG(utf8_conv)) == FAILURE) {
382 0 : return;
383 : }
384 :
385 18 : if (name_len == 0) {
386 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute Name is required");
387 0 : RETURN_FALSE;
388 : }
389 :
390 18 : name_valid = xmlValidateName((xmlChar *) name, 0);
391 18 : if (name_valid != 0) {
392 1 : php_dom_throw_error(INVALID_CHARACTER_ERR, 1 TSRMLS_CC);
393 1 : RETURN_FALSE;
394 : }
395 :
396 17 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
397 :
398 17 : if (dom_node_is_read_only(nodep) == SUCCESS) {
399 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
400 0 : RETURN_FALSE;
401 : }
402 :
403 17 : attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
404 17 : if (attr != NULL) {
405 10 : switch (attr->type) {
406 : case XML_ATTRIBUTE_NODE:
407 10 : node_list_unlink(attr->children TSRMLS_CC);
408 10 : break;
409 : case XML_NAMESPACE_DECL:
410 0 : RETURN_FALSE;
411 : default:
412 : break;
413 : }
414 :
415 : }
416 :
417 17 : if (xmlStrEqual((xmlChar *)name, (xmlChar *)"xmlns")) {
418 0 : if (xmlNewNs(nodep, (xmlChar *)value, NULL)) {
419 0 : RETURN_TRUE;
420 : }
421 : } else {
422 17 : attr = (xmlNodePtr)xmlSetProp(nodep, (xmlChar *) name, (xmlChar *)value);
423 : }
424 17 : if (!attr) {
425 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such attribute '%s'", name);
426 0 : RETURN_FALSE;
427 : }
428 :
429 17 : DOM_RET_OBJ(rv, attr, &ret, intern);
430 :
431 : }
432 : /* }}} end dom_element_set_attribute */
433 :
434 : /* {{{ proto void dom_element_remove_attribute(string name) U
435 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9
436 : Since:
437 : */
438 : PHP_FUNCTION(dom_element_remove_attribute)
439 4 : {
440 : zval *id;
441 : xmlNodePtr nodep, attrp;
442 : dom_object *intern;
443 : int name_len;
444 : char *name;
445 :
446 4 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &id, dom_element_class_entry, &name, &name_len, UG(utf8_conv)) == FAILURE) {
447 0 : return;
448 : }
449 :
450 4 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
451 :
452 4 : if (dom_node_is_read_only(nodep) == SUCCESS) {
453 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
454 0 : RETURN_FALSE;
455 : }
456 :
457 4 : attrp = dom_get_dom1_attribute(nodep, (xmlChar *)name);
458 4 : if (attrp == NULL) {
459 0 : RETURN_FALSE;
460 : }
461 :
462 4 : switch (attrp->type) {
463 : case XML_ATTRIBUTE_NODE:
464 4 : if (php_dom_object_get_data(attrp) == NULL) {
465 3 : node_list_unlink(attrp->children TSRMLS_CC);
466 3 : xmlUnlinkNode(attrp);
467 3 : xmlFreeProp((xmlAttrPtr)attrp);
468 : } else {
469 1 : xmlUnlinkNode(attrp);
470 : }
471 4 : break;
472 : case XML_NAMESPACE_DECL:
473 0 : RETURN_FALSE;
474 : default:
475 : break;
476 : }
477 :
478 4 : RETURN_TRUE;
479 : }
480 : /* }}} end dom_element_remove_attribute */
481 :
482 : /* {{{ proto DOMAttr dom_element_get_attribute_node(string name) U
483 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-217A91B8
484 : Since:
485 : */
486 : PHP_FUNCTION(dom_element_get_attribute_node)
487 7 : {
488 7 : zval *id, *rv = NULL;
489 : xmlNodePtr nodep, attrp;
490 : int name_len, ret;
491 : dom_object *intern;
492 : char *name;
493 :
494 7 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &id, dom_element_class_entry, &name, &name_len, UG(utf8_conv)) == FAILURE) {
495 0 : return;
496 : }
497 :
498 7 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
499 :
500 7 : attrp = dom_get_dom1_attribute(nodep, (xmlChar *)name);
501 7 : if (attrp == NULL) {
502 0 : RETURN_FALSE;
503 : }
504 :
505 7 : if (attrp->type == XML_NAMESPACE_DECL) {
506 : xmlNsPtr curns;
507 : xmlNodePtr nsparent;
508 :
509 0 : nsparent = attrp->_private;
510 0 : curns = xmlNewNs(NULL, attrp->name, NULL);
511 0 : if (attrp->children) {
512 0 : curns->prefix = xmlStrdup((xmlChar *) attrp->children);
513 : }
514 0 : if (attrp->children) {
515 0 : attrp = xmlNewDocNode(nodep->doc, NULL, (xmlChar *) attrp->children, attrp->name);
516 : } else {
517 0 : attrp = xmlNewDocNode(nodep->doc, NULL, (xmlChar *)"xmlns", attrp->name);
518 : }
519 0 : attrp->type = XML_NAMESPACE_DECL;
520 0 : attrp->parent = nsparent;
521 0 : attrp->ns = curns;
522 : }
523 :
524 7 : DOM_RET_OBJ(rv, (xmlNodePtr) attrp, &ret, intern);
525 : }
526 : /* }}} end dom_element_get_attribute_node */
527 :
528 : /* {{{ proto DOMAttr dom_element_set_attribute_node(DOMAttr newAttr) U
529 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-887236154
530 : Since:
531 : */
532 : PHP_FUNCTION(dom_element_set_attribute_node)
533 9 : {
534 9 : zval *id, *node, *rv = NULL;
535 : xmlNode *nodep;
536 9 : xmlAttr *attrp, *existattrp = NULL;
537 : dom_object *intern, *attrobj, *oldobj;
538 : int ret;
539 :
540 9 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &id, dom_element_class_entry, &node, dom_attr_class_entry) == FAILURE) {
541 0 : return;
542 : }
543 :
544 9 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
545 :
546 9 : if (dom_node_is_read_only(nodep) == SUCCESS) {
547 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
548 0 : RETURN_FALSE;
549 : }
550 :
551 9 : DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj);
552 :
553 9 : if (attrp->type != XML_ATTRIBUTE_NODE) {
554 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute node is required");
555 0 : RETURN_FALSE;
556 : }
557 :
558 9 : if (!(attrp->doc == NULL || attrp->doc == nodep->doc)) {
559 1 : php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
560 1 : RETURN_FALSE;
561 : }
562 :
563 8 : existattrp = xmlHasProp(nodep, attrp->name);
564 8 : if (existattrp != NULL && existattrp->type != XML_ATTRIBUTE_DECL) {
565 1 : if ((oldobj = php_dom_object_get_data((xmlNodePtr) existattrp)) != NULL &&
566 : ((php_libxml_node_ptr *)oldobj->ptr)->node == (xmlNodePtr) attrp)
567 : {
568 1 : RETURN_NULL();
569 : }
570 0 : xmlUnlinkNode((xmlNodePtr) existattrp);
571 : }
572 :
573 7 : if (attrp->parent != NULL) {
574 1 : xmlUnlinkNode((xmlNodePtr) attrp);
575 : }
576 :
577 7 : if (attrp->doc == NULL && nodep->doc != NULL) {
578 1 : attrobj->document = intern->document;
579 1 : php_libxml_increment_doc_ref((php_libxml_node_object *)attrobj, NULL TSRMLS_CC);
580 : }
581 :
582 7 : xmlAddChild(nodep, (xmlNodePtr) attrp);
583 :
584 : /* Returns old property if removed otherwise NULL */
585 7 : if (existattrp != NULL) {
586 0 : DOM_RET_OBJ(rv, (xmlNodePtr) existattrp, &ret, intern);
587 : } else {
588 7 : RETVAL_NULL();
589 : }
590 :
591 : }
592 : /* }}} end dom_element_set_attribute_node */
593 :
594 : /* {{{ proto DOMAttr dom_element_remove_attribute_node(DOMAttr oldAttr) U
595 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D589198
596 : Since:
597 : */
598 : PHP_FUNCTION(dom_element_remove_attribute_node)
599 1 : {
600 1 : zval *id, *node, *rv = NULL;
601 : xmlNode *nodep;
602 : xmlAttr *attrp;
603 : dom_object *intern, *attrobj;
604 : int ret;
605 :
606 1 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &id, dom_element_class_entry, &node, dom_attr_class_entry) == FAILURE) {
607 0 : return;
608 : }
609 :
610 1 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
611 :
612 1 : if (dom_node_is_read_only(nodep) == SUCCESS) {
613 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
614 0 : RETURN_FALSE;
615 : }
616 :
617 1 : DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj);
618 :
619 1 : if (attrp->type != XML_ATTRIBUTE_NODE || attrp->parent != nodep) {
620 0 : php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
621 0 : RETURN_FALSE;
622 : }
623 :
624 1 : xmlUnlinkNode((xmlNodePtr) attrp);
625 :
626 1 : DOM_RET_OBJ(rv, (xmlNodePtr) attrp, &ret, intern);
627 :
628 : }
629 : /* }}} end dom_element_remove_attribute_node */
630 :
631 : /* {{{ proto DOMNodeList dom_element_get_elements_by_tag_name(string name) U
632 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1938918D
633 : Since:
634 : */
635 : PHP_FUNCTION(dom_element_get_elements_by_tag_name)
636 6 : {
637 : zval *id;
638 : xmlNodePtr elemp;
639 : int name_len;
640 : dom_object *intern, *namednode;
641 : char *name;
642 : xmlChar *local;
643 :
644 6 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &id, dom_element_class_entry, &name, &name_len, UG(utf8_conv)) == FAILURE) {
645 0 : return;
646 : }
647 :
648 6 : DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
649 :
650 6 : php_dom_create_interator(return_value, DOM_NODELIST TSRMLS_CC);
651 6 : namednode = (dom_object *)zend_objects_get_address(return_value TSRMLS_CC);
652 6 : local = xmlCharStrndup(name, name_len);
653 6 : dom_namednode_iter(intern, 0, namednode, NULL, local, NULL TSRMLS_CC);
654 : }
655 : /* }}} end dom_element_get_elements_by_tag_name */
656 :
657 : /* {{{ proto string dom_element_get_attribute_ns(string namespaceURI, string localName) U
658 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAttrNS
659 : Since: DOM Level 2
660 : */
661 : PHP_FUNCTION(dom_element_get_attribute_ns)
662 7 : {
663 : zval *id;
664 : xmlNodePtr elemp;
665 : xmlNsPtr nsptr;
666 : dom_object *intern;
667 7 : int uri_len = 0, name_len = 0;
668 : char *uri, *name;
669 : xmlChar *strattr;
670 :
671 7 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!&s&", &id, dom_element_class_entry, &uri, &uri_len, UG(utf8_conv), &name, &name_len, UG(utf8_conv)) == FAILURE) {
672 0 : return;
673 : }
674 :
675 7 : DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
676 :
677 7 : strattr = xmlGetNsProp(elemp, (xmlChar *) name, (xmlChar *) uri);
678 :
679 7 : if (strattr != NULL) {
680 5 : RETVAL_XML_STRING((char *)strattr, ZSTR_DUPLICATE);
681 5 : xmlFree(strattr);
682 : } else {
683 2 : if (xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
684 0 : nsptr = dom_get_nsdecl(elemp, (xmlChar *)name);
685 0 : if (nsptr != NULL) {
686 0 : RETVAL_XML_STRING((char *) nsptr->href, ZSTR_DUPLICATE);
687 : } else {
688 0 : RETVAL_EMPTY_UNICODE();
689 : }
690 : } else {
691 2 : RETVAL_EMPTY_UNICODE();
692 : }
693 : }
694 :
695 : }
696 : /* }}} end dom_element_get_attribute_ns */
697 :
698 : static xmlNsPtr _dom_new_reconNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns) /* {{{ */
699 1 : {
700 : xmlNsPtr def;
701 : xmlChar prefix[50];
702 1 : int counter = 1;
703 :
704 1 : if ((tree == NULL) || (ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) {
705 0 : return NULL;
706 : }
707 :
708 : /* Code taken from libxml2 (2.6.20) xmlNewReconciliedNs
709 : *
710 : * Find a close prefix which is not already in use.
711 : * Let's strip namespace prefixes longer than 20 chars !
712 : */
713 1 : if (ns->prefix == NULL)
714 1 : snprintf((char *) prefix, sizeof(prefix), "default");
715 : else
716 0 : snprintf((char *) prefix, sizeof(prefix), "%.20s", (char *)ns->prefix);
717 :
718 1 : def = xmlSearchNs(doc, tree, prefix);
719 2 : while (def != NULL) {
720 0 : if (counter > 1000) return(NULL);
721 0 : if (ns->prefix == NULL)
722 0 : snprintf((char *) prefix, sizeof(prefix), "default%d", counter++);
723 : else
724 0 : snprintf((char *) prefix, sizeof(prefix), "%.20s%d",
725 : (char *)ns->prefix, counter++);
726 0 : def = xmlSearchNs(doc, tree, prefix);
727 : }
728 :
729 : /*
730 : * OK, now we are ready to create a new one.
731 : */
732 1 : def = xmlNewNs(tree, ns->href, prefix);
733 1 : return(def);
734 : }
735 : /* }}} */
736 :
737 : /* {{{ proto void dom_element_set_attribute_ns(string namespaceURI, string qualifiedName, string value) U
738 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAttrNS
739 : Since: DOM Level 2
740 : */
741 : PHP_FUNCTION(dom_element_set_attribute_ns)
742 8 : {
743 : zval *id;
744 8 : xmlNodePtr elemp, nodep = NULL;
745 : xmlNsPtr nsptr;
746 : xmlAttr *attr;
747 8 : int uri_len = 0, name_len = 0, value_len = 0;
748 : char *uri, *name, *value;
749 8 : char *localname = NULL, *prefix = NULL;
750 : dom_object *intern;
751 8 : int errorcode = 0, stricterror, is_xmlns = 0, name_valid;
752 :
753 8 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!&s&s&", &id, dom_element_class_entry, &uri, &uri_len, UG(utf8_conv), &name, &name_len, UG(utf8_conv), &value, &value_len, UG(utf8_conv)) == FAILURE) {
754 0 : return;
755 : }
756 :
757 8 : if (name_len == 0) {
758 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute Name is required");
759 0 : RETURN_FALSE;
760 : }
761 :
762 8 : DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
763 :
764 8 : stricterror = dom_get_strict_error(intern->document);
765 :
766 8 : if (dom_node_is_read_only(elemp) == SUCCESS) {
767 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
768 0 : RETURN_NULL();
769 : }
770 :
771 8 : errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
772 :
773 8 : if (errorcode == 0) {
774 7 : if (uri_len > 0) {
775 6 : nodep = (xmlNodePtr) xmlHasNsProp(elemp, (xmlChar *) localname, (xmlChar *) uri);
776 6 : if (nodep != NULL && nodep->type != XML_ATTRIBUTE_DECL) {
777 0 : node_list_unlink(nodep->children TSRMLS_CC);
778 : }
779 :
780 6 : if (xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") && xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
781 0 : is_xmlns = 1;
782 0 : nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
783 : } else {
784 6 : nsptr = xmlSearchNsByHref(elemp->doc, elemp, (xmlChar *)uri);
785 6 : if (nsptr && nsptr->prefix == NULL) {
786 : xmlNsPtr tmpnsptr;
787 :
788 2 : tmpnsptr = nsptr->next;
789 6 : while (tmpnsptr) {
790 3 : if ((tmpnsptr->prefix != NULL) && (tmpnsptr->href != NULL) &&
791 : (xmlStrEqual(tmpnsptr->href, (xmlChar *) uri))) {
792 1 : nsptr = tmpnsptr;
793 1 : break;
794 : }
795 2 : tmpnsptr = tmpnsptr->next;
796 : }
797 2 : if (tmpnsptr == NULL) {
798 1 : nsptr = _dom_new_reconNs(elemp->doc, elemp, nsptr);
799 : }
800 : }
801 : }
802 :
803 6 : if (nsptr == NULL) {
804 0 : if (prefix == NULL) {
805 0 : errorcode = NAMESPACE_ERR;
806 : } else {
807 0 : if (is_xmlns == 1) {
808 0 : xmlNewNs(elemp, (xmlChar *)value, (xmlChar *)localname);
809 : } else {
810 0 : nsptr = dom_get_ns(elemp, uri, &errorcode, prefix);
811 : }
812 0 : xmlReconciliateNs(elemp->doc, elemp);
813 : }
814 : } else {
815 6 : if (is_xmlns == 1) {
816 0 : if (nsptr->href) {
817 0 : xmlFree((xmlChar *) nsptr->href);
818 : }
819 0 : nsptr->href = xmlStrdup((xmlChar *)value);
820 : }
821 : }
822 :
823 6 : if (errorcode == 0 && is_xmlns == 0) {
824 6 : attr = xmlSetNsProp(elemp, nsptr, (xmlChar *)localname, (xmlChar *)value);
825 : }
826 : } else {
827 1 : name_valid = xmlValidateName((xmlChar *) localname, 0);
828 1 : if (name_valid != 0) {
829 1 : errorcode = INVALID_CHARACTER_ERR;
830 1 : stricterror = 1;
831 : } else {
832 0 : attr = xmlHasProp(elemp, (xmlChar *)localname);
833 0 : if (attr != NULL && attr->type != XML_ATTRIBUTE_DECL) {
834 0 : node_list_unlink(attr->children TSRMLS_CC);
835 : }
836 0 : attr = xmlSetProp(elemp, (xmlChar *)localname, (xmlChar *)value);
837 : }
838 : }
839 : }
840 :
841 8 : xmlFree(localname);
842 8 : if (prefix != NULL) {
843 4 : xmlFree(prefix);
844 : }
845 :
846 8 : if (errorcode != 0) {
847 2 : php_dom_throw_error(errorcode, stricterror TSRMLS_CC);
848 : }
849 :
850 8 : RETURN_NULL();
851 : }
852 : /* }}} end dom_element_set_attribute_ns */
853 :
854 : /* {{{ proto void dom_element_remove_attribute_ns(string namespaceURI, string localName) U
855 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElRemAtNS
856 : Since: DOM Level 2
857 : */
858 : PHP_FUNCTION(dom_element_remove_attribute_ns)
859 1 : {
860 : zval *id;
861 : xmlNode *nodep;
862 : xmlAttr *attrp;
863 : xmlNsPtr nsptr;
864 : dom_object *intern;
865 : int name_len, uri_len;
866 : char *name, *uri;
867 :
868 1 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!&s&", &id, dom_element_class_entry, &uri, &uri_len, UG(utf8_conv), &name, &name_len, UG(utf8_conv)) == FAILURE) {
869 0 : return;
870 : }
871 :
872 1 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
873 :
874 1 : if (dom_node_is_read_only(nodep) == SUCCESS) {
875 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
876 0 : RETURN_NULL();
877 : }
878 :
879 1 : attrp = xmlHasNsProp(nodep, (xmlChar *)name, (xmlChar *)uri);
880 :
881 1 : nsptr = dom_get_nsdecl(nodep, (xmlChar *)name);
882 1 : if (nsptr != NULL) {
883 0 : if (xmlStrEqual((xmlChar *)uri, nsptr->href)) {
884 0 : if (nsptr->href != NULL) {
885 0 : xmlFree((char *) nsptr->href);
886 0 : nsptr->href = NULL;
887 : }
888 0 : if (nsptr->prefix != NULL) {
889 0 : xmlFree((char *) nsptr->prefix);
890 0 : nsptr->prefix = NULL;
891 : }
892 : } else {
893 0 : RETURN_NULL();
894 : }
895 : }
896 :
897 1 : if (attrp && attrp->type != XML_ATTRIBUTE_DECL) {
898 1 : if (php_dom_object_get_data((xmlNodePtr) attrp) == NULL) {
899 1 : node_list_unlink(attrp->children TSRMLS_CC);
900 1 : xmlUnlinkNode((xmlNodePtr) attrp);
901 1 : xmlFreeProp(attrp);
902 : } else {
903 0 : xmlUnlinkNode((xmlNodePtr) attrp);
904 : }
905 : }
906 :
907 1 : RETURN_NULL();
908 : }
909 : /* }}} end dom_element_remove_attribute_ns */
910 :
911 : /* {{{ proto DOMAttr dom_element_get_attribute_node_ns(string namespaceURI, string localName) U
912 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAtNodeNS
913 : Since: DOM Level 2
914 : */
915 : PHP_FUNCTION(dom_element_get_attribute_node_ns)
916 1 : {
917 1 : zval *id, *rv = NULL;
918 : xmlNodePtr elemp;
919 : xmlAttrPtr attrp;
920 : dom_object *intern;
921 : int uri_len, name_len, ret;
922 : char *uri, *name;
923 :
924 1 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!&s&", &id, dom_element_class_entry, &uri, &uri_len, UG(utf8_conv), &name, &name_len, UG(utf8_conv)) == FAILURE) {
925 0 : return;
926 : }
927 :
928 1 : DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
929 :
930 1 : attrp = xmlHasNsProp(elemp, (xmlChar *)name, (xmlChar *)uri);
931 :
932 1 : if (attrp == NULL) {
933 0 : RETURN_NULL();
934 : }
935 :
936 1 : DOM_RET_OBJ(rv, (xmlNodePtr) attrp, &ret, intern);
937 :
938 : }
939 : /* }}} end dom_element_get_attribute_node_ns */
940 :
941 : /* {{{ proto DOMAttr dom_element_set_attribute_node_ns(DOMAttr newAttr) U
942 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAtNodeNS
943 : Since: DOM Level 2
944 : */
945 : PHP_FUNCTION(dom_element_set_attribute_node_ns)
946 1 : {
947 1 : zval *id, *node, *rv = NULL;
948 : xmlNode *nodep;
949 : xmlNs *nsp;
950 1 : xmlAttr *attrp, *existattrp = NULL;
951 : dom_object *intern, *attrobj, *oldobj;
952 : int ret;
953 :
954 1 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &id, dom_element_class_entry, &node, dom_attr_class_entry) == FAILURE) {
955 0 : return;
956 : }
957 :
958 1 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
959 :
960 1 : if (dom_node_is_read_only(nodep) == SUCCESS) {
961 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
962 0 : RETURN_FALSE;
963 : }
964 :
965 1 : DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj);
966 :
967 1 : if (attrp->type != XML_ATTRIBUTE_NODE) {
968 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute node is required");
969 0 : RETURN_FALSE;
970 : }
971 :
972 1 : if (!(attrp->doc == NULL || attrp->doc == nodep->doc)) {
973 0 : php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
974 0 : RETURN_FALSE;
975 : }
976 :
977 1 : nsp = attrp->ns;
978 1 : if (nsp != NULL) {
979 1 : existattrp = xmlHasNsProp(nodep, nsp->href, attrp->name);
980 : } else {
981 0 : existattrp = xmlHasProp(nodep, attrp->name);
982 : }
983 :
984 1 : if (existattrp != NULL && existattrp->type != XML_ATTRIBUTE_DECL) {
985 0 : if ((oldobj = php_dom_object_get_data((xmlNodePtr) existattrp)) != NULL &&
986 : ((php_libxml_node_ptr *)oldobj->ptr)->node == (xmlNodePtr) attrp)
987 : {
988 0 : RETURN_NULL();
989 : }
990 0 : xmlUnlinkNode((xmlNodePtr) existattrp);
991 : }
992 :
993 1 : if (attrp->parent != NULL) {
994 0 : xmlUnlinkNode((xmlNodePtr) attrp);
995 : }
996 :
997 1 : if (attrp->doc == NULL && nodep->doc != NULL) {
998 0 : attrobj->document = intern->document;
999 0 : php_libxml_increment_doc_ref((php_libxml_node_object *)attrobj, NULL TSRMLS_CC);
1000 : }
1001 :
1002 1 : xmlAddChild(nodep, (xmlNodePtr) attrp);
1003 :
1004 : /* Returns old property if removed otherwise NULL */
1005 1 : if (existattrp != NULL) {
1006 0 : DOM_RET_OBJ(rv, (xmlNodePtr) existattrp, &ret, intern);
1007 : } else {
1008 1 : RETVAL_NULL();
1009 : }
1010 :
1011 : }
1012 : /* }}} end dom_element_set_attribute_node_ns */
1013 :
1014 : /* {{{ proto DOMNodeList dom_element_get_elements_by_tag_name_ns(string namespaceURI, string localName) U
1015 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C90942
1016 : Since: DOM Level 2
1017 : */
1018 : PHP_FUNCTION(dom_element_get_elements_by_tag_name_ns)
1019 3 : {
1020 : zval *id;
1021 : xmlNodePtr elemp;
1022 : int uri_len, name_len;
1023 : dom_object *intern, *namednode;
1024 : char *uri, *name;
1025 : xmlChar *local, *nsuri;
1026 :
1027 3 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&s&", &id, dom_element_class_entry, &uri, &uri_len, UG(utf8_conv), &name, &name_len, UG(utf8_conv)) == FAILURE) {
1028 0 : return;
1029 : }
1030 :
1031 3 : DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
1032 :
1033 3 : php_dom_create_interator(return_value, DOM_NODELIST TSRMLS_CC);
1034 3 : namednode = (dom_object *)zend_objects_get_address(return_value TSRMLS_CC);
1035 3 : local = xmlCharStrndup(name, name_len);
1036 3 : nsuri = xmlCharStrndup(uri, uri_len);
1037 3 : dom_namednode_iter(intern, 0, namednode, NULL, local, nsuri TSRMLS_CC);
1038 :
1039 : }
1040 : /* }}} end dom_element_get_elements_by_tag_name_ns */
1041 :
1042 : /* {{{ proto boolean dom_element_has_attribute(string name) U
1043 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttr
1044 : Since: DOM Level 2
1045 : */
1046 : PHP_FUNCTION(dom_element_has_attribute)
1047 11 : {
1048 : zval *id;
1049 : xmlNode *nodep;
1050 : dom_object *intern;
1051 : char *name;
1052 : int name_len;
1053 : xmlNodePtr attr;
1054 :
1055 11 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &id, dom_element_class_entry, &name, &name_len, UG(utf8_conv)) == FAILURE) {
1056 0 : return;
1057 : }
1058 :
1059 11 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
1060 :
1061 11 : attr = dom_get_dom1_attribute(nodep, (xmlChar *)name);
1062 11 : if (attr == NULL) {
1063 1 : RETURN_FALSE;
1064 : } else {
1065 10 : RETURN_TRUE;
1066 : }
1067 : }
1068 : /* }}} end dom_element_has_attribute */
1069 :
1070 : /* {{{ proto boolean dom_element_has_attribute_ns(string namespaceURI, string localName) U
1071 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttrNS
1072 : Since: DOM Level 2
1073 : */
1074 : PHP_FUNCTION(dom_element_has_attribute_ns)
1075 3 : {
1076 : zval *id;
1077 : xmlNodePtr elemp;
1078 : xmlNs *nsp;
1079 : dom_object *intern;
1080 : int uri_len, name_len;
1081 : char *uri, *name;
1082 : xmlChar *value;
1083 :
1084 3 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!&s&", &id, dom_element_class_entry, &uri, &uri_len, UG(utf8_conv), &name, &name_len, UG(utf8_conv)) == FAILURE) {
1085 0 : return;
1086 : }
1087 :
1088 3 : DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
1089 :
1090 3 : value = xmlGetNsProp(elemp, (xmlChar *)name, (xmlChar *)uri);
1091 :
1092 3 : if (value != NULL) {
1093 1 : xmlFree(value);
1094 1 : RETURN_TRUE;
1095 : } else {
1096 2 : if (xmlStrEqual((xmlChar *)uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
1097 0 : nsp = dom_get_nsdecl(elemp, (xmlChar *)name);
1098 0 : if (nsp != NULL) {
1099 0 : RETURN_TRUE;
1100 : }
1101 : }
1102 : }
1103 :
1104 2 : RETURN_FALSE;
1105 : }
1106 : /* }}} end dom_element_has_attribute_ns */
1107 :
1108 : static void php_set_attribute_id(xmlAttrPtr attrp, zend_bool is_id) /* {{{ */
1109 6 : {
1110 9 : if (is_id == 1 && attrp->atype != XML_ATTRIBUTE_ID) {
1111 : xmlChar *id_val;
1112 :
1113 3 : id_val = xmlNodeListGetString(attrp->doc, attrp->children, 1);
1114 3 : if (id_val != NULL) {
1115 3 : xmlAddID(NULL, attrp->doc, id_val, attrp);
1116 3 : xmlFree(id_val);
1117 : }
1118 : } else {
1119 3 : if (attrp->atype == XML_ATTRIBUTE_ID) {
1120 3 : xmlRemoveID(attrp->doc, attrp);
1121 3 : attrp->atype = 0;
1122 : }
1123 : }
1124 6 : }
1125 : /* }}} */
1126 :
1127 : /* {{{ proto void dom_element_set_id_attribute(string name, boolean isId) U
1128 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttr
1129 : Since: DOM Level 3
1130 : */
1131 : PHP_FUNCTION(dom_element_set_id_attribute)
1132 1 : {
1133 : zval *id;
1134 : xmlNode *nodep;
1135 : xmlAttrPtr attrp;
1136 : dom_object *intern;
1137 : char *name;
1138 : int name_len;
1139 : zend_bool is_id;
1140 :
1141 1 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&b", &id, dom_element_class_entry, &name, &name_len, UG(utf8_conv), &is_id) == FAILURE) {
1142 0 : return;
1143 : }
1144 :
1145 1 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
1146 :
1147 1 : if (dom_node_is_read_only(nodep) == SUCCESS) {
1148 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
1149 0 : RETURN_NULL();
1150 : }
1151 :
1152 1 : attrp = xmlHasNsProp(nodep, (xmlChar *)name, NULL);
1153 1 : if (attrp == NULL || attrp->type == XML_ATTRIBUTE_DECL) {
1154 0 : php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
1155 : } else {
1156 1 : php_set_attribute_id(attrp, is_id);
1157 : }
1158 :
1159 1 : RETURN_NULL();
1160 : }
1161 : /* }}} end dom_element_set_id_attribute */
1162 :
1163 : /* {{{ proto void dom_element_set_id_attribute_ns(string namespaceURI, string localName, boolean isId) U
1164 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNS
1165 : Since: DOM Level 3
1166 : */
1167 : PHP_FUNCTION(dom_element_set_id_attribute_ns)
1168 4 : {
1169 : zval *id;
1170 : xmlNodePtr elemp;
1171 : xmlAttrPtr attrp;
1172 : dom_object *intern;
1173 : int uri_len, name_len;
1174 : char *uri, *name;
1175 : zend_bool is_id;
1176 :
1177 4 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&s&b", &id, dom_element_class_entry, &uri, &uri_len, UG(utf8_conv), &name, &name_len, UG(utf8_conv), &is_id) == FAILURE) {
1178 0 : return;
1179 : }
1180 :
1181 4 : DOM_GET_OBJ(elemp, id, xmlNodePtr, intern);
1182 :
1183 4 : if (dom_node_is_read_only(elemp) == SUCCESS) {
1184 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
1185 0 : RETURN_NULL();
1186 : }
1187 :
1188 4 : attrp = xmlHasNsProp(elemp, (xmlChar *)name, (xmlChar *)uri);
1189 4 : if (attrp == NULL || attrp->type == XML_ATTRIBUTE_DECL) {
1190 0 : php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
1191 : } else {
1192 4 : php_set_attribute_id(attrp, is_id);
1193 : }
1194 :
1195 4 : RETURN_NULL();
1196 : }
1197 : /* }}} end dom_element_set_id_attribute_ns */
1198 :
1199 : /* {{{ proto void dom_element_set_id_attribute_node(attr idAttr, boolean isId) U
1200 : URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNode
1201 : Since: DOM Level 3
1202 : */
1203 : PHP_FUNCTION(dom_element_set_id_attribute_node)
1204 1 : {
1205 : zval *id, *node;
1206 : xmlNode *nodep;
1207 : xmlAttrPtr attrp;
1208 : dom_object *intern, *attrobj;
1209 : zend_bool is_id;
1210 :
1211 1 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OOb", &id, dom_element_class_entry, &node, dom_attr_class_entry, &is_id) == FAILURE) {
1212 0 : return;
1213 : }
1214 :
1215 1 : DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
1216 :
1217 1 : if (dom_node_is_read_only(nodep) == SUCCESS) {
1218 0 : php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
1219 0 : RETURN_NULL();
1220 : }
1221 :
1222 1 : DOM_GET_OBJ(attrp, node, xmlAttrPtr, attrobj);
1223 :
1224 1 : if (attrp->parent != nodep) {
1225 0 : php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
1226 : } else {
1227 1 : php_set_attribute_id(attrp, is_id);
1228 : }
1229 :
1230 1 : RETURN_NULL();
1231 : }
1232 : /* }}} end dom_element_set_id_attribute_node */
1233 :
1234 : #endif
1235 :
1236 : /*
1237 : * Local variables:
1238 : * tab-width: 4
1239 : * c-basic-offset: 4
1240 : * End:
1241 : * vim600: noet sw=4 ts=4 fdm=marker
1242 : * vim<600: noet sw=4 ts=4
1243 : */
|