PHP_FALIAS(relaxNGValidate, dom_document_relaxNG_validate_file, NULL)
PHP_FALIAS(relaxNGValidateSource, dom_document_relaxNG_validate_xml, NULL)
#endif
+ PHP_ME(domdocument, registerNodeClass, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
*/
int dom_document_strict_error_checking_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
ALLOC_ZVAL(*retval);
if (obj->document) {
int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRMLS_DC)
{
zval value_copy;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
if(newval->refcount > 1) {
value_copy = *newval;
*/
int dom_document_format_output_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
ALLOC_ZVAL(*retval);
if (obj->document) {
int dom_document_format_output_write(dom_object *obj, zval *newval TSRMLS_DC)
{
zval value_copy;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
if(newval->refcount > 1) {
value_copy = *newval;
*/
int dom_document_validate_on_parse_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
ALLOC_ZVAL(*retval);
if (obj->document) {
int dom_document_validate_on_parse_write(dom_object *obj, zval *newval TSRMLS_DC)
{
zval value_copy;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
if(newval->refcount > 1) {
value_copy = *newval;
*/
int dom_document_resolve_externals_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
ALLOC_ZVAL(*retval);
if (obj->document) {
int dom_document_resolve_externals_write(dom_object *obj, zval *newval TSRMLS_DC)
{
zval value_copy;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
if(newval->refcount > 1) {
value_copy = *newval;
*/
int dom_document_preserve_whitespace_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
ALLOC_ZVAL(*retval);
if (obj->document) {
int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_DC)
{
zval value_copy;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
if(newval->refcount > 1) {
value_copy = *newval;
*/
int dom_document_recover_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
ALLOC_ZVAL(*retval);
if (obj->document) {
int dom_document_recover_write(dom_object *obj, zval *newval TSRMLS_DC)
{
zval value_copy;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
if(newval->refcount > 1) {
value_copy = *newval;
*/
int dom_document_substitue_entities_read(dom_object *obj, zval **retval TSRMLS_DC)
{
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
ALLOC_ZVAL(*retval);
if (obj->document) {
int dom_document_substitue_entities_write(dom_object *obj, zval *newval TSRMLS_DC)
{
zval value_copy;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
if(newval->refcount > 1) {
value_copy = *newval;
static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, int options TSRMLS_DC) {
xmlDocPtr ret;
xmlParserCtxtPtr ctxt = NULL;
- dom_doc_props *doc_props;
+ dom_doc_propsptr doc_props;
dom_object *intern;
php_libxml_ref_obj *document = NULL;
int validate, recover, resolve_externals, keep_blanks, substitute_ent;
xmlInitParser();
-#if LIBXML_VERSION < 20600
- keep_blanks = xmlKeepBlanksDefault(keep_blanks);
-#endif
-
if (mode == DOM_LOAD_FILE) {
char *file_dest = _dom_get_valid_file_path(source, resolved_path, MAXPATHLEN TSRMLS_CC);
if (file_dest) {
ctxt = xmlCreateDocParserCtxt(source);
}
-#if LIBXML_VERSION < 20600
- xmlKeepBlanksDefault(keep_blanks);
- /* xmlIndentTreeOutput default is changed in xmlKeepBlanksDefault
- reset back to 1 which is default value */
-
- xmlIndentTreeOutput = 1;
-#endif
-
if (ctxt == NULL) {
return(NULL);
}
ctxt->sax->warning = php_libxml_ctx_warning;
}
-#if LIBXML_VERSION >= 20600
if (validate && ! (options & XML_PARSE_DTDVALID)) {
options |= XML_PARSE_DTDVALID;
}
}
xmlCtxtUseOptions(ctxt, options);
-#else
- ctxt->validate = validate;
- ctxt->loadsubset = (resolve_externals * XML_COMPLETE_ATTRS);
- ctxt->replaceEntities = substitute_ent;
-#endif
ctxt->recovery = recover;
if (recover) {
static void dom_parse_document(INTERNAL_FUNCTION_PARAMETERS, int mode) {
zval *id, *rv = NULL;
xmlDoc *docp = NULL, *newdoc;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
dom_object *intern;
char *source;
int source_len, refcount, ret;
xmlDoc *docp;
int file_len = 0, bytes, format, saveempty;
dom_object *intern;
- dom_doc_props *doc_props;
+ dom_doc_propsptr doc_props;
char *file;
long options = 0;
xmlBufferPtr buf;
xmlChar *mem;
dom_object *intern, *nodeobj;
- dom_doc_props *doc_props;
+ dom_doc_propsptr doc_props;
int size, format, saveempty;
long options = 0;
DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
-#if LIBXML_VERSION >= 20607
err = xmlXIncludeProcessFlags(docp, flags);
-#else
- err = xmlXIncludeProcess (docp);
-#endif
/* XML_XINCLUDE_START and XML_XINCLUDE_END nodes need to be removed as these
are added via xmlXIncludeProcess to mark beginning and ending of xincluded document
zval *id, *rv = NULL;
xmlDoc *docp = NULL, *newdoc;
dom_object *intern;
- dom_doc_props *doc_prop;
+ dom_doc_propsptr doc_prop;
char *source;
int source_len, refcount, ret;
htmlParserCtxtPtr ctxt;
xmlDoc *docp;
int file_len, bytes, format;
dom_object *intern;
- dom_doc_props *doc_props;
+ dom_doc_propsptr doc_props;
char *file;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &file, &file_len) == FAILURE) {
#endif /* defined(LIBXML_HTML_ENABLED) */
+/* {{{ proto boolean DOMDocument::registerNodeClass(string baseclass, string extendedclass);
+ Register extended class used to create base node type */
+PHP_METHOD(domdocument, registerNodeClass)
+{
+ zval *id;
+ xmlDoc *docp;
+ char *baseclass = NULL, *extendedclass = NULL;
+ int baseclass_len = 0, extendedclass_len = 0;
+ zend_class_entry *basece = NULL, *ce = NULL;
+ dom_object *intern;
+ zend_uchar type1, type2;
+
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oss!", &id, dom_document_class_entry, &baseclass, &baseclass_len, &extendedclass, &extendedclass_len) == FAILURE) {
+ return;
+ }
+
+ if (baseclass_len) {
+ zend_class_entry **pce;
+ if (zend_lookup_class(baseclass, baseclass_len, &pce TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", baseclass);
+ return;
+ }
+ basece = *pce;
+ }
+
+ if (basece == NULL || ! instanceof_function(basece, dom_node_class_entry TSRMLS_CC)) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s is not derived from DOMNode.", baseclass);
+ return;
+ }
+
+ if (extendedclass_len) {
+ zend_class_entry **pce;
+ if (zend_lookup_class(extendedclass, extendedclass_len, &pce TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", extendedclass);
+ }
+ ce = *pce;
+ }
+
+ if (ce == NULL || instanceof_function(ce, basece TSRMLS_CC)) {
+
+ DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
+
+ if (dom_set_doc_classmap(intern->document, basece, ce TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s could not be registered.", extendedclass);
+ }
+ RETURN_TRUE;
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s is not derived from %s.", extendedclass, baseclass);
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
#endif /* HAVE_LIBXML && HAVE_DOM */
/* {{{ dom_get_doc_props() */
dom_doc_propsptr dom_get_doc_props(php_libxml_ref_obj *document)
{
- dom_doc_props *doc_props;
+ dom_doc_propsptr doc_props;
if (document && document->doc_props) {
return document->doc_props;
} else {
- doc_props = emalloc(sizeof(dom_doc_props));
+ doc_props = emalloc(sizeof(libxml_doc_props));
doc_props->formatoutput = 0;
doc_props->validateonparse = 0;
doc_props->resolveexternals = 0;
doc_props->substituteentities = 0;
doc_props->stricterror = 1;
doc_props->recover = 0;
+ doc_props->classmap = NULL;
if (document) {
document->doc_props = doc_props;
}
return doc_props;
}
}
+
+int dom_set_doc_classmap(php_libxml_ref_obj *document, zend_class_entry *basece, zend_class_entry *ce TSRMLS_DC)
+{
+ dom_doc_propsptr doc_props;
+
+ if (document) {
+ doc_props = dom_get_doc_props(document);
+ if (doc_props->classmap == NULL) {
+ if (ce == NULL) {
+ return SUCCESS;
+ }
+ ALLOC_HASHTABLE(doc_props->classmap);
+ zend_hash_init(doc_props->classmap, 0, NULL, NULL, 0);
+ }
+ if (ce) {
+ return zend_hash_add(doc_props->classmap, basece->name, basece->name_length + 1, &ce, sizeof(ce), NULL);
+ } else {
+ return zend_hash_del(doc_props->classmap, basece->name, basece->name_length + 1);
+ }
+ }
+ return SUCCESS;
+}
+
+zend_class_entry *dom_get_doc_classmap(php_libxml_ref_obj *document, zend_class_entry *basece TSRMLS_DC)
+{
+ dom_doc_propsptr doc_props;
+ zend_class_entry **ce = NULL;
+
+ if (document) {
+ doc_props = dom_get_doc_props(document);
+ if (doc_props->classmap) {
+ if (zend_hash_find(doc_props->classmap, basece->name, basece->name_length + 1, (void**) &ce) == SUCCESS) {
+ return *ce;
+ }
+ }
+ }
+
+ return basece;
+}
/* }}} */
/* {{{ dom_get_strict_error() */
int dom_get_strict_error(php_libxml_ref_obj *document) {
int stricterror;
- dom_doc_props *doc_props;
+ dom_doc_propsptr doc_props;
doc_props = dom_get_doc_props(document);
stricterror = doc_props->stricterror;
return wrapper;
}
+ if (domobj && domobj->document) {
+ ce = dom_get_doc_classmap(domobj->document, ce TSRMLS_CC);
+ }
object_init_ex(wrapper, ce);
intern = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);