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

Generated by: LCOV version 1.10

Generated at Thu, 21 May 2015 19:58:54 +0000 (6 days ago)

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