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 *); |