2003-06-05 17:06:52 +00:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2019-01-30 09:03:12 +00:00
| Copyright ( c ) The PHP Group |
2003-06-05 17:06:52 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2006-01-01 12:51:34 +00:00
| This source file is subject to version 3.01 of the PHP license , |
2003-06-05 17:06:52 +00:00
| that is bundled with this package in the file LICENSE , and is |
2003-06-10 20:04:29 +00:00
| available through the world - wide - web at the following url : |
2021-05-06 10:16:35 +00:00
| https : //www.php.net/license/3_01.txt |
2003-06-05 17:06:52 +00:00
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world - wide - web , please send a note to |
| license @ php . net so we can mail you a copy immediately . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Authors : Christian Stocker < chregu @ php . net > |
| Rob Richards < rrichards @ php . net > |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "php.h"
2020-05-12 20:54:43 +00:00
# if defined(HAVE_LIBXML) && defined(HAVE_DOM)
2003-06-05 17:06:52 +00:00
# include "php_dom.h"
2008-01-29 15:23:18 +00:00
2003-06-05 17:06:52 +00:00
/*
2015-01-03 09:22:58 +00:00
* class DOMNode
2003-06-05 17:06:52 +00:00
*
2018-06-24 20:31:55 +00:00
* URL : https : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1950641247
2015-01-03 09:22:58 +00:00
* Since :
2003-06-05 17:06:52 +00:00
*/
2015-01-03 09:22:58 +00:00
/* {{{ nodeName string
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D095
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_node_name_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
xmlNode * nodep ;
2003-10-05 11:52:22 +00:00
xmlNsPtr ns ;
2003-06-05 17:06:52 +00:00
char * str = NULL ;
2003-10-05 11:52:22 +00:00
xmlChar * qname = NULL ;
2003-06-05 17:06:52 +00:00
2003-07-07 19:37:32 +00:00
nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-06-05 17:06:52 +00:00
switch ( nodep - > type ) {
case XML_ATTRIBUTE_NODE :
case XML_ELEMENT_NODE :
2003-10-05 11:52:22 +00:00
ns = nodep - > ns ;
if ( ns ! = NULL & & ns - > prefix ) {
qname = xmlStrdup ( ns - > prefix ) ;
2014-09-03 19:35:53 +00:00
qname = xmlStrcat ( qname , ( xmlChar * ) " : " ) ;
2003-10-05 21:53:08 +00:00
qname = xmlStrcat ( qname , nodep - > name ) ;
2014-09-03 19:35:53 +00:00
str = ( char * ) qname ;
2003-10-05 21:53:08 +00:00
} else {
str = ( char * ) nodep - > name ;
2003-10-05 11:52:22 +00:00
}
break ;
2003-10-20 15:50:34 +00:00
case XML_NAMESPACE_DECL :
ns = nodep - > ns ;
if ( ns ! = NULL & & ns - > prefix ) {
2014-09-03 19:35:53 +00:00
qname = xmlStrdup ( ( xmlChar * ) " xmlns " ) ;
qname = xmlStrcat ( qname , ( xmlChar * ) " : " ) ;
2003-10-20 15:50:34 +00:00
qname = xmlStrcat ( qname , nodep - > name ) ;
2014-09-03 19:35:53 +00:00
str = ( char * ) qname ;
2003-10-20 15:50:34 +00:00
} else {
str = ( char * ) nodep - > name ;
}
break ;
2003-06-05 17:06:52 +00:00
case XML_DOCUMENT_TYPE_NODE :
case XML_DTD_NODE :
case XML_PI_NODE :
case XML_ENTITY_DECL :
case XML_ENTITY_REF_NODE :
case XML_NOTATION_NODE :
str = ( char * ) nodep - > name ;
break ;
case XML_CDATA_SECTION_NODE :
str = " #cdata-section " ;
break ;
case XML_COMMENT_NODE :
str = " #comment " ;
break ;
case XML_HTML_DOCUMENT_NODE :
case XML_DOCUMENT_NODE :
str = " #document " ;
break ;
case XML_DOCUMENT_FRAG_NODE :
str = " #document-fragment " ;
break ;
case XML_TEXT_NODE :
str = " #text " ;
break ;
2020-04-19 12:35:25 +00:00
EMPTY_SWITCH_DEFAULT_CASE ( ) ;
2003-06-05 17:06:52 +00:00
}
2014-04-15 18:30:41 +00:00
if ( str ! = NULL ) {
ZVAL_STRING ( retval , str ) ;
2003-06-05 17:06:52 +00:00
} else {
2014-04-15 18:30:41 +00:00
ZVAL_EMPTY_STRING ( retval ) ;
2003-06-05 17:06:52 +00:00
}
2015-01-03 09:22:58 +00:00
2003-10-05 11:52:22 +00:00
if ( qname ! = NULL ) {
xmlFree ( qname ) ;
}
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ nodeValue string
readonly = no
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D080
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_node_value_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
char * str = NULL ;
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2019-02-18 16:14:22 +00:00
/* Access to Element node is implemented as a convenience method */
2003-06-05 17:06:52 +00:00
switch ( nodep - > type ) {
case XML_ATTRIBUTE_NODE :
case XML_TEXT_NODE :
2015-09-06 13:36:43 +00:00
case XML_ELEMENT_NODE :
2003-06-05 17:06:52 +00:00
case XML_COMMENT_NODE :
case XML_CDATA_SECTION_NODE :
case XML_PI_NODE :
2014-09-03 19:35:53 +00:00
str = ( char * ) xmlNodeGetContent ( nodep ) ;
2003-06-05 17:06:52 +00:00
break ;
2003-10-20 15:50:34 +00:00
case XML_NAMESPACE_DECL :
2014-09-03 19:35:53 +00:00
str = ( char * ) xmlNodeGetContent ( nodep - > children ) ;
2003-10-20 15:50:34 +00:00
break ;
2003-06-05 17:06:52 +00:00
default :
str = NULL ;
break ;
}
if ( str ! = NULL ) {
2014-04-15 18:30:41 +00:00
ZVAL_STRING ( retval , str ) ;
2003-06-05 17:06:52 +00:00
xmlFree ( str ) ;
} else {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2003-06-05 17:06:52 +00:00
}
return SUCCESS ;
}
2014-12-13 22:06:14 +00:00
int dom_node_node_value_write ( dom_object * obj , zval * newval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2019-02-26 14:32:18 +00:00
zend_string * str ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2019-06-05 22:47:22 +00:00
str = zval_try_get_string ( newval ) ;
if ( UNEXPECTED ( ! str ) ) {
2019-02-26 14:32:18 +00:00
return FAILURE ;
}
2019-02-18 16:14:22 +00:00
/* Access to Element node is implemented as a convenience method */
2003-06-05 17:06:52 +00:00
switch ( nodep - > type ) {
2003-12-09 21:56:42 +00:00
case XML_ELEMENT_NODE :
2003-06-05 17:06:52 +00:00
case XML_ATTRIBUTE_NODE :
if ( nodep - > children ) {
2014-12-13 22:06:14 +00:00
node_list_unlink ( nodep - > children ) ;
2017-06-02 22:38:02 +00:00
php_libxml_node_free_list ( ( xmlNodePtr ) nodep - > children ) ;
nodep - > children = NULL ;
2003-06-05 17:06:52 +00:00
}
2020-09-29 22:25:49 +00:00
ZEND_FALLTHROUGH ;
2003-06-05 17:06:52 +00:00
case XML_TEXT_NODE :
case XML_COMMENT_NODE :
case XML_CDATA_SECTION_NODE :
case XML_PI_NODE :
2019-02-26 14:32:18 +00:00
xmlNodeSetContentLen ( nodep , ( xmlChar * ) ZSTR_VAL ( str ) , ZSTR_LEN ( str ) + 1 ) ;
break ;
2003-06-05 17:06:52 +00:00
default :
break ;
}
2019-02-26 14:32:18 +00:00
zend_string_release_ex ( str , 0 ) ;
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2004-11-18 19:54:30 +00:00
/* {{{ nodeType int
2015-01-03 09:22:58 +00:00
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-111237558
2003-08-24 10:23:43 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_node_type_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
xmlNode * nodep ;
2003-07-07 19:37:32 +00:00
nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-07-12 17:29:20 +00:00
/* Specs dictate that they are both type XML_DOCUMENT_TYPE_NODE */
if ( nodep - > type = = XML_DTD_NODE ) {
2014-08-25 17:24:55 +00:00
ZVAL_LONG ( retval , XML_DOCUMENT_TYPE_NODE ) ;
2003-07-12 17:29:20 +00:00
} else {
2014-08-25 17:24:55 +00:00
ZVAL_LONG ( retval , nodep - > type ) ;
2003-07-12 17:29:20 +00:00
}
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ parentNode DomNode
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1060184317
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_parent_node_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
xmlNode * nodep , * nodeparent ;
2003-07-07 19:37:32 +00:00
nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-06-05 17:06:52 +00:00
nodeparent = nodep - > parent ;
if ( ! nodeparent ) {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2009-03-13 13:43:29 +00:00
return SUCCESS ;
2003-06-05 17:06:52 +00:00
}
2014-12-13 22:06:14 +00:00
php_dom_create_object ( nodeparent , retval , obj ) ;
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ childNodes DomNodeList
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1451460987
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_child_nodes_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2003-11-29 20:40:18 +00:00
dom_object * intern ;
2003-07-07 19:37:32 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2020-02-17 21:49:59 +00:00
php_dom_create_iterator ( retval , DOM_NODELIST ) ;
2020-02-14 09:55:17 +00:00
intern = Z_DOMOBJ_P ( retval ) ;
dom_namednode_iter ( obj , XML_ELEMENT_NODE , intern , NULL , NULL , NULL ) ;
2003-07-12 17:29:20 +00:00
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ firstChild DomNode
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-169727388
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_first_child_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2003-07-12 17:29:20 +00:00
xmlNode * nodep , * first = NULL ;
2003-06-05 17:06:52 +00:00
2003-07-07 19:37:32 +00:00
nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-07-12 17:29:20 +00:00
if ( dom_node_children_valid ( nodep ) = = SUCCESS ) {
first = nodep - > children ;
}
2003-06-05 17:06:52 +00:00
if ( ! first ) {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2009-03-13 13:43:29 +00:00
return SUCCESS ;
2003-06-05 17:06:52 +00:00
}
2014-12-13 22:06:14 +00:00
php_dom_create_object ( first , retval , obj ) ;
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ lastChild DomNode
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-61AD09FB
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_last_child_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2003-07-12 17:29:20 +00:00
xmlNode * nodep , * last = NULL ;
2003-06-05 17:06:52 +00:00
2003-07-07 19:37:32 +00:00
nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-07-12 17:29:20 +00:00
if ( dom_node_children_valid ( nodep ) = = SUCCESS ) {
last = nodep - > last ;
}
2003-06-05 17:06:52 +00:00
if ( ! last ) {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2009-03-13 13:43:29 +00:00
return SUCCESS ;
2003-06-05 17:06:52 +00:00
}
2014-12-13 22:06:14 +00:00
php_dom_create_object ( last , retval , obj ) ;
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ previousSibling DomNode
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-640FB3C8
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_previous_sibling_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
xmlNode * nodep , * prevsib ;
2003-07-07 19:37:32 +00:00
nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-06-05 17:06:52 +00:00
prevsib = nodep - > prev ;
if ( ! prevsib ) {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2009-03-13 13:43:29 +00:00
return SUCCESS ;
2003-06-05 17:06:52 +00:00
}
2014-12-13 22:06:14 +00:00
php_dom_create_object ( prevsib , retval , obj ) ;
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2004-11-18 19:54:30 +00:00
/* {{{ nextSibling DomNode
2015-01-03 09:22:58 +00:00
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6AC54C2F
2003-08-24 10:23:43 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_next_sibling_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
xmlNode * nodep , * nextsib ;
2003-07-07 19:37:32 +00:00
nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-06-05 17:06:52 +00:00
nextsib = nodep - > next ;
if ( ! nextsib ) {
2017-01-10 19:48:45 +00:00
ZVAL_NULL ( retval ) ;
return SUCCESS ;
2003-06-05 17:06:52 +00:00
}
2014-12-13 22:06:14 +00:00
php_dom_create_object ( nextsib , retval , obj ) ;
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2020-02-28 15:13:39 +00:00
/* {{{ previousElementSibling DomNode
readonly = yes
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-640FB3C8
Since :
*/
int dom_node_previous_element_sibling_read ( dom_object * obj , zval * retval )
{
xmlNode * nodep , * prevsib ;
nodep = dom_object_get_node ( obj ) ;
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2020-02-28 15:13:39 +00:00
return FAILURE ;
}
prevsib = nodep - > prev ;
while ( prevsib & & prevsib - > type ! = XML_ELEMENT_NODE ) {
prevsib = prevsib - > prev ;
}
if ( ! prevsib ) {
ZVAL_NULL ( retval ) ;
return SUCCESS ;
}
php_dom_create_object ( prevsib , retval , obj ) ;
return SUCCESS ;
}
/* }}} */
/* {{{ nextElementSibling DomNode
readonly = yes
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6AC54C2F
Since :
*/
int dom_node_next_element_sibling_read ( dom_object * obj , zval * retval )
{
xmlNode * nodep , * nextsib ;
nodep = dom_object_get_node ( obj ) ;
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2020-02-28 15:13:39 +00:00
return FAILURE ;
}
nextsib = nodep - > next ;
while ( nextsib ! = NULL & & nextsib - > type ! = XML_ELEMENT_NODE ) {
nextsib = nextsib - > next ;
}
if ( ! nextsib ) {
ZVAL_NULL ( retval ) ;
return SUCCESS ;
}
php_dom_create_object ( nextsib , retval , obj ) ;
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ attributes DomNamedNodeMap
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-84CF096
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_attributes_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2003-11-29 20:40:18 +00:00
dom_object * intern ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-12-02 15:17:02 +00:00
if ( nodep - > type = = XML_ELEMENT_NODE ) {
2020-02-17 21:49:59 +00:00
php_dom_create_iterator ( retval , DOM_NAMEDNODEMAP ) ;
2014-04-15 18:30:41 +00:00
intern = Z_DOMOBJ_P ( retval ) ;
2014-12-13 22:06:14 +00:00
dom_namednode_iter ( obj , XML_ATTRIBUTE_NODE , intern , NULL , NULL , NULL ) ;
2003-12-02 15:17:02 +00:00
} else {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2003-12-02 15:17:02 +00:00
}
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ ownerDocument DomDocument
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-node-ownerDoc
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2014-12-13 22:06:14 +00:00
int dom_node_owner_document_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
xmlDocPtr docp ;
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-06-05 17:06:52 +00:00
if ( nodep - > type = = XML_DOCUMENT_NODE | | nodep - > type = = XML_HTML_DOCUMENT_NODE ) {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
docp = nodep - > doc ;
if ( ! docp ) {
return FAILURE ;
}
2014-12-13 22:06:14 +00:00
php_dom_create_object ( ( xmlNodePtr ) docp , retval , obj ) ;
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ namespaceUri string
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSname
Since : DOM Level 2
*/
2014-12-13 22:06:14 +00:00
int dom_node_namespace_uri_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2023-06-19 17:33:44 +00:00
char * str = NULL ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-06-05 17:06:52 +00:00
switch ( nodep - > type ) {
case XML_ELEMENT_NODE :
case XML_ATTRIBUTE_NODE :
2003-10-20 15:50:34 +00:00
case XML_NAMESPACE_DECL :
2003-06-05 17:06:52 +00:00
if ( nodep - > ns ! = NULL ) {
2023-06-19 17:33:44 +00:00
str = ( char * ) nodep - > ns - > href ;
2003-06-05 17:06:52 +00:00
}
break ;
default :
2023-06-19 17:33:44 +00:00
str = NULL ;
2003-06-05 17:06:52 +00:00
break ;
}
2023-06-19 17:33:44 +00:00
if ( str ! = NULL ) {
ZVAL_STRING ( retval , str ) ;
} else {
ZVAL_NULL ( retval ) ;
}
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ prefix string
readonly = no
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSPrefix
Since : DOM Level 2
*/
2014-12-13 22:06:14 +00:00
int dom_node_prefix_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
xmlNsPtr ns ;
char * str = NULL ;
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-06-05 17:06:52 +00:00
switch ( nodep - > type ) {
case XML_ELEMENT_NODE :
case XML_ATTRIBUTE_NODE :
2003-10-20 15:50:34 +00:00
case XML_NAMESPACE_DECL :
2003-06-05 17:06:52 +00:00
ns = nodep - > ns ;
2003-07-27 17:57:06 +00:00
if ( ns ! = NULL & & ns - > prefix ) {
str = ( char * ) ns - > prefix ;
2003-06-05 17:06:52 +00:00
}
break ;
default :
str = NULL ;
break ;
}
if ( str = = NULL ) {
2014-04-15 18:30:41 +00:00
ZVAL_EMPTY_STRING ( retval ) ;
2003-06-05 17:06:52 +00:00
} else {
2014-04-15 18:30:41 +00:00
ZVAL_STRING ( retval , str ) ;
2003-06-05 17:06:52 +00:00
}
return SUCCESS ;
}
2014-12-13 22:06:14 +00:00
int dom_node_prefix_write ( dom_object * obj , zval * newval )
2003-06-05 17:06:52 +00:00
{
2021-05-14 12:45:17 +00:00
zend_string * prefix_str ;
2004-02-18 20:37:30 +00:00
xmlNode * nodep , * nsnode = NULL ;
xmlNsPtr ns = NULL , curns ;
2003-06-05 17:06:52 +00:00
char * strURI ;
char * prefix ;
2003-07-07 19:37:32 +00:00
nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-06-05 17:06:52 +00:00
switch ( nodep - > type ) {
case XML_ELEMENT_NODE :
2004-02-18 20:37:30 +00:00
nsnode = nodep ;
2020-09-29 22:25:49 +00:00
ZEND_FALLTHROUGH ;
2003-06-05 17:06:52 +00:00
case XML_ATTRIBUTE_NODE :
2004-02-18 20:37:30 +00:00
if ( nsnode = = NULL ) {
nsnode = nodep - > parent ;
if ( nsnode = = NULL ) {
nsnode = xmlDocGetRootElement ( nodep - > doc ) ;
}
}
2021-05-14 12:45:17 +00:00
prefix_str = zval_try_get_string ( newval ) ;
if ( UNEXPECTED ( ! prefix_str ) ) {
2019-02-26 14:32:18 +00:00
return FAILURE ;
}
2021-05-14 12:45:17 +00:00
prefix = ZSTR_VAL ( prefix_str ) ;
2004-02-18 20:37:30 +00:00
if ( nsnode & & nodep - > ns ! = NULL & & ! xmlStrEqual ( nodep - > ns - > prefix , ( xmlChar * ) prefix ) ) {
2003-07-27 17:57:06 +00:00
strURI = ( char * ) nodep - > ns - > href ;
2015-01-03 09:22:58 +00:00
if ( strURI = = NULL | |
2021-05-14 12:45:17 +00:00
( zend_string_equals_literal ( prefix_str , " xml " ) & & strcmp ( strURI , ( char * ) XML_XML_NAMESPACE ) ) | |
( nodep - > type = = XML_ATTRIBUTE_NODE & & zend_string_equals_literal ( prefix_str , " xmlns " ) & &
2014-09-03 19:35:53 +00:00
strcmp ( strURI , ( char * ) DOM_XMLNS_NAMESPACE ) ) | |
( nodep - > type = = XML_ATTRIBUTE_NODE & & ! strcmp ( ( char * ) nodep - > name , " xmlns " ) ) ) {
2004-02-18 20:37:30 +00:00
ns = NULL ;
} else {
curns = nsnode - > nsDef ;
while ( curns ! = NULL ) {
if ( xmlStrEqual ( ( xmlChar * ) prefix , curns - > prefix ) & & xmlStrEqual ( nodep - > ns - > href , curns - > href ) ) {
ns = curns ;
break ;
}
curns = curns - > next ;
2004-02-15 14:05:17 +00:00
}
2004-02-18 20:37:30 +00:00
if ( ns = = NULL ) {
ns = xmlNewNs ( nsnode , nodep - > ns - > href , ( xmlChar * ) prefix ) ;
2003-07-27 17:57:06 +00:00
}
2004-02-18 20:37:30 +00:00
}
2003-07-27 17:57:06 +00:00
2004-02-18 20:37:30 +00:00
if ( ns = = NULL ) {
2021-05-14 12:45:17 +00:00
zend_string_release_ex ( prefix_str , 0 ) ;
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( NAMESPACE_ERR , dom_get_strict_error ( obj - > document ) ) ;
2004-02-18 20:37:30 +00:00
return FAILURE ;
2003-06-05 17:06:52 +00:00
}
2004-02-18 20:37:30 +00:00
xmlSetNs ( nodep , ns ) ;
2003-07-27 17:57:06 +00:00
}
2021-05-14 12:45:17 +00:00
zend_string_release_ex ( prefix_str , 0 ) ;
2003-06-05 17:06:52 +00:00
break ;
default :
break ;
}
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ localName string
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSLocalN
Since : DOM Level 2
*/
2014-12-13 22:06:14 +00:00
int dom_node_local_name_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-10-20 15:50:34 +00:00
if ( nodep - > type = = XML_ELEMENT_NODE | | nodep - > type = = XML_ATTRIBUTE_NODE | | nodep - > type = = XML_NAMESPACE_DECL ) {
2014-04-15 18:30:41 +00:00
ZVAL_STRING ( retval , ( char * ) ( nodep - > name ) ) ;
2003-06-05 17:06:52 +00:00
} else {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2003-06-05 17:06:52 +00:00
}
return SUCCESS ;
}
/* }}} */
2004-11-18 19:54:30 +00:00
/* {{{ baseURI string
2003-08-24 10:23:43 +00:00
readonly = yes
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-baseURI
Since : DOM Level 3
*/
2014-12-13 22:06:14 +00:00
int dom_node_base_uri_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2003-10-05 11:52:22 +00:00
xmlChar * baseuri ;
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2003-10-05 11:52:22 +00:00
baseuri = xmlNodeGetBase ( nodep - > doc , nodep ) ;
if ( baseuri ) {
2014-04-15 18:30:41 +00:00
ZVAL_STRING ( retval , ( char * ) ( baseuri ) ) ;
2003-10-05 11:52:22 +00:00
xmlFree ( baseuri ) ;
} else {
2014-04-15 18:30:41 +00:00
ZVAL_NULL ( retval ) ;
2003-10-05 11:52:22 +00:00
}
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2015-01-03 09:22:58 +00:00
/* {{{ textContent string
readonly = no
2003-06-05 17:06:52 +00:00
URL : http : //www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-textContent
Since : DOM Level 3
*/
2014-12-13 22:06:14 +00:00
int dom_node_text_content_read ( dom_object * obj , zval * retval )
2003-06-05 17:06:52 +00:00
{
2014-04-15 18:30:41 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2003-06-05 17:06:52 +00:00
char * str = NULL ;
2004-02-16 13:06:33 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2004-02-16 13:06:33 +00:00
return FAILURE ;
}
2014-09-03 19:35:53 +00:00
str = ( char * ) xmlNodeGetContent ( nodep ) ;
2003-06-05 17:06:52 +00:00
2014-04-15 18:30:41 +00:00
if ( str ! = NULL ) {
ZVAL_STRING ( retval , str ) ;
2006-01-25 17:34:05 +00:00
xmlFree ( str ) ;
2003-06-05 17:06:52 +00:00
} else {
2014-04-15 18:30:41 +00:00
ZVAL_EMPTY_STRING ( retval ) ;
2003-06-05 17:06:52 +00:00
}
return SUCCESS ;
}
2014-12-13 22:06:14 +00:00
int dom_node_text_content_write ( dom_object * obj , zval * newval )
2003-06-05 17:06:52 +00:00
{
2014-09-01 22:34:18 +00:00
xmlNode * nodep = dom_object_get_node ( obj ) ;
2014-09-01 22:54:52 +00:00
zend_string * str ;
2014-09-01 22:34:18 +00:00
if ( nodep = = NULL ) {
2021-03-16 16:24:30 +00:00
php_dom_throw_error ( INVALID_STATE_ERR , 1 ) ;
2014-09-01 22:34:18 +00:00
return FAILURE ;
}
2019-06-05 22:47:22 +00:00
str = zval_try_get_string ( newval ) ;
if ( UNEXPECTED ( ! str ) ) {
2019-02-26 14:32:18 +00:00
return FAILURE ;
}
2023-01-06 18:51:49 +00:00
const xmlChar * xmlChars = ( const xmlChar * ) ZSTR_VAL ( str ) ;
int type = nodep - > type ;
/* We can't directly call xmlNodeSetContent, because it might encode the string through
* xmlStringLenGetNodeList for types XML_DOCUMENT_FRAG_NODE , XML_ELEMENT_NODE , XML_ATTRIBUTE_NODE .
* See tree . c : xmlNodeSetContent in libxml .
* In these cases we need to use a text node to avoid the encoding .
* For the other cases , we * can * rely on xmlNodeSetContent because it is either a no - op , or handles
* the content without encoding . */
if ( type = = XML_DOCUMENT_FRAG_NODE | | type = = XML_ELEMENT_NODE | | type = = XML_ATTRIBUTE_NODE ) {
2017-06-02 22:38:02 +00:00
if ( nodep - > children ) {
node_list_unlink ( nodep - > children ) ;
php_libxml_node_free_list ( ( xmlNodePtr ) nodep - > children ) ;
nodep - > children = NULL ;
}
2023-01-06 18:51:49 +00:00
xmlNode * textNode = xmlNewText ( xmlChars ) ;
xmlAddChild ( nodep , textNode ) ;
} else {
xmlNodeSetContent ( nodep , xmlChars ) ;
2017-06-02 22:38:02 +00:00
}
2018-05-28 13:27:12 +00:00
zend_string_release_ex ( str , 0 ) ;
2014-09-01 22:34:18 +00:00
2003-06-05 17:06:52 +00:00
return SUCCESS ;
}
/* }}} */
2014-12-13 22:06:14 +00:00
static xmlNodePtr _php_dom_insert_fragment ( xmlNodePtr nodep , xmlNodePtr prevsib , xmlNodePtr nextsib , xmlNodePtr fragment , dom_object * intern , dom_object * childobj ) /* { { { */
2005-04-08 15:58:24 +00:00
{
xmlNodePtr newchild , node ;
newchild = fragment - > children ;
if ( newchild ) {
if ( prevsib = = NULL ) {
nodep - > children = newchild ;
} else {
prevsib - > next = newchild ;
}
newchild - > prev = prevsib ;
if ( nextsib = = NULL ) {
nodep - > last = fragment - > last ;
} else {
fragment - > last - > next = nextsib ;
nextsib - > prev = fragment - > last ;
}
node = newchild ;
while ( node ! = NULL ) {
node - > parent = nodep ;
if ( node - > doc ! = nodep - > doc ) {
xmlSetTreeDoc ( node , nodep - > doc ) ;
if ( node - > _private ! = NULL ) {
childobj = node - > _private ;
childobj - > document = intern - > document ;
2014-12-13 22:06:14 +00:00
php_libxml_increment_doc_ref ( ( php_libxml_node_object * ) childobj , NULL ) ;
2005-04-08 15:58:24 +00:00
}
}
if ( node = = fragment - > last ) {
break ;
}
node = node - > next ;
}
2003-06-05 17:06:52 +00:00
2005-04-08 15:58:24 +00:00
fragment - > children = NULL ;
fragment - > last = NULL ;
}
return newchild ;
}
2008-08-14 08:39:05 +00:00
/* }}} */
2003-06-05 17:06:52 +00:00
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
2003-08-24 10:23:43 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , insertBefore )
2003-06-05 17:06:52 +00:00
{
2011-08-08 13:45:18 +00:00
zval * id , * node , * ref = NULL ;
2003-06-05 17:06:52 +00:00
xmlNodePtr child , new_child , parentp , refp ;
2003-06-09 20:20:55 +00:00
dom_object * intern , * childobj , * refpobj ;
2003-08-24 10:23:43 +00:00
int ret , stricterror ;
2003-06-05 17:06:52 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " O|O! " , & node , dom_node_class_entry , & ref , dom_node_class_entry ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-06-05 17:06:52 +00:00
}
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( parentp , id , xmlNodePtr , intern ) ;
2004-06-13 10:12:47 +00:00
if ( dom_node_children_valid ( parentp ) = = FAILURE ) {
RETURN_FALSE ;
}
2003-06-09 20:20:55 +00:00
DOM_GET_OBJ ( child , node , xmlNodePtr , childobj ) ;
2003-06-05 17:06:52 +00:00
new_child = NULL ;
2003-08-24 10:23:43 +00:00
stricterror = dom_get_strict_error ( intern - > document ) ;
if ( dom_node_is_read_only ( parentp ) = = SUCCESS | |
2003-07-12 17:29:20 +00:00
( child - > parent ! = NULL & & dom_node_is_read_only ( child - > parent ) = = SUCCESS ) ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( NO_MODIFICATION_ALLOWED_ERR , stricterror ) ;
2003-07-12 17:29:20 +00:00
RETURN_FALSE ;
}
2003-06-05 17:06:52 +00:00
if ( dom_hierarchy ( parentp , child ) = = FAILURE ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( HIERARCHY_REQUEST_ERR , stricterror ) ;
2003-06-09 20:20:55 +00:00
RETURN_FALSE ;
2003-06-05 17:06:52 +00:00
}
2003-06-09 20:20:55 +00:00
2003-06-05 17:06:52 +00:00
if ( child - > doc ! = parentp - > doc & & child - > doc ! = NULL ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( WRONG_DOCUMENT_ERR , stricterror ) ;
2003-06-05 17:06:52 +00:00
RETURN_FALSE ;
}
2004-06-13 10:12:47 +00:00
if ( child - > type = = XML_DOCUMENT_FRAG_NODE & & child - > children = = NULL ) {
2020-04-19 12:35:25 +00:00
/* TODO Drop Warning? */
2014-12-13 22:06:14 +00:00
php_error_docref ( NULL , E_WARNING , " Document Fragment is empty " ) ;
2004-06-13 10:12:47 +00:00
RETURN_FALSE ;
}
2003-06-09 20:20:55 +00:00
if ( child - > doc = = NULL & & parentp - > doc ! = NULL ) {
childobj - > document = intern - > document ;
2014-12-13 22:06:14 +00:00
php_libxml_increment_doc_ref ( ( php_libxml_node_object * ) childobj , NULL ) ;
2003-06-09 20:20:55 +00:00
}
2003-06-05 17:06:52 +00:00
if ( ref ! = NULL ) {
2003-06-09 20:20:55 +00:00
DOM_GET_OBJ ( refp , ref , xmlNodePtr , refpobj ) ;
2003-06-05 17:06:52 +00:00
if ( refp - > parent ! = parentp ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( NOT_FOUND_ERR , stricterror ) ;
2003-06-05 17:06:52 +00:00
RETURN_FALSE ;
}
if ( child - > parent ! = NULL ) {
xmlUnlinkNode ( child ) ;
}
2015-01-03 09:22:58 +00:00
if ( child - > type = = XML_TEXT_NODE & & ( refp - > type = = XML_TEXT_NODE | |
2004-06-13 10:12:47 +00:00
( refp - > prev ! = NULL & & refp - > prev - > type = = XML_TEXT_NODE ) ) ) {
if ( child - > doc = = NULL ) {
xmlSetTreeDoc ( child , parentp - > doc ) ;
2003-06-05 17:06:52 +00:00
}
2004-06-13 10:12:47 +00:00
new_child = child ;
new_child - > parent = refp - > parent ;
new_child - > next = refp ;
new_child - > prev = refp - > prev ;
refp - > prev = new_child ;
if ( new_child - > prev ! = NULL ) {
new_child - > prev - > next = new_child ;
2003-06-05 17:06:52 +00:00
}
2004-06-13 10:12:47 +00:00
if ( new_child - > parent ! = NULL ) {
if ( new_child - > parent - > children = = refp ) {
new_child - > parent - > children = new_child ;
}
}
2003-06-05 17:06:52 +00:00
} else if ( child - > type = = XML_ATTRIBUTE_NODE ) {
xmlAttrPtr lastattr ;
if ( child - > ns = = NULL )
lastattr = xmlHasProp ( refp - > parent , child - > name ) ;
else
lastattr = xmlHasNsProp ( refp - > parent , child - > name , child - > ns - > href ) ;
2005-05-20 15:01:38 +00:00
if ( lastattr ! = NULL & & lastattr - > type ! = XML_ATTRIBUTE_DECL ) {
2003-06-05 17:06:52 +00:00
if ( lastattr ! = ( xmlAttrPtr ) child ) {
xmlUnlinkNode ( ( xmlNodePtr ) lastattr ) ;
2014-12-13 22:06:14 +00:00
php_libxml_node_free_resource ( ( xmlNodePtr ) lastattr ) ;
2003-06-05 17:06:52 +00:00
} else {
2011-08-08 13:45:18 +00:00
DOM_RET_OBJ ( child , & ret , intern ) ;
2003-06-05 17:06:52 +00:00
return ;
}
}
2023-06-03 14:41:44 +00:00
new_child = xmlAddPrevSibling ( refp , child ) ;
if ( UNEXPECTED ( NULL = = new_child ) ) {
goto cannot_add ;
}
2004-06-13 10:12:47 +00:00
} else if ( child - > type = = XML_DOCUMENT_FRAG_NODE ) {
2023-06-03 14:41:44 +00:00
xmlNodePtr last = child - > last ;
2014-12-13 22:06:14 +00:00
new_child = _php_dom_insert_fragment ( parentp , refp - > prev , refp , child , intern , childobj ) ;
2023-06-03 14:41:44 +00:00
dom_reconcile_ns_list ( parentp - > doc , new_child , last ) ;
} else {
2004-06-13 10:12:47 +00:00
new_child = xmlAddPrevSibling ( refp , child ) ;
2023-06-03 14:41:44 +00:00
if ( UNEXPECTED ( NULL = = new_child ) ) {
goto cannot_add ;
}
dom_reconcile_ns ( parentp - > doc , new_child ) ;
2003-06-05 17:06:52 +00:00
}
} else {
2007-03-18 21:31:05 +00:00
if ( child - > parent ! = NULL ) {
2003-06-05 17:06:52 +00:00
xmlUnlinkNode ( child ) ;
}
2004-06-13 10:12:47 +00:00
if ( child - > type = = XML_TEXT_NODE & & parentp - > last ! = NULL & & parentp - > last - > type = = XML_TEXT_NODE ) {
child - > parent = parentp ;
if ( child - > doc = = NULL ) {
xmlSetTreeDoc ( child , parentp - > doc ) ;
2003-06-05 17:06:52 +00:00
}
2004-06-13 10:12:47 +00:00
new_child = child ;
if ( parentp - > children = = NULL ) {
parentp - > children = child ;
parentp - > last = child ;
} else {
child = parentp - > last ;
child - > next = new_child ;
new_child - > prev = child ;
parentp - > last = new_child ;
2003-06-05 17:06:52 +00:00
}
} else if ( child - > type = = XML_ATTRIBUTE_NODE ) {
xmlAttrPtr lastattr ;
if ( child - > ns = = NULL )
lastattr = xmlHasProp ( parentp , child - > name ) ;
else
lastattr = xmlHasNsProp ( parentp , child - > name , child - > ns - > href ) ;
2005-05-20 15:01:38 +00:00
if ( lastattr ! = NULL & & lastattr - > type ! = XML_ATTRIBUTE_DECL ) {
2003-06-05 17:06:52 +00:00
if ( lastattr ! = ( xmlAttrPtr ) child ) {
xmlUnlinkNode ( ( xmlNodePtr ) lastattr ) ;
2014-12-13 22:06:14 +00:00
php_libxml_node_free_resource ( ( xmlNodePtr ) lastattr ) ;
2003-06-05 17:06:52 +00:00
} else {
2011-08-08 13:45:18 +00:00
DOM_RET_OBJ ( child , & ret , intern ) ;
2003-06-05 17:06:52 +00:00
return ;
}
}
2023-06-03 14:41:44 +00:00
new_child = xmlAddChild ( parentp , child ) ;
if ( UNEXPECTED ( NULL = = new_child ) ) {
goto cannot_add ;
}
2004-06-13 10:12:47 +00:00
} else if ( child - > type = = XML_DOCUMENT_FRAG_NODE ) {
2023-06-03 14:41:44 +00:00
xmlNodePtr last = child - > last ;
2014-12-13 22:06:14 +00:00
new_child = _php_dom_insert_fragment ( parentp , parentp - > last , NULL , child , intern , childobj ) ;
2023-06-03 14:41:44 +00:00
dom_reconcile_ns_list ( parentp - > doc , new_child , last ) ;
} else {
2004-06-13 10:12:47 +00:00
new_child = xmlAddChild ( parentp , child ) ;
2023-06-03 14:41:44 +00:00
if ( UNEXPECTED ( NULL = = new_child ) ) {
goto cannot_add ;
}
dom_reconcile_ns ( parentp - > doc , new_child ) ;
2003-06-05 17:06:52 +00:00
}
}
2011-08-08 13:45:18 +00:00
DOM_RET_OBJ ( new_child , & ret , intern ) ;
2023-06-03 14:41:44 +00:00
return ;
cannot_add :
zend_throw_error ( NULL , " Cannot add newnode as the previous sibling of refnode " ) ;
RETURN_THROWS ( ) ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_insert_before */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-785887307
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , replaceChild )
2003-06-05 17:06:52 +00:00
{
zval * id , * newnode , * oldnode ;
2021-09-08 00:57:09 +00:00
xmlNodePtr newchild , oldchild , nodep ;
2003-06-09 20:20:55 +00:00
dom_object * intern , * newchildobj , * oldchildobj ;
2021-09-08 00:57:09 +00:00
int stricterror ;
2022-08-04 14:04:41 +00:00
bool replacedoctype = false ;
2003-06-09 20:20:55 +00:00
2003-06-05 17:06:52 +00:00
int ret ;
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " OO " , & newnode , dom_node_class_entry , & oldnode , dom_node_class_entry ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2004-02-15 14:05:17 +00:00
}
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2003-06-05 17:06:52 +00:00
2003-07-12 17:29:20 +00:00
if ( dom_node_children_valid ( nodep ) = = FAILURE ) {
RETURN_FALSE ;
}
2003-06-09 20:20:55 +00:00
DOM_GET_OBJ ( newchild , newnode , xmlNodePtr , newchildobj ) ;
DOM_GET_OBJ ( oldchild , oldnode , xmlNodePtr , oldchildobj ) ;
2003-06-05 17:06:52 +00:00
2021-09-08 00:57:09 +00:00
if ( ! nodep - > children ) {
2003-06-05 17:06:52 +00:00
RETURN_FALSE ;
}
2003-08-24 10:23:43 +00:00
stricterror = dom_get_strict_error ( intern - > document ) ;
2015-01-03 09:22:58 +00:00
if ( dom_node_is_read_only ( nodep ) = = SUCCESS | |
2003-07-12 17:29:20 +00:00
( newchild - > parent ! = NULL & & dom_node_is_read_only ( newchild - > parent ) = = SUCCESS ) ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( NO_MODIFICATION_ALLOWED_ERR , stricterror ) ;
2003-07-12 17:29:20 +00:00
RETURN_FALSE ;
}
2003-06-05 17:06:52 +00:00
if ( newchild - > doc ! = nodep - > doc & & newchild - > doc ! = NULL ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( WRONG_DOCUMENT_ERR , stricterror ) ;
2003-06-05 17:06:52 +00:00
RETURN_FALSE ;
}
if ( dom_hierarchy ( nodep , newchild ) = = FAILURE ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( HIERARCHY_REQUEST_ERR , stricterror ) ;
2003-06-09 20:20:55 +00:00
RETURN_FALSE ;
2003-06-05 17:06:52 +00:00
}
2021-09-08 00:57:09 +00:00
if ( oldchild - > parent ! = nodep ) {
php_dom_throw_error ( NOT_FOUND_ERR , stricterror ) ;
RETURN_FALSE ;
2003-06-05 17:06:52 +00:00
}
2021-09-08 00:57:09 +00:00
if ( newchild - > type = = XML_DOCUMENT_FRAG_NODE ) {
xmlNodePtr prevsib , nextsib ;
prevsib = oldchild - > prev ;
nextsib = oldchild - > next ;
2005-02-18 11:47:20 +00:00
2021-09-08 00:57:09 +00:00
xmlUnlinkNode ( oldchild ) ;
2005-02-18 11:47:20 +00:00
2023-06-03 14:41:44 +00:00
xmlNodePtr last = newchild - > last ;
2021-09-08 00:57:09 +00:00
newchild = _php_dom_insert_fragment ( nodep , prevsib , nextsib , newchild , intern , newchildobj ) ;
if ( newchild ) {
2023-06-03 14:41:44 +00:00
dom_reconcile_ns_list ( nodep - > doc , newchild , last ) ;
2003-06-05 17:06:52 +00:00
}
2021-09-08 00:57:09 +00:00
} else if ( oldchild ! = newchild ) {
2022-08-19 16:12:35 +00:00
xmlDtdPtr intSubset = xmlGetIntSubset ( nodep - > doc ) ;
replacedoctype = ( intSubset = = ( xmlDtd * ) oldchild ) ;
2021-09-08 00:57:09 +00:00
if ( newchild - > doc = = NULL & & nodep - > doc ! = NULL ) {
xmlSetTreeDoc ( newchild , nodep - > doc ) ;
newchildobj - > document = intern - > document ;
php_libxml_increment_doc_ref ( ( php_libxml_node_object * ) newchildobj , NULL ) ;
}
xmlReplaceNode ( oldchild , newchild ) ;
dom_reconcile_ns ( nodep - > doc , newchild ) ;
2022-08-04 14:04:41 +00:00
2022-08-19 16:12:35 +00:00
if ( replacedoctype ) {
nodep - > doc - > intSubset = ( xmlDtd * ) newchild ;
2003-06-05 17:06:52 +00:00
}
}
2021-09-08 00:57:09 +00:00
DOM_RET_OBJ ( oldchild , & ret , intern ) ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_replace_child */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1734834066
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , removeChild )
2003-06-05 17:06:52 +00:00
{
zval * id , * node ;
2021-09-08 00:57:09 +00:00
xmlNodePtr child , nodep ;
2003-06-09 20:20:55 +00:00
dom_object * intern , * childobj ;
2003-08-24 10:23:43 +00:00
int ret , stricterror ;
2003-06-05 17:06:52 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " O " , & node , dom_node_class_entry ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-06-05 17:06:52 +00:00
}
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2003-07-12 17:29:20 +00:00
if ( dom_node_children_valid ( nodep ) = = FAILURE ) {
RETURN_FALSE ;
}
2003-06-09 20:20:55 +00:00
DOM_GET_OBJ ( child , node , xmlNodePtr , childobj ) ;
2003-06-05 17:06:52 +00:00
2003-08-24 10:23:43 +00:00
stricterror = dom_get_strict_error ( intern - > document ) ;
2015-01-03 09:22:58 +00:00
if ( dom_node_is_read_only ( nodep ) = = SUCCESS | |
2003-07-12 17:29:20 +00:00
( child - > parent ! = NULL & & dom_node_is_read_only ( child - > parent ) = = SUCCESS ) ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( NO_MODIFICATION_ALLOWED_ERR , stricterror ) ;
2003-07-12 17:29:20 +00:00
RETURN_FALSE ;
}
2021-09-08 00:57:09 +00:00
if ( ! nodep - > children | | child - > parent ! = nodep ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( NOT_FOUND_ERR , stricterror ) ;
2003-06-05 17:06:52 +00:00
RETURN_FALSE ;
}
2021-09-08 00:57:09 +00:00
xmlUnlinkNode ( child ) ;
DOM_RET_OBJ ( child , & ret , intern ) ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_remove_child */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-184E7107
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , appendChild )
2003-06-05 17:06:52 +00:00
{
2011-08-08 13:45:18 +00:00
zval * id , * node ;
2003-06-05 17:06:52 +00:00
xmlNodePtr child , nodep , new_child = NULL ;
2003-06-09 20:20:55 +00:00
dom_object * intern , * childobj ;
2003-08-24 10:23:43 +00:00
int ret , stricterror ;
2003-06-05 17:06:52 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " O " , & node , dom_node_class_entry ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-06-05 17:06:52 +00:00
}
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2003-07-12 17:29:20 +00:00
if ( dom_node_children_valid ( nodep ) = = FAILURE ) {
RETURN_FALSE ;
}
2003-06-09 20:20:55 +00:00
DOM_GET_OBJ ( child , node , xmlNodePtr , childobj ) ;
2003-06-05 17:06:52 +00:00
2003-08-24 10:23:43 +00:00
stricterror = dom_get_strict_error ( intern - > document ) ;
if ( dom_node_is_read_only ( nodep ) = = SUCCESS | |
2003-07-12 17:29:20 +00:00
( child - > parent ! = NULL & & dom_node_is_read_only ( child - > parent ) = = SUCCESS ) ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( NO_MODIFICATION_ALLOWED_ERR , stricterror ) ;
2003-07-12 17:29:20 +00:00
RETURN_FALSE ;
}
2003-06-05 17:06:52 +00:00
if ( dom_hierarchy ( nodep , child ) = = FAILURE ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( HIERARCHY_REQUEST_ERR , stricterror ) ;
2003-06-09 20:20:55 +00:00
RETURN_FALSE ;
2003-06-05 17:06:52 +00:00
}
if ( ! ( child - > doc = = NULL | | child - > doc = = nodep - > doc ) ) {
2014-12-13 22:06:14 +00:00
php_dom_throw_error ( WRONG_DOCUMENT_ERR , stricterror ) ;
2003-06-05 17:06:52 +00:00
RETURN_FALSE ;
}
2004-06-13 10:12:47 +00:00
if ( child - > type = = XML_DOCUMENT_FRAG_NODE & & child - > children = = NULL ) {
2020-04-19 12:35:25 +00:00
/* TODO Drop Warning? */
2014-12-13 22:06:14 +00:00
php_error_docref ( NULL , E_WARNING , " Document Fragment is empty " ) ;
2004-06-13 10:12:47 +00:00
RETURN_FALSE ;
}
2003-06-09 20:20:55 +00:00
if ( child - > doc = = NULL & & nodep - > doc ! = NULL ) {
childobj - > document = intern - > document ;
2014-12-13 22:06:14 +00:00
php_libxml_increment_doc_ref ( ( php_libxml_node_object * ) childobj , NULL ) ;
2003-06-09 20:20:55 +00:00
}
2003-06-05 17:06:52 +00:00
if ( child - > parent ! = NULL ) {
xmlUnlinkNode ( child ) ;
}
2004-06-13 10:12:47 +00:00
if ( child - > type = = XML_TEXT_NODE & & nodep - > last ! = NULL & & nodep - > last - > type = = XML_TEXT_NODE ) {
child - > parent = nodep ;
if ( child - > doc = = NULL ) {
xmlSetTreeDoc ( child , nodep - > doc ) ;
2003-06-05 17:06:52 +00:00
}
2004-06-13 10:12:47 +00:00
new_child = child ;
if ( nodep - > children = = NULL ) {
nodep - > children = child ;
nodep - > last = child ;
} else {
child = nodep - > last ;
child - > next = new_child ;
new_child - > prev = child ;
nodep - > last = new_child ;
2003-06-05 17:06:52 +00:00
}
} else if ( child - > type = = XML_ATTRIBUTE_NODE ) {
xmlAttrPtr lastattr ;
if ( child - > ns = = NULL )
lastattr = xmlHasProp ( nodep , child - > name ) ;
else
lastattr = xmlHasNsProp ( nodep , child - > name , child - > ns - > href ) ;
2005-05-20 15:01:38 +00:00
if ( lastattr ! = NULL & & lastattr - > type ! = XML_ATTRIBUTE_DECL ) {
2003-06-05 17:06:52 +00:00
if ( lastattr ! = ( xmlAttrPtr ) child ) {
xmlUnlinkNode ( ( xmlNodePtr ) lastattr ) ;
2014-12-13 22:06:14 +00:00
php_libxml_node_free_resource ( ( xmlNodePtr ) lastattr ) ;
2003-06-05 17:06:52 +00:00
}
}
2023-06-03 14:41:44 +00:00
new_child = xmlAddChild ( nodep , child ) ;
if ( UNEXPECTED ( new_child = = NULL ) ) {
goto cannot_add ;
}
2004-06-13 10:12:47 +00:00
} else if ( child - > type = = XML_DOCUMENT_FRAG_NODE ) {
2023-06-03 14:41:44 +00:00
xmlNodePtr last = child - > last ;
2014-12-13 22:06:14 +00:00
new_child = _php_dom_insert_fragment ( nodep , nodep - > last , NULL , child , intern , childobj ) ;
2023-06-03 14:41:44 +00:00
dom_reconcile_ns_list ( nodep - > doc , new_child , last ) ;
} else {
2004-06-13 10:12:47 +00:00
new_child = xmlAddChild ( nodep , child ) ;
2023-06-03 14:41:44 +00:00
if ( UNEXPECTED ( new_child = = NULL ) ) {
goto cannot_add ;
2004-06-13 10:12:47 +00:00
}
2023-06-03 14:41:44 +00:00
dom_reconcile_ns ( nodep - > doc , new_child ) ;
2003-06-05 17:06:52 +00:00
}
2011-08-08 13:45:18 +00:00
DOM_RET_OBJ ( new_child , & ret , intern ) ;
2023-06-03 14:41:44 +00:00
return ;
cannot_add :
// TODO Convert to Error?
php_error_docref ( NULL , E_WARNING , " Couldn't append node " ) ;
RETURN_FALSE ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_append_child */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-810594187
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , hasChildNodes )
2003-06-05 17:06:52 +00:00
{
zval * id ;
xmlNode * nodep ;
2003-06-09 20:20:55 +00:00
dom_object * intern ;
2003-06-05 17:06:52 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters_none ( ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2004-02-15 14:05:17 +00:00
}
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2003-06-05 17:06:52 +00:00
2003-07-12 17:29:20 +00:00
if ( dom_node_children_valid ( nodep ) = = FAILURE ) {
RETURN_FALSE ;
}
2003-06-05 17:06:52 +00:00
if ( nodep - > children ) {
RETURN_TRUE ;
} else {
RETURN_FALSE ;
}
}
/* }}} end dom_node_has_child_nodes */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3A0ED0A4
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , cloneNode )
2003-06-05 17:06:52 +00:00
{
zval * id ;
xmlNode * n , * node ;
2003-06-09 20:20:55 +00:00
int ret ;
dom_object * intern ;
2021-01-15 11:30:54 +00:00
bool recursive = 0 ;
2003-06-05 17:06:52 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " |b " , & recursive ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-06-05 17:06:52 +00:00
}
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( n , id , xmlNodePtr , intern ) ;
2003-08-24 10:23:43 +00:00
node = xmlDocCopyNode ( n , n - > doc , recursive ) ;
2003-10-26 15:57:02 +00:00
2004-02-17 11:13:47 +00:00
if ( ! node ) {
RETURN_FALSE ;
}
2015-01-03 09:22:58 +00:00
/* When deep is false Element nodes still require the attributes
2018-07-25 03:38:50 +00:00
Following taken from libxml as xmlDocCopyNode doesn ' t do this */
2004-02-17 11:13:47 +00:00
if ( n - > type = = XML_ELEMENT_NODE & & recursive = = 0 ) {
2003-10-26 15:57:02 +00:00
if ( n - > nsDef ! = NULL ) {
node - > nsDef = xmlCopyNamespaceList ( n - > nsDef ) ;
}
if ( n - > ns ! = NULL ) {
xmlNsPtr ns ;
ns = xmlSearchNs ( n - > doc , node , n - > ns - > prefix ) ;
if ( ns = = NULL ) {
ns = xmlSearchNs ( n - > doc , n , n - > ns - > prefix ) ;
if ( ns ! = NULL ) {
xmlNodePtr root = node ;
while ( root - > parent ! = NULL ) {
root = root - > parent ;
}
node - > ns = xmlNewNs ( root , ns - > href , ns - > prefix ) ;
}
} else {
node - > ns = ns ;
}
}
if ( n - > properties ! = NULL ) {
node - > properties = xmlCopyPropList ( node , n - > properties ) ;
}
}
2004-02-17 11:13:47 +00:00
/* If document cloned we want a new document proxy */
if ( node - > doc ! = n - > doc ) {
intern = NULL ;
2003-06-05 17:06:52 +00:00
}
2011-08-08 13:45:18 +00:00
DOM_RET_OBJ ( node , & ret , intern ) ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_clone_node */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-normalize
2015-01-03 09:22:58 +00:00
Since :
2003-06-05 17:06:52 +00:00
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , normalize )
2003-06-05 17:06:52 +00:00
{
zval * id ;
xmlNode * nodep ;
2003-06-09 20:20:55 +00:00
dom_object * intern ;
2003-06-05 17:06:52 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters_none ( ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2004-02-15 14:05:17 +00:00
}
2003-06-05 17:06:52 +00:00
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2003-06-05 17:06:52 +00:00
2014-12-13 22:06:14 +00:00
dom_normalize ( nodep ) ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_normalize */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Level-2-Core-Node-supports
2003-06-05 17:06:52 +00:00
Since : DOM Level 2
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , isSupported )
2003-06-05 17:06:52 +00:00
{
2021-04-09 17:45:08 +00:00
zend_string * feature , * version ;
2003-06-12 20:02:05 +00:00
2021-04-09 17:45:08 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " SS " , & feature , & version ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-06-12 20:02:05 +00:00
}
2021-04-09 17:45:08 +00:00
RETURN_BOOL ( dom_has_feature ( feature , version ) ) ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_is_supported */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeHasAttrs
2003-06-05 17:06:52 +00:00
Since : DOM Level 2
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , hasAttributes )
2003-06-05 17:06:52 +00:00
{
zval * id ;
xmlNode * nodep ;
2003-06-09 20:20:55 +00:00
dom_object * intern ;
2003-06-05 17:06:52 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters_none ( ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2004-02-15 14:05:17 +00:00
}
2003-06-05 17:06:52 +00:00
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2003-06-05 17:06:52 +00:00
if ( nodep - > type ! = XML_ELEMENT_NODE )
RETURN_FALSE ;
if ( nodep - > properties ) {
RETURN_TRUE ;
} else {
RETURN_FALSE ;
}
}
/* }}} end dom_node_has_attributes */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isSameNode
2003-06-05 17:06:52 +00:00
Since : DOM Level 3
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , isSameNode )
2003-06-05 17:06:52 +00:00
{
zval * id , * node ;
xmlNodePtr nodeotherp , nodep ;
2003-06-09 20:20:55 +00:00
dom_object * intern , * nodeotherobj ;
2003-06-05 17:06:52 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " O " , & node , dom_node_class_entry ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-06-05 17:06:52 +00:00
}
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2003-06-09 20:20:55 +00:00
DOM_GET_OBJ ( nodeotherp , node , xmlNodePtr , nodeotherobj ) ;
2003-06-05 17:06:52 +00:00
if ( nodep = = nodeotherp ) {
RETURN_TRUE ;
} else {
RETURN_FALSE ;
}
}
/* }}} end dom_node_is_same_node */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-lookupNamespacePrefix
2003-06-05 17:06:52 +00:00
Since : DOM Level 3
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , lookupPrefix )
2003-06-05 17:06:52 +00:00
{
2003-07-27 17:57:06 +00:00
zval * id ;
xmlNodePtr nodep , lookupp = NULL ;
dom_object * intern ;
xmlNsPtr nsptr ;
2014-08-27 13:31:48 +00:00
size_t uri_len = 0 ;
2003-07-27 17:57:06 +00:00
char * uri ;
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " s " , & uri , & uri_len ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-07-27 17:57:06 +00:00
}
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2003-07-27 17:57:06 +00:00
if ( uri_len > 0 ) {
2015-01-03 09:22:58 +00:00
switch ( nodep - > type ) {
2003-07-27 17:57:06 +00:00
case XML_ELEMENT_NODE :
lookupp = nodep ;
2015-01-03 09:22:58 +00:00
break ;
2003-07-27 17:57:06 +00:00
case XML_DOCUMENT_NODE :
case XML_HTML_DOCUMENT_NODE :
lookupp = xmlDocGetRootElement ( ( xmlDocPtr ) nodep ) ;
break ;
2015-01-03 09:22:58 +00:00
case XML_ENTITY_NODE :
case XML_NOTATION_NODE :
case XML_DOCUMENT_FRAG_NODE :
2003-07-27 17:57:06 +00:00
case XML_DOCUMENT_TYPE_NODE :
case XML_DTD_NODE :
RETURN_NULL ( ) ;
break ;
default :
lookupp = nodep - > parent ;
2015-01-03 09:22:58 +00:00
}
2003-07-27 17:57:06 +00:00
2014-09-03 19:35:53 +00:00
if ( lookupp ! = NULL ) {
nsptr = xmlSearchNsByHref ( lookupp - > doc , lookupp , ( xmlChar * ) uri ) ;
if ( nsptr & & nsptr - > prefix ! = NULL ) {
2014-04-15 18:30:41 +00:00
RETURN_STRING ( ( char * ) nsptr - > prefix ) ;
2003-07-27 17:57:06 +00:00
}
}
}
2015-01-03 09:22:58 +00:00
2003-07-27 17:57:06 +00:00
RETURN_NULL ( ) ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_lookup_prefix */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isDefaultNamespace
2003-06-05 17:06:52 +00:00
Since : DOM Level 3
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , isDefaultNamespace )
2003-06-05 17:06:52 +00:00
{
2003-10-05 11:52:22 +00:00
zval * id ;
xmlNodePtr nodep ;
dom_object * intern ;
xmlNsPtr nsptr ;
2014-08-27 13:31:48 +00:00
size_t uri_len = 0 ;
2003-10-05 11:52:22 +00:00
char * uri ;
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " s " , & uri , & uri_len ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-10-05 11:52:22 +00:00
}
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2007-05-04 19:30:59 +00:00
if ( nodep - > type = = XML_DOCUMENT_NODE | | nodep - > type = = XML_HTML_DOCUMENT_NODE ) {
nodep = xmlDocGetRootElement ( ( xmlDocPtr ) nodep ) ;
}
2004-02-15 14:05:17 +00:00
2007-05-04 19:30:59 +00:00
if ( nodep & & uri_len > 0 ) {
2003-10-05 11:52:22 +00:00
nsptr = xmlSearchNs ( nodep - > doc , nodep , NULL ) ;
2014-09-03 19:35:53 +00:00
if ( nsptr & & xmlStrEqual ( nsptr - > href , ( xmlChar * ) uri ) ) {
2003-10-05 11:52:22 +00:00
RETURN_TRUE ;
}
}
RETURN_FALSE ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_is_default_namespace */
2020-07-01 13:32:55 +00:00
/* {{{ URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI
2003-06-05 17:06:52 +00:00
Since : DOM Level 3
*/
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , lookupNamespaceURI )
2003-06-05 17:06:52 +00:00
{
2003-07-27 17:57:06 +00:00
zval * id ;
xmlNodePtr nodep ;
dom_object * intern ;
xmlNsPtr nsptr ;
2014-09-03 19:35:53 +00:00
size_t prefix_len ;
char * prefix ;
2003-07-27 17:57:06 +00:00
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) , " s! " , & prefix , & prefix_len ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2003-07-27 17:57:06 +00:00
}
2004-02-15 14:05:17 +00:00
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2007-05-04 19:30:59 +00:00
if ( nodep - > type = = XML_DOCUMENT_NODE | | nodep - > type = = XML_HTML_DOCUMENT_NODE ) {
nodep = xmlDocGetRootElement ( ( xmlDocPtr ) nodep ) ;
if ( nodep = = NULL ) {
RETURN_NULL ( ) ;
}
}
2004-02-15 14:05:17 +00:00
2014-09-03 19:35:53 +00:00
nsptr = xmlSearchNs ( nodep - > doc , nodep , ( xmlChar * ) prefix ) ;
2006-09-16 13:54:52 +00:00
if ( nsptr & & nsptr - > href ! = NULL ) {
2014-04-15 18:30:41 +00:00
RETURN_STRING ( ( char * ) nsptr - > href ) ;
2003-07-27 17:57:06 +00:00
}
2003-08-24 10:23:43 +00:00
2003-07-27 17:57:06 +00:00
RETURN_NULL ( ) ;
2003-06-05 17:06:52 +00:00
}
/* }}} end dom_node_lookup_namespace_uri */
2008-08-14 08:39:05 +00:00
static void dom_canonicalization ( INTERNAL_FUNCTION_PARAMETERS , int mode ) /* { { { */
2006-05-26 18:23:50 +00:00
{
zval * id ;
zval * xpath_array = NULL , * ns_prefixes = NULL ;
xmlNodePtr nodep ;
xmlDocPtr docp ;
xmlNodeSetPtr nodeset = NULL ;
dom_object * intern ;
2021-01-15 11:30:54 +00:00
bool exclusive = 0 , with_comments = 0 ;
2006-05-26 18:23:50 +00:00
xmlChar * * inclusive_ns_prefixes = NULL ;
char * file = NULL ;
2014-08-27 13:31:48 +00:00
int ret = - 1 ;
size_t file_len = 0 ;
2006-08-07 20:23:35 +00:00
xmlOutputBufferPtr buf ;
2006-05-26 18:23:50 +00:00
xmlXPathContextPtr ctxp = NULL ;
xmlXPathObjectPtr xpathobjp = NULL ;
2018-11-15 16:54:19 +00:00
id = ZEND_THIS ;
2006-05-26 18:23:50 +00:00
if ( mode = = 0 ) {
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) ,
" |bba!a! " , & exclusive , & with_comments ,
2006-05-26 18:23:50 +00:00
& xpath_array , & ns_prefixes ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2006-05-26 18:23:50 +00:00
}
} else {
2018-11-14 00:32:19 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) ,
" s|bba!a! " , & file , & file_len , & exclusive ,
2006-05-26 18:23:50 +00:00
& with_comments , & xpath_array , & ns_prefixes ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2006-05-26 18:23:50 +00:00
}
}
DOM_GET_OBJ ( nodep , id , xmlNodePtr , intern ) ;
docp = nodep - > doc ;
if ( ! docp ) {
2020-04-19 12:35:25 +00:00
zend_throw_error ( NULL , " Node must be associated with a document " ) ;
RETURN_THROWS ( ) ;
2006-05-26 18:23:50 +00:00
}
if ( xpath_array = = NULL ) {
if ( nodep - > type ! = XML_DOCUMENT_NODE ) {
ctxp = xmlXPathNewContext ( docp ) ;
ctxp - > node = nodep ;
2014-09-03 19:35:53 +00:00
xpathobjp = xmlXPathEvalExpression ( ( xmlChar * ) " (.//. | .//@* | .//namespace::*) " , ctxp ) ;
2006-05-26 18:23:50 +00:00
ctxp - > node = NULL ;
if ( xpathobjp & & xpathobjp - > type = = XPATH_NODESET ) {
nodeset = xpathobjp - > nodesetval ;
} else {
if ( xpathobjp ) {
xmlXPathFreeObject ( xpathobjp ) ;
}
xmlXPathFreeContext ( ctxp ) ;
2020-04-19 12:35:25 +00:00
zend_throw_error ( NULL , " XPath query did not return a nodeset " ) ;
RETURN_THROWS ( ) ;
2006-05-26 18:23:50 +00:00
}
}
} else {
/*xpath query from xpath_array */
HashTable * ht = Z_ARRVAL_P ( xpath_array ) ;
2014-04-15 18:30:41 +00:00
zval * tmp ;
2006-05-26 18:23:50 +00:00
char * xquery ;
2014-04-15 18:30:41 +00:00
tmp = zend_hash_str_find ( ht , " query " , sizeof ( " query " ) - 1 ) ;
2020-04-19 12:35:25 +00:00
if ( ! tmp ) {
/* if mode == 0 then $xpath arg is 3, if mode == 1 then $xpath is 4 */
zend_argument_value_error ( 3 + mode , " must have a \" query \" key " ) ;
RETURN_THROWS ( ) ;
}
if ( Z_TYPE_P ( tmp ) ! = IS_STRING ) {
/* if mode == 0 then $xpath arg is 3, if mode == 1 then $xpath is 4 */
zend_argument_type_error ( 3 + mode , " \" query \" option must be a string, %s given " , zend_zval_type_name ( tmp ) ) ;
RETURN_THROWS ( ) ;
2006-05-26 18:23:50 +00:00
}
2020-04-19 12:35:25 +00:00
xquery = Z_STRVAL_P ( tmp ) ;
2006-05-26 18:23:50 +00:00
ctxp = xmlXPathNewContext ( docp ) ;
ctxp - > node = nodep ;
2014-04-15 18:30:41 +00:00
tmp = zend_hash_str_find ( ht , " namespaces " , sizeof ( " namespaces " ) - 1 ) ;
if ( tmp & & Z_TYPE_P ( tmp ) = = IS_ARRAY ) {
zval * tmpns ;
2014-05-28 14:12:52 +00:00
zend_string * prefix ;
2006-05-26 18:23:50 +00:00
2014-05-28 14:12:52 +00:00
ZEND_HASH_FOREACH_STR_KEY_VAL ( Z_ARRVAL_P ( tmp ) , prefix , tmpns ) {
if ( Z_TYPE_P ( tmpns ) = = IS_STRING ) {
if ( prefix ) {
2015-06-30 01:05:24 +00:00
xmlXPathRegisterNs ( ctxp , ( xmlChar * ) ZSTR_VAL ( prefix ) , ( xmlChar * ) Z_STRVAL_P ( tmpns ) ) ;
2006-05-26 18:23:50 +00:00
}
}
2014-05-28 14:12:52 +00:00
} ZEND_HASH_FOREACH_END ( ) ;
2006-05-26 18:23:50 +00:00
}
2014-09-03 19:35:53 +00:00
xpathobjp = xmlXPathEvalExpression ( ( xmlChar * ) xquery , ctxp ) ;
2006-05-26 18:23:50 +00:00
ctxp - > node = NULL ;
if ( xpathobjp & & xpathobjp - > type = = XPATH_NODESET ) {
nodeset = xpathobjp - > nodesetval ;
} else {
if ( xpathobjp ) {
xmlXPathFreeObject ( xpathobjp ) ;
}
xmlXPathFreeContext ( ctxp ) ;
2020-04-19 12:35:25 +00:00
zend_throw_error ( NULL , " XPath query did not return a nodeset " ) ;
RETURN_THROWS ( ) ;
2006-05-26 18:23:50 +00:00
}
}
if ( ns_prefixes ! = NULL ) {
if ( exclusive ) {
2014-04-15 18:30:41 +00:00
zval * tmpns ;
2006-05-26 18:23:50 +00:00
int nscount = 0 ;
inclusive_ns_prefixes = safe_emalloc ( zend_hash_num_elements ( Z_ARRVAL_P ( ns_prefixes ) ) + 1 ,
sizeof ( xmlChar * ) , 0 ) ;
2014-05-28 14:12:52 +00:00
ZEND_HASH_FOREACH_VAL ( Z_ARRVAL_P ( ns_prefixes ) , tmpns ) {
2014-04-15 18:30:41 +00:00
if ( Z_TYPE_P ( tmpns ) = = IS_STRING ) {
2014-09-03 19:35:53 +00:00
inclusive_ns_prefixes [ nscount + + ] = ( xmlChar * ) Z_STRVAL_P ( tmpns ) ;
2006-05-26 18:23:50 +00:00
}
2014-05-28 14:12:52 +00:00
} ZEND_HASH_FOREACH_END ( ) ;
2006-05-26 18:23:50 +00:00
inclusive_ns_prefixes [ nscount ] = NULL ;
} else {
2015-01-03 09:22:58 +00:00
php_error_docref ( NULL , E_NOTICE ,
2010-05-01 18:30:38 +00:00
" Inclusive namespace prefixes only allowed in exclusive mode. " ) ;
2006-05-26 18:23:50 +00:00
}
}
if ( mode = = 1 ) {
buf = xmlOutputBufferCreateFilename ( file , NULL , 0 ) ;
} else {
buf = xmlAllocOutputBuffer ( NULL ) ;
}
2021-06-29 08:04:10 +00:00
if ( buf ! = NULL ) {
2006-05-26 18:23:50 +00:00
ret = xmlC14NDocSaveTo ( docp , nodeset , exclusive , inclusive_ns_prefixes ,
with_comments , buf ) ;
}
if ( inclusive_ns_prefixes ! = NULL ) {
efree ( inclusive_ns_prefixes ) ;
}
if ( xpathobjp ! = NULL ) {
xmlXPathFreeObject ( xpathobjp ) ;
}
if ( ctxp ! = NULL ) {
xmlXPathFreeContext ( ctxp ) ;
}
2021-06-29 08:04:10 +00:00
if ( buf = = NULL | | ret < 0 ) {
RETVAL_FALSE ;
} else {
2006-05-26 18:23:50 +00:00
if ( mode = = 0 ) {
2012-08-09 18:02:33 +00:00
# ifdef LIBXML2_NEW_BUFFER
ret = xmlOutputBufferGetSize ( buf ) ;
# else
2006-05-26 18:23:50 +00:00
ret = buf - > buffer - > use ;
2012-08-09 18:02:33 +00:00
# endif
2006-05-26 18:23:50 +00:00
if ( ret > 0 ) {
2012-08-09 18:02:33 +00:00
# ifdef LIBXML2_NEW_BUFFER
2014-04-15 18:30:41 +00:00
RETVAL_STRINGL ( ( char * ) xmlOutputBufferGetContent ( buf ) , ret ) ;
2012-08-09 18:02:33 +00:00
# else
2014-04-15 18:30:41 +00:00
RETVAL_STRINGL ( ( char * ) buf - > buffer - > content , ret ) ;
2012-08-09 18:02:33 +00:00
# endif
2006-05-26 18:23:50 +00:00
} else {
RETVAL_EMPTY_STRING ( ) ;
}
}
2021-06-29 08:04:10 +00:00
}
2006-05-26 18:23:50 +00:00
if ( buf ) {
int bytes ;
bytes = xmlOutputBufferClose ( buf ) ;
if ( mode = = 1 & & ( ret > = 0 ) ) {
2014-08-25 17:24:55 +00:00
RETURN_LONG ( bytes ) ;
2006-05-26 18:23:50 +00:00
}
}
}
2008-08-14 08:39:05 +00:00
/* }}} */
2006-05-26 18:23:50 +00:00
2020-07-01 13:32:55 +00:00
/* {{{ Canonicalize nodes to a string */
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , C14N )
2006-05-26 18:23:50 +00:00
{
dom_canonicalization ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
}
2008-08-14 08:39:05 +00:00
/* }}} */
2006-05-26 18:23:50 +00:00
2020-07-01 13:32:55 +00:00
/* {{{ Canonicalize nodes to a file */
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , C14NFile )
2006-05-26 18:23:50 +00:00
{
dom_canonicalization ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
}
2008-08-14 08:39:05 +00:00
/* }}} */
2006-07-16 15:03:53 +00:00
2020-07-01 13:32:55 +00:00
/* {{{ Gets an xpath for a node */
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , getNodePath )
2006-07-16 15:03:53 +00:00
{
zval * id ;
xmlNode * nodep ;
dom_object * intern ;
char * value ;
2015-01-03 09:22:58 +00:00
2019-10-31 09:20:41 +00:00
if ( zend_parse_parameters_none ( ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2019-10-31 09:20:41 +00:00
}
2006-07-16 16:04:09 +00:00
DOM_GET_THIS_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2006-07-16 15:03:53 +00:00
2014-09-03 19:35:53 +00:00
value = ( char * ) xmlGetNodePath ( nodep ) ;
2006-07-16 15:03:53 +00:00
if ( value = = NULL ) {
2020-04-19 12:35:25 +00:00
/* TODO Research if can return empty string */
2006-07-16 16:04:09 +00:00
RETURN_NULL ( ) ;
2006-07-16 15:03:53 +00:00
} else {
2014-04-15 18:30:41 +00:00
RETVAL_STRING ( value ) ;
2006-07-16 15:03:53 +00:00
xmlFree ( value ) ;
}
}
2008-08-14 08:39:05 +00:00
/* }}} */
2020-07-01 13:32:55 +00:00
/* {{{ Gets line number for a node */
2020-04-11 20:01:51 +00:00
PHP_METHOD ( DOMNode , getLineNo )
2009-01-13 18:06:48 +00:00
{
zval * id ;
xmlNode * nodep ;
dom_object * intern ;
2015-01-03 09:22:58 +00:00
2009-01-13 18:06:48 +00:00
if ( zend_parse_parameters_none ( ) = = FAILURE ) {
2019-12-30 17:14:29 +00:00
RETURN_THROWS ( ) ;
2009-01-13 18:06:48 +00:00
}
DOM_GET_THIS_OBJ ( nodep , id , xmlNodePtr , intern ) ;
2014-08-25 17:24:55 +00:00
RETURN_LONG ( xmlGetLineNo ( nodep ) ) ;
2009-01-13 18:06:48 +00:00
}
/* }}} */
2023-10-08 22:15:54 +00:00
/**
* We want to block the serialization and unserialization of DOM classes .
* However , using @ not - serializable makes the child classes also not serializable , even if the user implements the methods .
* So instead , we implement the methods wherein we throw exceptions .
* The reason we choose these methods is because :
* - If the user implements __serialize / __unserialize , the respective throwing methods are not called .
* - If the user implements __sleep / __wakeup , then it ' s also not a problem because they will not enter the throwing methods .
*/
PHP_METHOD ( DOMNode , __sleep )
{
zend_throw_exception_ex ( NULL , 0 , " Serialization of '%s' is not allowed, unless serialization methods are implemented in a subclass " , ZSTR_VAL ( Z_OBJCE_P ( ZEND_THIS ) - > name ) ) ;
RETURN_THROWS ( ) ;
}
PHP_METHOD ( DOMNode , __wakeup )
{
zend_throw_exception_ex ( NULL , 0 , " Unserialization of '%s' is not allowed, unless unserialization methods are implemented in a subclass " , ZSTR_VAL ( Z_OBJCE_P ( ZEND_THIS ) - > name ) ) ;
RETURN_THROWS ( ) ;
}
2008-08-14 08:39:05 +00:00
# endif