From 78927e4d32f299d5ca4e8e62475c7efe3ddc28fd Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 7 Aug 2022 15:18:50 +0100 Subject: Smart ptrs in xslt output --- icespider/xslt/xsltStreamSerializer.cpp | 31 +++++++++++++------------------ 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(stylesheetPath.c_str())); + stylesheet = {xsltParseStylesheetFile(reinterpret_cast(stylesheetPath.c_str())), + xsltFreeStylesheet}; if (!stylesheet) { throw xmlpp::exception("Failed to load stylesheet"); } stylesheetWriteTime = newMtime; } - return std::make_shared(strm, stylesheet); + return std::make_shared(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 { + 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 { + xmlOutputBufferCreateIO(xmlstrmwritecallback, xmlstrmclosecallback, &strm, nullptr), + &xmlOutputBufferClose}; if (xmlStrcmp(stylesheet->method, reinterpret_cast("html")) == 0) { - htmlDocContentDumpFormatOutput(buf, result, reinterpret_cast(stylesheet->encoding), 0); + htmlDocContentDumpFormatOutput( + buf.get(), result.get(), reinterpret_cast(stylesheet->encoding), 0); } else { - xmlNodeDumpOutput( - buf, result, result->children, 0, 0, reinterpret_cast(stylesheet->encoding)); + xmlNodeDumpOutput(buf.get(), result.get(), result->children, 0, 0, + reinterpret_cast(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 #include #include +#include #include #include #include #include -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 stylesheet; }; XsltStreamSerializer(std::ostream &, xsltStylesheet *); -- cgit v1.2.3