From 9ef167c38495a67639366357833041b33be3f978 Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Tue, 15 Jun 2021 13:35:57 +0900 Subject: tools: handle special chars correctly in XmlHandler + test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- tools/CppunitTest_tools_test.mk | 1 + tools/qa/cppunit/test_xmlwriter.cxx | 71 +++++++++++++++++++++++++++++++++++++ tools/source/xml/XmlWriter.cxx | 5 +-- 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 tools/qa/cppunit/test_xmlwriter.cxx (limited to 'tools') 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 +#include +#include +#include +#include + +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(aMemoryStream.GetData()), aMemoryStream.GetSize()); + CPPUNIT_ASSERT_EQUAL(OString(""), 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(aMemoryStream.GetData()), aMemoryStream.GetSize()); + CPPUNIT_ASSERT_EQUAL(OString("<>"), 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; -- cgit