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

LTP GCOV extension - code coverage report
Current view: directory - dom - element.c
Test: PHP Code Coverage
Date: 2009-11-21 Instrumented lines: 466
Code covered: 70.2 % Executed lines: 327
Legend: not executed executed

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

Generated by: LTP GCOV extension version 1.5

Generated at Sat, 21 Nov 2009 12:26:59 +0000 (3 days ago)

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