rrichards Thu Oct 13 16:17:18 2005 EDT Modified files: /php-src/ext/libxml libxml.c Log: insure stream usage http://cvs.php.net/diff.php/php-src/ext/libxml/libxml.c?r1=1.36&r2=1.37&ty=u Index: php-src/ext/libxml/libxml.c diff -u php-src/ext/libxml/libxml.c:1.36 php-src/ext/libxml/libxml.c:1.37 --- php-src/ext/libxml/libxml.c:1.36 Thu Sep 8 06:33:57 2005 +++ php-src/ext/libxml/libxml.c Thu Oct 13 16:17:18 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: libxml.c,v 1.36 2005/09/08 10:33:57 rrichards Exp $ */ +/* $Id: libxml.c,v 1.37 2005/10/13 20:17:18 rrichards Exp $ */ #define IS_EXT_MODULE @@ -249,36 +249,6 @@ /* Channel libxml file io layer through the PHP streams subsystem. * This allows use of ftps:// and https:// urls */ -int php_libxml_streams_IO_match_wrapper(const char *filename) -{ - char *resolved_path; - int retval, isescaped=0; - xmlURI *uri; - - TSRMLS_FETCH(); - - if (zend_is_executing(TSRMLS_C)) { - uri = xmlParseURI((xmlChar *)filename); - if (uri && (uri->scheme == NULL || (xmlStrncmp(uri->scheme, "file", 4) == 0))) { - resolved_path = xmlURIUnescapeString(filename, 0, NULL); - isescaped = 1; - } else { - resolved_path = (char *)filename; - } - - if (uri) { - xmlFreeURI(uri); - } - - retval = php_stream_locate_url_wrapper(resolved_path, NULL, 0 TSRMLS_CC) ? 1 : 0; - if (resolved_path && isescaped) { - xmlFree(resolved_path); - } - return retval; - } - return 0; -} - void *php_libxml_streams_IO_open_wrapper(const char *filename, const char *mode, const int read_only) { php_stream_statbuf ssbuf; @@ -362,6 +332,78 @@ return php_stream_close((php_stream*)context); } +xmlParserInputBufferPtr +php_libxml_input_buffer_create_filename(const char *URI, xmlCharEncoding enc) +{ + xmlParserInputBufferPtr ret; + void *context = NULL; + + if (URI == NULL) + return(NULL); + + context = php_libxml_streams_IO_open_read_wrapper(URI); + + if (context == NULL) { + return(NULL); + } + + /* Allocate the Input buffer front-end. */ + ret = xmlAllocParserInputBuffer(enc); + if (ret != NULL) { + ret->context = context; + ret->readcallback = php_libxml_streams_IO_read; + ret->closecallback = php_libxml_streams_IO_close; + } else + php_libxml_streams_IO_close(context); + + return(ret); +} + +xmlOutputBufferPtr +php_libxml_output_buffer_create_filename(const char *URI, + xmlCharEncodingHandlerPtr encoder, + int compression ATTRIBUTE_UNUSED) +{ + xmlOutputBufferPtr ret; + xmlURIPtr puri; + void *context = NULL; + char *unescaped = NULL; + + if (URI == NULL) + return(NULL); + + puri = xmlParseURI(URI); + if (puri != NULL) { + if (puri->scheme != NULL) + unescaped = xmlURIUnescapeString(URI, 0, NULL); + xmlFreeURI(puri); + } + + if (unescaped != NULL) { + context = php_libxml_streams_IO_open_write_wrapper(unescaped); + xmlFree(unescaped); + } + + /* try with a non-escaped URI this may be a strange filename */ + if (context == NULL) { + context = context = php_libxml_streams_IO_open_write_wrapper(URI); + } + + if (context == NULL) { + return(NULL); + } + + /* Allocate the Output buffer front-end. */ + ret = xmlAllocOutputBuffer(encoder); + if (ret != NULL) { + ret->context = context; + ret->writecallback = php_libxml_streams_IO_write; + ret->closecallback = php_libxml_streams_IO_close; + } + + return(ret); +} + static int _php_libxml_free_error(xmlErrorPtr error) { /* This will free the libxml alloc'd memory */ xmlResetError(error); @@ -501,22 +543,6 @@ /* we should be the only one's to ever init!! */ xmlInitParser(); - /* Enable php stream/wrapper support for libxml - we only use php streams, so we do not enable - the default io handlers in libxml. - */ - xmlRegisterInputCallbacks( - php_libxml_streams_IO_match_wrapper, - php_libxml_streams_IO_open_read_wrapper, - php_libxml_streams_IO_read, - php_libxml_streams_IO_close); - - xmlRegisterOutputCallbacks( - php_libxml_streams_IO_match_wrapper, - php_libxml_streams_IO_open_write_wrapper, - php_libxml_streams_IO_write, - php_libxml_streams_IO_close); - zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1); _php_libxml_initialized = 1; @@ -595,6 +621,8 @@ { /* report errors via handler rather than stderr */ xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); + xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename); + xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename); return SUCCESS; } @@ -613,6 +641,9 @@ xmlSetGenericErrorFunc(NULL, NULL); xmlSetStructuredErrorFunc(NULL, NULL); + xmlParserInputBufferCreateFilenameDefault(NULL); + xmlOutputBufferCreateFilenameDefault(NULL); + smart_str_free(&LIBXML(error_buffer)); if (LIBXML(error_list)) { zend_llist_destroy(LIBXML(error_list));
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php