diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2022-08-07 15:18:50 +0100 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2022-08-07 15:18:50 +0100 | 
| commit | 78927e4d32f299d5ca4e8e62475c7efe3ddc28fd (patch) | |
| tree | e30d9dd3b6abb392cd02df440f0572c68bbad4b2 | |
| parent | Enable all cppcheck checks and fixup config (diff) | |
| download | icespider-78927e4d32f299d5ca4e8e62475c7efe3ddc28fd.tar.bz2 icespider-78927e4d32f299d5ca4e8e62475c7efe3ddc28fd.tar.xz icespider-78927e4d32f299d5ca4e8e62475c7efe3ddc28fd.zip  | |
Smart ptrs in xslt outputicespider-0.8.0
| -rw-r--r-- | icespider/xslt/xsltStreamSerializer.cpp | 31 | ||||
| -rw-r--r-- | icespider/xslt/xsltStreamSerializer.h | 10 | 
2 files changed, 16 insertions, 25 deletions
diff --git a/icespider/xslt/xsltStreamSerializer.cpp b/icespider/xslt/xsltStreamSerializer.cpp index b5e6c30..302ec21 100644 --- a/icespider/xslt/xsltStreamSerializer.cpp +++ b/icespider/xslt/xsltStreamSerializer.cpp @@ -31,30 +31,23 @@ namespace IceSpider {  	}  	XsltStreamSerializer::IceSpiderFactory::IceSpiderFactory(const char * path) : -		stylesheetPath(path), stylesheetWriteTime(std::filesystem::file_time_type::min()), stylesheet(nullptr) +		stylesheetPath(path), stylesheetWriteTime(std::filesystem::file_time_type::min()), stylesheet(nullptr, nullptr)  	{  	} -	XsltStreamSerializer::IceSpiderFactory::~IceSpiderFactory() -	{ -		xsltFreeStylesheet(stylesheet); -	} -  	Slicer::SerializerPtr  	XsltStreamSerializer::IceSpiderFactory::create(std::ostream & strm) const  	{  		auto newMtime = std::filesystem::last_write_time(stylesheetPath);  		if (newMtime != stylesheetWriteTime) { -			if (stylesheet) { -				xsltFreeStylesheet(stylesheet); -			} -			stylesheet = xsltParseStylesheetFile(reinterpret_cast<const unsigned char *>(stylesheetPath.c_str())); +			stylesheet = {xsltParseStylesheetFile(reinterpret_cast<const unsigned char *>(stylesheetPath.c_str())), +					xsltFreeStylesheet};  			if (!stylesheet) {  				throw xmlpp::exception("Failed to load stylesheet");  			}  			stylesheetWriteTime = newMtime;  		} -		return std::make_shared<XsltStreamSerializer>(strm, stylesheet); +		return std::make_shared<XsltStreamSerializer>(strm, stylesheet.get());  	}  	XsltStreamSerializer::XsltStreamSerializer(std::ostream & os, xsltStylesheet * ss) : strm(os), stylesheet(ss) { } @@ -63,19 +56,21 @@ namespace IceSpider {  	XsltStreamSerializer::Serialize(Slicer::ModelPartForRootPtr mp)  	{  		Slicer::XmlDocumentSerializer::Serialize(mp); -		auto result = xsltApplyStylesheet(stylesheet, doc.cobj(), nullptr); +		const auto result = std::unique_ptr<xmlDoc, decltype(&xmlFreeDoc)> { +				xsltApplyStylesheet(stylesheet, doc.cobj(), nullptr), &xmlFreeDoc};  		if (!result) {  			throw xmlpp::exception("Failed to apply XSL transform");  		} -		xmlOutputBufferPtr buf = xmlOutputBufferCreateIO(xmlstrmwritecallback, xmlstrmclosecallback, &strm, nullptr); +		const auto buf = std::unique_ptr<xmlOutputBuffer, decltype(&xmlOutputBufferClose)> { +				xmlOutputBufferCreateIO(xmlstrmwritecallback, xmlstrmclosecallback, &strm, nullptr), +				&xmlOutputBufferClose};  		if (xmlStrcmp(stylesheet->method, reinterpret_cast<const unsigned char *>("html")) == 0) { -			htmlDocContentDumpFormatOutput(buf, result, reinterpret_cast<const char *>(stylesheet->encoding), 0); +			htmlDocContentDumpFormatOutput( +					buf.get(), result.get(), reinterpret_cast<const char *>(stylesheet->encoding), 0);  		}  		else { -			xmlNodeDumpOutput( -					buf, result, result->children, 0, 0, reinterpret_cast<const char *>(stylesheet->encoding)); +			xmlNodeDumpOutput(buf.get(), result.get(), result->children, 0, 0, +					reinterpret_cast<const char *>(stylesheet->encoding));  		} -		xmlOutputBufferClose(buf); -		xmlFreeDoc(result);  	}  } diff --git a/icespider/xslt/xsltStreamSerializer.h b/icespider/xslt/xsltStreamSerializer.h index 89e41a9..38868b4 100644 --- a/icespider/xslt/xsltStreamSerializer.h +++ b/icespider/xslt/xsltStreamSerializer.h @@ -5,13 +5,11 @@  #include <filesystem>  #include <iosfwd>  #include <libxslt/xsltInternals.h> +#include <memory>  #include <slicer/modelParts.h>  #include <slicer/serializer.h>  #include <slicer/xml/serializer.h>  #include <visibility.h> -namespace xmlpp { -	class Document; -}  namespace IceSpider {  	class DLL_PUBLIC XsltStreamSerializer : public Slicer::XmlDocumentSerializer { @@ -19,15 +17,13 @@ namespace IceSpider {  		class IceSpiderFactory : public Slicer::StreamSerializerFactory {  		public:  			explicit IceSpiderFactory(const char *); -			SPECIAL_MEMBERS_MOVE_RO(IceSpiderFactory); -			~IceSpiderFactory() override;  			Slicer::SerializerPtr create(std::ostream &) const override;  		private: -			const std::filesystem::path stylesheetPath; +			std::filesystem::path stylesheetPath;  			mutable std::filesystem::file_time_type stylesheetWriteTime; -			mutable xsltStylesheet * stylesheet; +			mutable std::unique_ptr<xsltStylesheet, decltype(&xsltFreeStylesheet)> stylesheet;  		};  		XsltStreamSerializer(std::ostream &, xsltStylesheet *);  | 
