cvs: php-src /ext/xsl xsltprocessor.c

From: Date: Sat, 28 Jul 2007 09:16:16 +0000
Subject: cvs: php-src /ext/xsl xsltprocessor.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-45629@lists.php.net to get a copy of this message
rrichards Sat Jul 28 09:16:16 2007 UTC Modified files: /php-src/ext/xsl xsltprocessor.c Log: allow user specified class to be returned from transformToDoc http://cvs.php.net/viewvc.cgi/php-src/ext/xsl/xsltprocessor.c?r1=1.55&r2=1.56&diff_format=u Index: php-src/ext/xsl/xsltprocessor.c diff -u php-src/ext/xsl/xsltprocessor.c:1.55 php-src/ext/xsl/xsltprocessor.c:1.56 --- php-src/ext/xsl/xsltprocessor.c:1.55 Mon Jan 1 09:29:34 2007 +++ php-src/ext/xsl/xsltprocessor.c Sat Jul 28 09:16:15 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xsltprocessor.c,v 1.55 2007/01/01 09:29:34 sebastian Exp $ */ +/* $Id: xsltprocessor.c,v 1.56 2007/07/28 09:16:15 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -506,21 +506,50 @@ zval *id, *rv = NULL, *docp = NULL; xmlDoc *newdocp; xsltStylesheetPtr sheetp; - int ret; + int ret, ret_class_len=0; + zstr ret_class = NULL_ZSTR; xsl_object *intern; + zend_uchar ret_class_type; id = getThis(); intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC); sheetp = (xsltStylesheetPtr) intern->ptr; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|t!", &docp, &ret_class, &ret_class_len, &ret_class_type) == FAILURE) { RETURN_FALSE; } newdocp = php_xsl_apply_stylesheet(id, intern, sheetp, docp TSRMLS_CC); if (newdocp) { - DOM_RET_OBJ(rv, (xmlNodePtr) newdocp, &ret, NULL); + if (ret_class_len > 0) { + int found; + zstr curclass_name; + zend_class_entry *curce, **ce; + php_libxml_node_object *interndoc; + + curce = Z_OBJCE_P(docp); + curclass_name = curce->name; + while (curce->parent != NULL) { + curce = curce->parent; + } + + found = zend_u_lookup_class(ret_class_type, ret_class, ret_class_len, &ce TSRMLS_CC); + if ((found != SUCCESS) || !instanceof_function(*ce, curce TSRMLS_CC)) { + xmlFreeDoc(newdocp); + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Expecting class compatible with %v, '%v' given", curclass_name, ret_class); + RETURN_FALSE; + } + + object_init_ex(return_value, *ce); + + interndoc = (php_libxml_node_object *)zend_objects_get_address(return_value TSRMLS_CC); + php_libxml_increment_doc_ref(interndoc, newdocp TSRMLS_CC); + php_libxml_increment_node_ptr(interndoc, (xmlNodePtr)newdocp, (void *)interndoc TSRMLS_CC); + } else { + DOM_RET_OBJ(rv, (xmlNodePtr) newdocp, &ret, NULL); + } } else { RETURN_FALSE; }

« previous php.cvs (#45629) next »