summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2021-06-15 13:35:57 +0900
committerTomaž Vajngerl <quikee@gmail.com>2021-06-17 15:03:29 +0200
commit9ef167c38495a67639366357833041b33be3f978 (patch)
tree77b910f907c607cd9ddbb9bac8134a4f97d96259 /tools
parent1da7d73eeaaff43e4f3e8a61ad77fcec3c7aaed8 (diff)
tools: handle special chars correctly in XmlHandler + test
Add the char encoding handler when calling xmlOutputBufferCreateIO so that special chars are handled correctly. Previously we just set nullptr. Change-Id: I7ef44130869625cc4662bf168550a3f987390287 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117355 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/CppunitTest_tools_test.mk1
-rw-r--r--tools/qa/cppunit/test_xmlwriter.cxx71
-rw-r--r--tools/source/xml/XmlWriter.cxx5
3 files changed, 75 insertions, 2 deletions
diff --git a/tools/CppunitTest_tools_test.mk b/tools/CppunitTest_tools_test.mk
index 96fb96b08117..096b3ddb1835 100644
--- a/tools/CppunitTest_tools_test.mk
+++ b/tools/CppunitTest_tools_test.mk
@@ -31,6 +31,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,tools_test, \
tools/qa/cppunit/test_100mm2twips \
tools/qa/cppunit/test_fround \
tools/qa/cppunit/test_xmlwalker \
+ tools/qa/cppunit/test_xmlwriter \
tools/qa/cppunit/test_GenericTypeSerializer \
tools/qa/cppunit/test_cpuid \
tools/qa/cppunit/test_cpu_runtime_detection_AVX2 \
diff --git a/tools/qa/cppunit/test_xmlwriter.cxx b/tools/qa/cppunit/test_xmlwriter.cxx
new file mode 100644
index 000000000000..1cd207a4afe5
--- /dev/null
+++ b/tools/qa/cppunit/test_xmlwriter.cxx
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <test/bootstrapfixture.hxx>
+#include <rtl/ustring.hxx>
+#include <tools/stream.hxx>
+#include <tools/XmlWriter.hxx>
+
+namespace
+{
+class XmlWriterTest : public test::BootstrapFixture
+{
+public:
+ XmlWriterTest()
+ : BootstrapFixture(true, false)
+ {
+ }
+
+ virtual void setUp() override {}
+
+ void testSimpleRoot();
+ void testSpecialChars();
+
+ CPPUNIT_TEST_SUITE(XmlWriterTest);
+ CPPUNIT_TEST(testSimpleRoot);
+ CPPUNIT_TEST(testSpecialChars);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void XmlWriterTest::testSimpleRoot()
+{
+ SvMemoryStream aMemoryStream;
+
+ tools::XmlWriter aWriter(&aMemoryStream);
+ aWriter.startDocument(0, false);
+ aWriter.startElement("test");
+ aWriter.endElement();
+ aWriter.endDocument();
+
+ aMemoryStream.Seek(0);
+ OString aString(static_cast<const char*>(aMemoryStream.GetData()), aMemoryStream.GetSize());
+ CPPUNIT_ASSERT_EQUAL(OString("<test/>"), aString);
+}
+
+void XmlWriterTest::testSpecialChars()
+{
+ SvMemoryStream aMemoryStream;
+
+ tools::XmlWriter aWriter(&aMemoryStream);
+ aWriter.startDocument(0, false);
+ aWriter.startElement("test");
+ aWriter.content("<>");
+ aWriter.endElement();
+ aWriter.endDocument();
+
+ aMemoryStream.Seek(0);
+ OString aString(static_cast<const char*>(aMemoryStream.GetData()), aMemoryStream.GetSize());
+ CPPUNIT_ASSERT_EQUAL(OString("<test>&lt;&gt;</test>"), aString);
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(XmlWriterTest);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/source/xml/XmlWriter.cxx b/tools/source/xml/XmlWriter.cxx
index 93c4f0cdea96..726b63966045 100644
--- a/tools/source/xml/XmlWriter.cxx
+++ b/tools/source/xml/XmlWriter.cxx
@@ -59,8 +59,9 @@ XmlWriter::~XmlWriter()
bool XmlWriter::startDocument(sal_Int32 nIndent, bool bWriteXmlHeader)
{
mpImpl->mbWriteXmlHeader = bWriteXmlHeader;
- xmlOutputBufferPtr xmlOutBuffer
- = xmlOutputBufferCreateIO(funcWriteCallback, funcCloseCallback, mpImpl->mpStream, nullptr);
+ xmlCharEncodingHandlerPtr pEncodingHandler = xmlGetCharEncodingHandler(XML_CHAR_ENCODING_UTF8);
+ xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO(funcWriteCallback, funcCloseCallback,
+ mpImpl->mpStream, pEncodingHandler);
mpImpl->mpWriter = xmlNewTextWriter(xmlOutBuffer);
if (mpImpl->mpWriter == nullptr)
return false;