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