summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2022-08-07 15:18:50 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2022-08-07 15:18:50 +0100
commit78927e4d32f299d5ca4e8e62475c7efe3ddc28fd (patch)
treee30d9dd3b6abb392cd02df440f0572c68bbad4b2
parentEnable all cppcheck checks and fixup config (diff)
downloadicespider-78927e4d32f299d5ca4e8e62475c7efe3ddc28fd.tar.bz2
icespider-78927e4d32f299d5ca4e8e62475c7efe3ddc28fd.tar.xz
icespider-78927e4d32f299d5ca4e8e62475c7efe3ddc28fd.zip
Smart ptrs in xslt outputicespider-0.8.0
-rw-r--r--icespider/xslt/xsltStreamSerializer.cpp31
-rw-r--r--icespider/xslt/xsltStreamSerializer.h10
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 *);