--- parser3/src/classes/xdoc.C 2020/11/10 22:42:25 1.197 +++ parser3/src/classes/xdoc.C 2021/10/19 16:16:35 1.201 @@ -1,7 +1,7 @@ /** @file Parser: @b xdoc parser class. - Copyright (c) 2001-2017 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2020 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -28,7 +28,7 @@ #include "xnode.h" #include "pa_charsets.h" -volatile const char * IDENT_XDOC_C="$Id: xdoc.C,v 1.197 2020/11/10 22:42:25 moko Exp $"; +volatile const char * IDENT_XDOC_C="$Id: xdoc.C,v 1.201 2021/10/19 16:16:35 moko Exp $"; // defines @@ -118,39 +118,6 @@ private: xsltTransformContext *_Ptr; }; -class xsltStylesheet_auto_ptr { -public: - explicit xsltStylesheet_auto_ptr(xsltStylesheet *_APtr = 0) - : _Owns(_APtr != 0), _Ptr(_APtr) {} - xsltStylesheet_auto_ptr(const xsltStylesheet_auto_ptr& _Y) - : _Owns(_Y._Owns), _Ptr(_Y.release()) {} - xsltStylesheet_auto_ptr& operator=(const xsltStylesheet_auto_ptr& _Y) - {if (this != &_Y) - {if (_Ptr != _Y.get()) - {if (_Owns && _Ptr) - xsltFreeStylesheet(_Ptr); - _Owns = _Y._Owns; } - else if (_Y._Owns) - _Owns = true; - _Ptr = _Y.release(); } - return (*this); } - ~xsltStylesheet_auto_ptr() - {if (_Owns && _Ptr) - xsltFreeStylesheet(_Ptr); } - xsltStylesheet& operator*() const - {return (*get()); } - xsltStylesheet *operator->() const - {return (get()); } - xsltStylesheet *get() const - {return (_Ptr); } - xsltStylesheet *release() const - {((xsltStylesheet_auto_ptr *)this)->_Owns = false; - return (_Ptr); } -private: - bool _Owns; - xsltStylesheet *_Ptr; -}; - // methods static void writeNode(Request& r, VXdoc& xdoc, xmlNode* node) { @@ -401,7 +368,7 @@ static void _create(Request& r, MethodPa set_encoding=true; // must be last action in if, see after if} } else { - VFile* vfile=param.as_vfile(String::L_AS_IS); + VFile* vfile=param.as_vfile(); xmldoc=xmlReadMemory(vfile->value_ptr(), vfile->value_size(), NULL, NULL, XML_PARSE_OPTIONS); if(!xmldoc || xmlHaveGenericErrors()) throw XmlException(0, r); @@ -472,11 +439,9 @@ String::C xdoc2buf(Request& r, VXdoc& vd xmlOutputBuffer_auto_ptr outputBuffer(xmlAllocOutputBuffer(renderer)); - xsltStylesheet_auto_ptr stylesheet(xsltNewStylesheet()); - if(!stylesheet.get()) - throw Exception(0, - 0, - "xsltNewStylesheet failed"); + xsltStylesheet *stylesheet = xsltNewStylesheet(); + if(!stylesheet) + throw Exception(0, 0, "xsltNewStylesheet failed"); #define OOSTRING2STYLE(name) \ stylesheet->name=oo.name?BAD_CAST xmlMemStrdup((const char*)r.transcode(*oo.name)):0 @@ -497,7 +462,7 @@ String::C xdoc2buf(Request& r, VXdoc& vd xmldoc.encoding=BAD_CAST xmlMemStrdup(render_encoding); if(header_encoding) stylesheet->encoding=BAD_CAST xmlMemStrdup(header_encoding); - if(xsltSaveResultTo(outputBuffer.get(), &xmldoc, stylesheet.get())<0 + if(xsltSaveResultTo(outputBuffer.get(), &xmldoc, stylesheet)<0 || xmlHaveGenericErrors()) throw XmlException(0, r); @@ -594,8 +559,7 @@ static void add_xslt_param( *info->current_transform_param++=(s=info->r->transcode(meaning->as_string())); *info->strings+=s; } -static VXdoc& _transform(Request& r, const String* stylesheet_source, - VXdoc& vdoc, xsltStylesheetPtr stylesheet, const xmlChar** transform_params) +static VXdoc& _transform(Request& r, const String* stylesheet_source, VXdoc& vdoc, xsltStylesheetPtr stylesheet, const xmlChar** transform_params) { xmlDoc& xmldoc=vdoc.get_xmldoc(); @@ -669,24 +633,21 @@ static void _transform(Request& r, Metho VXdoc* result; if(Value *vxdoc=params[0].as(VXDOC_TYPE)) { // stylesheet (xdoc) VXdoc& vstylesheet=static_cast(*vxdoc); + xmlDoc& stylesheetdoc=vstylesheet.get_xmldoc(); - if(!vstylesheet.stylesheet){ - xmlDoc& stylesheetdoc=vstylesheet.get_xmldoc(); - - // compile xdoc stylesheet - vstylesheet.stylesheet=xsltParseStylesheetDoc(&stylesheetdoc); - if(xmlHaveGenericErrors()) - throw XmlException(0, r); - if(!vstylesheet.stylesheet) - throw Exception("xml", 0, "stylesheet failed to compile"); - } + // compile xdoc stylesheet + xsltStylesheet *stylesheet=xsltParseStylesheetDoc(&stylesheetdoc); + if(xmlHaveGenericErrors()) + throw XmlException(0, r); + if(!stylesheet) + throw Exception("xml", 0, "stylesheet failed to compile"); // transform! - result=&_transform(r, 0, vdoc, vstylesheet.stylesheet, transform_params); + result=&_transform(r, 0, vdoc, stylesheet, transform_params); } else { // stylesheet (file name) // extablish stylesheet connection const String& stylesheet_filespec=r.full_disk_path(params.as_string(0, "stylesheet must be file name (string) or DOM document (xdoc)")); - Stylesheet_connection_ptr connection=stylesheet_manager->get_connection(stylesheet_filespec); + Stylesheet_connection_ptr connection(stylesheet_manager->get_connection(stylesheet_filespec)); // load and compile file to stylesheet [or get cached if any] // transform!