--- parser3/src/classes/xdoc.C 2002/09/20 13:09:49 1.103 +++ parser3/src/classes/xdoc.C 2003/04/11 09:58:10 1.110 @@ -1,14 +1,14 @@ /** @file Parser: @b xdoc parser class. - Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ #include "classes.h" #ifdef XML -static const char* IDENT_XDOC_C="$Date: 2002/09/20 13:09:49 $"; +static const char* IDENT_XDOC_C="$Date: 2003/04/11 09:58:10 $"; #include "pa_stylesheet_connection.h" #include "pa_request.h" @@ -177,7 +177,7 @@ static void _createElement(Request& r, c GdomeException exc; GdomeNode *node= (GdomeNode *)gdome_doc_createElement(vdoc.get_document(&method_name), - pool.transcode(tagName).get(), + pool.transcode(tagName).use(), &exc); writeNode(r, method_name, node, exc); } @@ -205,7 +205,7 @@ static void _createTextNode(Request& r, GdomeException exc; GdomeNode *node=(GdomeNode *)gdome_doc_createTextNode( vdoc.get_document(&method_name), - pool.transcode(data).get(), + pool.transcode(data).use(), &exc); writeNode(r, method_name, node, exc); } @@ -220,7 +220,7 @@ static void _createComment(Request& r, c GdomeException exc; GdomeNode *node=(GdomeNode *)gdome_doc_createComment( vdoc.get_document(&method_name), - pool.transcode(data).get(), + pool.transcode(data).use(), &exc); writeNode(r, method_name, node, exc); } @@ -235,7 +235,7 @@ static void _createCDATASection(Request& GdomeException exc; GdomeNode *node=(GdomeNode *)gdome_doc_createCDATASection( vdoc.get_document(&method_name), - pool.transcode(data).get(), + pool.transcode(data).use(), &exc); writeNode(r, method_name, node, exc); } @@ -251,8 +251,8 @@ static void _createProcessingInstruction GdomeException exc; GdomeNode *node=(GdomeNode *)gdome_doc_createProcessingInstruction( vdoc.get_document(&method_name), - pool.transcode(target).get(), - pool.transcode(data).get(), + pool.transcode(target).use(), + pool.transcode(data).use(), &exc); writeNode(r, method_name, node, exc); } @@ -267,7 +267,7 @@ static void _createAttribute(Request& r, GdomeException exc; GdomeNode *node=(GdomeNode *)gdome_doc_createAttribute( vdoc.get_document(&method_name), - pool.transcode(name).get(), + pool.transcode(name).use(), &exc); writeNode(r, method_name, node, exc); } @@ -281,7 +281,7 @@ static void _createEntityReference(Reque GdomeException exc; GdomeNode *node=(GdomeNode *)gdome_doc_createEntityReference( vdoc.get_document(&method_name), - pool.transcode(name).get(), + pool.transcode(name).use(), &exc); writeNode(r, method_name, node, exc); } @@ -298,7 +298,7 @@ static void _getElementsByTagName(Reques if(GdomeNodeList *nodes= gdome_doc_getElementsByTagName( vdoc.get_document(&method_name), - pool.transcode(name).get(), + pool.transcode(name).use(), &exc)) { gulong length=gdome_nl_length(nodes, &exc); for(gulong i=0; ias_string(0, "uri must be string"); const String& uri=r.absolute(file_name); - + + void *data; size_t size; + file_read(pool, uri, data, size, false/*not text*/, + params->size()>1?params->as_no_junction(1, "additional params must be hash").get_hash(&method_name) + :0); + GdomeDocument *document=(GdomeDocument *) - gdome_xml_n_mkref((xmlNode *)xmlParseFile(uri.cstr())); + gdome_xml_n_mkref((xmlNode *)xmlParseMemory((const char *)data, size)); if(!document || xmlHaveGenericErrors()) { GdomeException exc=0; throw Exception( &uri, exc); } + const char *URI_cstr=uri.cstr(); + xmlDoc *doc=gdome_xml_doc_get_xmlDoc(document); + if(URI_cstr) + doc->URL=pool.transcode_buf2xchar(URI_cstr, strlen(URI_cstr)); // replace any previous parsed source vdoc.set_document(document); @@ -608,7 +617,7 @@ static void xdoc2buf(Pool& pool, VXdoc& "xsltNewStylesheet failed"); #define OOS2STYLE(name) \ - stylesheet->name=oo.name?BAD_CAST g_strdup(pool.transcode(*oo.name)->str):0 + stylesheet->name=oo.name?BAD_CAST xmlMemStrdup(pool.transcode(*oo.name)->str):0 #define OOE2STYLE(name) \ stylesheet->name=oo.name @@ -765,13 +774,13 @@ static VXdoc& _transform(Pool& pool, con memset(&result.output_options, 0, sizeof(result.output_options)); VXdoc::Output_options& oo=result.output_options; - oo.method=stylesheet->method?&pool.transcode(stylesheet->method):0; - oo.encoding=stylesheet->encoding?&pool.transcode(stylesheet->encoding):0; - oo.mediaType=stylesheet->mediaType?&pool.transcode(stylesheet->mediaType):0; - oo.doctypeSystem=stylesheet->doctypeSystem?&pool.transcode(stylesheet->doctypeSystem):0; - oo.doctypePublic=stylesheet->doctypePublic?&pool.transcode(stylesheet->doctypePublic):0; + oo.method=stylesheet->method?&pool.transcode(stylesheet->method, stylesheet_source):0; + oo.encoding=stylesheet->encoding?&pool.transcode(stylesheet->encoding, stylesheet_source):0; + oo.mediaType=stylesheet->mediaType?&pool.transcode(stylesheet->mediaType, stylesheet_source):0; + oo.doctypeSystem=stylesheet->doctypeSystem?&pool.transcode(stylesheet->doctypeSystem, stylesheet_source):0; + oo.doctypePublic=stylesheet->doctypePublic?&pool.transcode(stylesheet->doctypePublic, stylesheet_source):0; oo.indent=stylesheet->indent!=0; - oo.version=stylesheet->version?&pool.transcode(stylesheet->version):0; + oo.version=stylesheet->version?&pool.transcode(stylesheet->version, stylesheet_source):0; oo.standalone=stylesheet->standalone!=0; oo.omitXmlDeclaration=stylesheet->omitXmlDeclaration!=0; @@ -786,7 +795,7 @@ static void _transform(Request& r, const const char **transform_params=0; if(params->size()>1) { Value& vparams=params->as_no_junction(1, "transform parameters must be hash"); - if(vparams.is_defined()) + if(!vparams.is_string()) if(Hash *params=vparams.get_hash(&method_name)) { const char **current_transform_param=transform_params= (const char **)pool.malloc(sizeof(const char *)*(params->size()*2+1)); @@ -884,7 +893,7 @@ MXdoc::MXdoc(Pool& apool) : MXnode(apool add_native_method("set", Method::CT_DYNAMIC, _create, 1, 1); // ^xdoc::load[some.xml] - add_native_method("load", Method::CT_DYNAMIC, _load, 1, 1); + add_native_method("load", Method::CT_DYNAMIC, _load, 1, 2); // ^xdoc.save[some.xml] // ^xdoc.save[some.xml;options hash]