PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LCOV - code coverage report
Current view: top level - ext/dom - element.c (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 333 467 71.3 %
Date: 2014-10-30 Functions: 24 24 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10

Generated at Thu, 30 Oct 2014 07:41:29 +0000 (2 days ago)

Copyright © 2005-2014 The PHP Group
All rights reserved.