--- parser3/src/classes/xdoc.C 2013/08/27 11:27:45 1.178 +++ parser3/src/classes/xdoc.C 2016/04/06 16:08:19 1.185 @@ -1,7 +1,7 @@ /** @file Parser: @b xdoc parser class. - Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2015 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.178 2013/08/27 11:27:45 moko Exp $"; +volatile const char * IDENT_XDOC_C="$Id: xdoc.C,v 1.185 2016/04/06 16:08:19 moko Exp $"; // defines @@ -47,7 +47,7 @@ public: // global variable -DECLARE_CLASS_VAR(xdoc, new MXdoc, 0); +DECLARE_CLASS_VAR(xdoc, new MXdoc); // helper classes @@ -386,7 +386,7 @@ static void _create(Request& r, MethodPa //printf("document=0x%p\n", document); if(!xmldoc || xmlHaveGenericErrors()) - throw XmlException(0); + throw XmlException(0, r); // must be last action in if, see after if} } else { // [localName] @@ -410,11 +410,11 @@ static void _create(Request& r, MethodPa #endif xmldoc=xmlNewDoc(0); if(!xmldoc || xmlHaveGenericErrors()) - throw XmlException(0); + throw XmlException(0, r); xmlNode* node=xmlNewChild((xmlNode*)xmldoc, NULL, localName, NULL); if(!node || xmlHaveGenericErrors()) - throw XmlException(0); + throw XmlException(0, r); set_encoding=true; // must be last action in if, see after if} @@ -422,7 +422,7 @@ static void _create(Request& r, MethodPa VFile* vfile=param.as_vfile(String::L_AS_IS); xmldoc=xmlParseMemory(vfile->value_ptr(), vfile->value_size()); if(!xmldoc || xmlHaveGenericErrors()) - throw XmlException(0); + throw XmlException(0, r); } } // must be first action after if} @@ -459,7 +459,7 @@ static void _load(Request& r, MethodPara /// @todo!! add SAFE MODE!! xmlDoc* xmldoc=xmlParseFile(uri_cstr); if(!xmldoc || xmlHaveGenericErrors()) - throw XmlException(uri); + throw XmlException(uri, r); // must be first action after if} // replace any previous parsed source @@ -517,11 +517,20 @@ String::C xdoc2buf(Request& r, VXdoc& vd stylesheet->encoding=BAD_CAST xmlMemStrdup(header_encoding); if(xsltSaveResultTo(outputBuffer.get(), &xmldoc, stylesheet.get())<0 || xmlHaveGenericErrors()) - throw XmlException(0); + throw XmlException(0, r); // write out result char *gnome_str; size_t gnome_length; +#ifdef LIBXML2_NEW_BUFFER + if(outputBuffer->conv) { + gnome_length=xmlBufUse(outputBuffer->conv); + gnome_str=(char *)xmlBufContent(outputBuffer->conv); + } else { + gnome_length=xmlOutputBufferGetSize(&(*outputBuffer)); + gnome_str=(char *)xmlOutputBufferGetContent(&(*outputBuffer)); + } +#else if(outputBuffer->conv) { gnome_length=outputBuffer->conv->use; gnome_str=(char *)outputBuffer->conv->content; @@ -529,6 +538,7 @@ String::C xdoc2buf(Request& r, VXdoc& vd gnome_length=outputBuffer->buffer->use; gnome_str=(char *)outputBuffer->buffer->content; } +#endif if(file_spec){ file_write(r.charsets, @@ -554,12 +564,8 @@ static void _file(Request& r, MethodPara VFile& vfile=*new VFile; VHash& vhcontent_type=*new VHash; - vhcontent_type.hash().put( - value_name, - new VString(*oo.mediaType)); - vhcontent_type.hash().put( - String::Body("charset"), - new VString(*oo.encoding)); + vhcontent_type.hash().put(value_name, new VString(*oo.mediaType)); + vhcontent_type.hash().put("charset", new VString(*oo.encoding)); vfile.set_binary(false/*not tainted*/, buf.str?buf.str:""/*to distinguish from stat-ed file*/, buf.length, oo.filename, &vhcontent_type); @@ -626,7 +632,7 @@ static VXdoc& _transform(Request& r, con 0/*FILE *profile*/, transformContext.get()); if(!transformed || xmlHaveGenericErrors()) - throw XmlException(stylesheet_source); + throw XmlException(stylesheet_source, r); //gdome_xml_doc_mkref dislikes XML_HTML_DOCUMENT_NODE type, fixing transformed->type=XML_DOCUMENT_NODE; @@ -668,7 +674,7 @@ static void _transform(Request& r, Metho const xmlChar** transform_params=0; if(params.count()>1) if(HashStringValue* hash=params.as_hash(1, "transform options")) { - transform_params=new(UseGC) const xmlChar*[hash->count()*2+1]; + transform_params=new const xmlChar*[hash->count()*2+1]; Add_xslt_param_info info={ &r, &transform_strings, @@ -684,7 +690,7 @@ static void _transform(Request& r, Metho // compile xdoc stylesheet xsltStylesheet_auto_ptr stylesheet_ptr(xsltParseStylesheetDoc(&stylesheetdoc)); if(xmlHaveGenericErrors()) - throw XmlException(0); + throw XmlException(0, r); if(!stylesheet_ptr.get()) throw Exception("xml", 0, @@ -716,7 +722,9 @@ static void _transform(Request& r, Metho // constructor /// @test how to create empty type html? -MXdoc::MXdoc(): MXnode(XDOC_CLASS_NAME, xnode_class) { +MXdoc::MXdoc(): MXnode(XDOC_CLASS_NAME) { + set_base(xnode_class); + /// DOM1 // Element createElement(in DOMString tagName) raises(DOMException); @@ -786,6 +794,6 @@ MXdoc::MXdoc(): MXnode(XDOC_CLASS_NAME, // global variable -DECLARE_CLASS_VAR(xdoc, 0, 0); // fictive +DECLARE_CLASS_VAR(xdoc, 0); // fictive #endif