Browse Source

implement stricterrorcheck

fix clonenode
cleanup error routines
PEAR_1_4DEV
Rob Richards 23 years ago
parent
commit
09481c642b
  1. 2
      ext/dom/attr.c
  2. 12
      ext/dom/characterdata.c
  3. 40
      ext/dom/document.c
  4. 22
      ext/dom/domexception.c
  5. 11
      ext/dom/domimplementation.c
  6. 23
      ext/dom/element.c
  7. 89
      ext/dom/node.c
  8. 19
      ext/dom/php_dom.c

2
ext/dom/attr.c

@ -185,7 +185,7 @@ int dom_attr_owner_element_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;

12
ext/dom/characterdata.c

@ -150,8 +150,7 @@ PHP_FUNCTION(dom_characterdata_substring_data)
if (offset < 0 || count < 0 || offset > length) {
xmlFree(cur);
php_dom_throw_error(INDEX_SIZE_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index Size Error");
php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -226,8 +225,7 @@ PHP_FUNCTION(dom_characterdata_insert_data)
if (offset < 0 || offset > length) {
xmlFree(cur);
php_dom_throw_error(INDEX_SIZE_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index Size Error");
php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -274,8 +272,7 @@ PHP_FUNCTION(dom_characterdata_delete_data)
if (offset < 0 || count < 0 || offset > length) {
xmlFree(cur);
php_dom_throw_error(INDEX_SIZE_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index Size Error");
php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -331,8 +328,7 @@ PHP_FUNCTION(dom_characterdata_replace_data)
if (offset < 0 || count < 0 || offset > length) {
xmlFree(cur);
php_dom_throw_error(INDEX_SIZE_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index Size Error");
php_dom_throw_error(INDEX_SIZE_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}

40
ext/dom/document.c

@ -118,8 +118,6 @@ static void php_dom_ctx_error(void *ctx, const char *msg, ...) {
int len;
xmlParserCtxtPtr parser;
TSRMLS_FETCH();
parser = (xmlParserCtxtPtr) ctx;
va_start(ap, msg);
@ -131,7 +129,7 @@ static void php_dom_ctx_error(void *ctx, const char *msg, ...) {
buf[len] = '\0';
}
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s in %s, line: %d", buf, parser->input->filename, parser->input->line);
php_error(E_WARNING, "%s in %s, line: %d", buf, parser->input->filename, parser->input->line);
efree(buf);
}
/* }}} end php_dom_ctx_error */
@ -156,7 +154,7 @@ int dom_document_doctype_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object((xmlNodePtr) dtdptr, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;
@ -203,7 +201,7 @@ int dom_document_document_element_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object(root, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;
@ -266,12 +264,12 @@ int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
xmlFree((xmlChar *)docp->encoding);
}
docp->encoding = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
charset = (int)xmlParseCharEncoding((const char*) docp->encoding);
charset = (int)xmlParseCharEncoding((const xmlChar *) Z_STRVAL_P(newval));
if (charset > 0) {
docp->encoding = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
return SUCCESS;
} else {
/* TODO: ERROR XML_CHAR_ENCODING_ERROR */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Document Encoding");
}
return SUCCESS;
@ -372,12 +370,23 @@ Since: DOM Level 3
int dom_document_strict_error_checking_read(dom_object *obj, zval **retval TSRMLS_DC)
{
ALLOC_ZVAL(*retval);
ZVAL_NULL(*retval);
if (obj->document) {
ZVAL_BOOL(*retval, obj->document->stricterror);
} else {
ZVAL_FALSE(*retval);
}
return SUCCESS;
}
int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRMLS_DC)
{
int stricterror;
if (obj->document && newval->type == IS_BOOL) {
stricterror = Z_LVAL_P(newval);
obj->document->stricterror = stricterror;
}
return SUCCESS;
}
@ -826,8 +835,7 @@ PHP_FUNCTION(dom_document_create_element_ns)
if (nodep != NULL) {
xmlFreeNode(nodep);
}
php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
php_dom_throw_error(errorcode, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -892,8 +900,7 @@ PHP_FUNCTION(dom_document_create_attribute_ns)
if (nodep != NULL) {
xmlFreeProp((xmlAttrPtr) nodep);
}
php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
php_dom_throw_error(errorcode, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -1092,8 +1099,6 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC)
ctxt->validate = validate;
ctxt->loadsubset = resolve_externals;
ctxt->keepBlanks = keep_blanks;
if (ctxt->keepBlanks == 0)
ctxt->sax->ignorableWhitespace = ignorableWhitespace;
ctxt->replaceEntities = substitute_ent;
ctxt->vctxt.error = php_dom_ctx_error;
@ -1245,13 +1250,12 @@ PHP_FUNCTION(dom_document_savexml)
/* Dump contents of Node */
DOM_GET_OBJ(node, nodep, xmlNodePtr, nodeobj);
if (node->doc != docp) {
php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Node not from same document");
php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
buf = xmlBufferCreate();
if (!buf) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch buffer");
php_error(E_WARNING, "Could not fetch buffer");
RETURN_FALSE;
}

22
ext/dom/domexception.c

@ -42,16 +42,11 @@ zend_function_entry php_dom_domexception_class_functions[] = {
};
/* {{{ php_dom_throw_error */
void php_dom_throw_error(int error_code, zval **retval TSRMLS_DC)
void php_dom_throw_error(int error_code, int strict_error TSRMLS_DC)
{
zval *dom_exception;
char *error_message;
ALLOC_ZVAL(dom_exception);
Z_TYPE_P(dom_exception) = IS_OBJECT;
object_init_ex(dom_exception, dom_domexception_class_entry);
dom_exception->refcount = 1;
dom_exception->is_ref = 1;
switch (error_code)
{
case INDEX_SIZE_ERR:
@ -106,9 +101,18 @@ void php_dom_throw_error(int error_code, zval **retval TSRMLS_DC)
error_message = "Unhandled Error";
}
add_property_long(dom_exception, "code", error_code);
add_property_stringl(dom_exception, "message", error_message, strlen(error_message), 1);
EG(exception) = dom_exception;
if (strict_error == 1) {
ALLOC_ZVAL(dom_exception);
Z_TYPE_P(dom_exception) = IS_OBJECT;
object_init_ex(dom_exception, dom_domexception_class_entry);
dom_exception->refcount = 1;
dom_exception->is_ref = 1;
add_property_long(dom_exception, "code", error_code);
add_property_stringl(dom_exception, "message", error_message, strlen(error_message), 1);
EG(exception) = dom_exception;
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, error_message);
}
}
/* }}} end php_dom_throw_error */
#endif

11
ext/dom/domimplementation.c

@ -98,8 +98,7 @@ PHP_FUNCTION(dom_domimplementation_create_document_type)
if (uri->opaque != NULL) {
localname = xmlStrdup(uri->opaque);
if (xmlStrchr(localname, (xmlChar) ':') != NULL) {
php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
php_dom_throw_error(NAMESPACE_ERR, 1 TSRMLS_CC);
xmlFreeURI(uri);
xmlFree(localname);
RETURN_FALSE;
@ -149,8 +148,7 @@ PHP_FUNCTION(dom_domimplementation_create_document)
RETURN_FALSE;
}
if (doctype->doc != NULL) {
php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "DocumentType: Wrong Document");
php_dom_throw_error(WRONG_DOCUMENT_ERR, 1 TSRMLS_CC);
RETURN_FALSE;
}
} else {
@ -172,8 +170,7 @@ PHP_FUNCTION(dom_domimplementation_create_document)
if (localname != NULL) {
xmlFree(localname);
}
php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
php_dom_throw_error(errorcode, 1 TSRMLS_CC);
RETURN_FALSE;
}
@ -207,7 +204,7 @@ PHP_FUNCTION(dom_domimplementation_create_document)
xmlFreeDoc(docp);
xmlFree(localname);
/* Need some type of error here */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unexpected Error");
php_error(E_WARNING, "Unexpected Error");
RETURN_FALSE;
}

23
ext/dom/element.c

@ -185,7 +185,7 @@ PHP_FUNCTION(dom_element_set_attribute)
}
if (dom_node_is_read_only(nodep) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -207,7 +207,7 @@ PHP_FUNCTION(dom_element_set_attribute)
/* {{{ proto dom_void dom_element_remove_attribute(string name);
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9
Since:
Since:
*/
PHP_FUNCTION(dom_element_remove_attribute)
{
@ -225,7 +225,7 @@ PHP_FUNCTION(dom_element_remove_attribute)
}
if (dom_node_is_read_only(nodep) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -296,7 +296,7 @@ PHP_FUNCTION(dom_element_set_attribute_node)
}
if (dom_node_is_read_only(nodep) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -357,7 +357,7 @@ PHP_FUNCTION(dom_element_remove_attribute_node)
}
if (dom_node_is_read_only(nodep) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -500,7 +500,7 @@ PHP_FUNCTION(dom_element_set_attribute_ns)
char *uri, *name;
char *localname = NULL, *prefix = NULL;
dom_object *intern;
int errorcode = 0;
int errorcode = 0, stricterror;
DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr, intern);
@ -508,8 +508,10 @@ PHP_FUNCTION(dom_element_set_attribute_ns)
return;
}
stricterror = dom_get_strict_error(intern->document);
if (dom_node_is_read_only(elemp) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
@ -543,8 +545,7 @@ PHP_FUNCTION(dom_element_set_attribute_ns)
}
if (errorcode != 0) {
php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
php_dom_throw_error(errorcode, stricterror TSRMLS_CC);
RETURN_FALSE;
}
@ -577,7 +578,7 @@ PHP_FUNCTION(dom_element_remove_attribute_ns)
}
if (dom_node_is_read_only(nodep) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -664,7 +665,7 @@ PHP_FUNCTION(dom_element_set_attribute_node_ns)
}
if (dom_node_is_read_only(nodep) == SUCCESS) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}

89
ext/dom/node.c

@ -194,7 +194,7 @@ int dom_node_node_value_write(dom_object *obj, zval *newval TSRMLS_DC)
/* {{{ proto nodeType unsigned short
readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-111237558
Since:
Since:
*/
int dom_node_node_type_read(dom_object *obj, zval **retval TSRMLS_DC)
{
@ -238,7 +238,7 @@ int dom_node_parent_node_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;
@ -311,7 +311,7 @@ int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object(first, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;
@ -344,7 +344,7 @@ int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object(last, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;
@ -374,7 +374,7 @@ int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object(prevsib, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;
@ -384,10 +384,10 @@ int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
/* {{{ proto nextSibling node
/* {{{ proto nextSibling node
readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6AC54C2F
Since:
Since:
*/
int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
{
@ -404,7 +404,7 @@ int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object(nextsib, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;
@ -478,7 +478,7 @@ int dom_node_owner_document_read(dom_object *obj, zval **retval TSRMLS_DC)
ALLOC_ZVAL(*retval);
if (NULL == (*retval = php_dom_create_object((xmlNodePtr) docp, &ret, NULL, *retval, obj TSRMLS_CC))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
php_error(E_WARNING, "Cannot create required DOM object");
return FAILURE;
}
return SUCCESS;
@ -586,9 +586,7 @@ int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC)
strcmp (strURI, DOM_XMLNS_NAMESPACE)) ||
(nodep->type == XML_ATTRIBUTE_NODE && !strcmp (nodep->name, "xmlns"))) {
/* TODO: throw error - find out how to without a return_value
php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC); */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
php_dom_throw_error(NAMESPACE_ERR, dom_get_strict_error(obj->document) TSRMLS_CC);
return FAILURE;
}
ns = xmlNewNs(NULL, nodep->ns->href, (xmlChar *)prefix);
@ -649,8 +647,8 @@ int dom_node_local_name_read(dom_object *obj, zval **retval TSRMLS_DC)
/* {{{ proto baseURI string
readonly=yes
/* {{{ proto baseURI string
readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-baseURI
Since: DOM Level 3
*/
@ -704,14 +702,14 @@ int dom_node_text_content_write(dom_object *obj, zval *newval TSRMLS_DC)
/* {{{ proto domnode dom_node_insert_before(node newChild, node refChild);
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
Since:
Since:
*/
PHP_FUNCTION(dom_node_insert_before)
{
zval *id, *node, *ref, *rv = NULL;
xmlNodePtr child, new_child, parentp, refp;
dom_object *intern, *childobj, *refpobj;
int ret;
int ret, stricterror;
DOM_GET_THIS_OBJ(parentp, id, xmlNodePtr, intern);
@ -723,21 +721,21 @@ PHP_FUNCTION(dom_node_insert_before)
new_child = NULL;
if (dom_node_is_read_only(parentp) == SUCCESS ||
stricterror = dom_get_strict_error(intern->document);
if (dom_node_is_read_only(parentp) == SUCCESS ||
(child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
if (dom_hierarchy(parentp, child) == FAILURE) {
php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
if (child->doc != parentp->doc && child->doc != NULL) {
php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as it was created from a different document");
php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
@ -749,8 +747,7 @@ PHP_FUNCTION(dom_node_insert_before)
if (ref != NULL) {
DOM_GET_OBJ(refp, ref, xmlNodePtr, refpobj);
if (refp->parent != parentp) {
php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as refnode is not child of node");
php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
@ -868,7 +865,7 @@ PHP_FUNCTION(dom_node_replace_child)
zval *id, *newnode, *oldnode;
xmlNodePtr children, newchild, oldchild, nodep;
dom_object *intern, *newchildobj, *oldchildobj;
int foundoldchild = 0;
int foundoldchild = 0, stricterror;
int ret;
@ -890,21 +887,21 @@ PHP_FUNCTION(dom_node_replace_child)
RETURN_FALSE;
}
stricterror = dom_get_strict_error(intern->document);
if (dom_node_is_read_only(nodep) == SUCCESS ||
(newchild->parent != NULL && dom_node_is_read_only(newchild->parent) == SUCCESS)) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
if (newchild->doc != nodep->doc && newchild->doc != NULL) {
php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as it was created from a different document");
php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
if (dom_hierarchy(nodep, newchild) == FAILURE) {
php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
@ -931,7 +928,7 @@ PHP_FUNCTION(dom_node_replace_child)
DOM_RET_OBJ(rv, oldchild, &ret, intern);
return;
} else {
php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
@ -948,7 +945,7 @@ PHP_FUNCTION(dom_node_remove_child)
zval *id, *node;
xmlNodePtr children, child, nodep;
dom_object *intern, *childobj;
int ret;
int ret, stricterror;
DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
@ -962,15 +959,17 @@ PHP_FUNCTION(dom_node_remove_child)
DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
stricterror = dom_get_strict_error(intern->document);
if (dom_node_is_read_only(nodep) == SUCCESS ||
(child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
children = nodep->children;
if (!children) {
php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
@ -984,7 +983,7 @@ PHP_FUNCTION(dom_node_remove_child)
children = children->next;
}
php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NOT_FOUND_ERR, stricterror TSRMLS_CC);
RETURN_FALSE
}
/* }}} end dom_node_remove_child */
@ -1000,7 +999,7 @@ PHP_FUNCTION(dom_node_append_child)
xmlNodePtr child, nodep, new_child = NULL;
dom_object *intern, *childobj;
xmlNsPtr nsptr;
int ret;
int ret, stricterror;
DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
@ -1014,21 +1013,21 @@ PHP_FUNCTION(dom_node_append_child)
DOM_GET_OBJ(child, node, xmlNodePtr, childobj);
if (dom_node_is_read_only(nodep) == SUCCESS ||
stricterror = dom_get_strict_error(intern->document);
if (dom_node_is_read_only(nodep) == SUCCESS ||
(child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, &return_value TSRMLS_CC);
php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
if (dom_hierarchy(nodep, child) == FAILURE) {
php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
if (!(child->doc == NULL || child->doc == nodep->doc)) {
php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't append node, which is in a different document than the parent node");
php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror TSRMLS_CC);
RETURN_FALSE;
}
@ -1083,7 +1082,7 @@ PHP_FUNCTION(dom_node_append_child)
new_child = xmlAddChild(nodep, child);
if (new_child == NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't append node");
php_error(E_WARNING, "Couldn't append node");
RETURN_FALSE;
}
@ -1147,7 +1146,7 @@ PHP_FUNCTION(dom_node_clone_node)
return;
}
node = xmlCopyNode(n, recursive);
node = xmlDocCopyNode(n, n->doc, recursive);
if (!node) {
RETURN_FALSE;
}
@ -1351,7 +1350,7 @@ PHP_FUNCTION(dom_node_lookup_namespace_uri)
RETURN_STRING((char *) nsptr->href, 1);
}
}
RETURN_NULL();
}
/* }}} end dom_node_lookup_namespace_uri */

19
ext/dom/php_dom.c

@ -88,7 +88,11 @@ int dom_node_is_read_only(xmlNodePtr node) {
return SUCCESS;
break;
default:
return FAILURE;
if (node->doc == NULL) {
return SUCCESS;
} else {
return FAILURE;
}
}
}
/* }}} end dom_node_is_read_only */
@ -110,6 +114,14 @@ int dom_node_children_valid(xmlNodePtr node) {
}
/* }}} end dom_node_children_valid */
int dom_get_strict_error(dom_ref_obj *document) {
if (document) {
return document->stricterror;
} else {
return 1;
}
}
/* {{{ int increment_document_reference(dom_object *object) */
int increment_document_reference(dom_object *object, xmlDocPtr docp TSRMLS_DC) {
int ret_refcount = -1;
@ -122,6 +134,7 @@ int increment_document_reference(dom_object *object, xmlDocPtr docp TSRMLS_DC) {
object->document = emalloc(sizeof(dom_ref_obj));
object->document->ptr = docp;
object->document->refcount = ret_refcount;
object->document->stricterror = 1;
}
return ret_refcount;
@ -344,6 +357,10 @@ void dom_write_property(zval *object, zval *member, zval *value TSRMLS_DC)
}
if (ret == SUCCESS) {
hnd->write_func(obj, value TSRMLS_CC);
if (! PZVAL_IS_REF(value) && value->refcount == 0) {
value->refcount++;
zval_ptr_dtor(&value);
}
} else {
std_hnd = zend_get_std_object_handlers();
std_hnd->write_property(object, member, value TSRMLS_CC);

Loading…
Cancel
Save