Kaydet (Commit) 3dc54847 authored tarafından Michael Stahl's avatar Michael Stahl

writerfilter: salvage a field parameter parsing train wreck

Field parameters get horribly maimed by lcl_ExtractParameter which
clearly has never worked in its 7 years of existence (and looking at the
inanity at the call sites makes one wonder what the author was smoking).

The format is actually quite annoying, since spaces between parameters
are optional.

The old RTF filter was at least able to parse "PAGEREF bookmark" fields,
so this fixes such regressions (related: rhbz#1065629).

Change-Id: I9b2e32c3c7264be0fc1077cb8fb3f1bc5c1955bb
üst 74b3f4f0
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
# 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/.
#
$(eval $(call gb_CppunitTest_CppunitTest,writerfilter_misc))
$(eval $(call gb_CppunitTest_use_api,writerfilter_misc,\
offapi \
udkapi \
))
$(eval $(call gb_CppunitTest_use_external,writerfilter_misc,boost_headers))
$(eval $(call gb_CppunitTest_use_libraries,writerfilter_misc, \
writerfilter \
cppu \
sal \
$(gb_UWINAPI) \
))
$(eval $(call gb_CppunitTest_set_include,writerfilter_misc, \
$$(INCLUDE) \
-I$(SRCDIR)/writerfilter/inc \
))
$(eval $(call gb_CppunitTest_add_exception_objects,writerfilter_misc, \
writerfilter/qa/cppunittests/misc/misc \
))
# vim: set noet sw=4 ts=4:
......@@ -16,6 +16,7 @@ $(eval $(call gb_Module_add_targets,writerfilter,\
$(eval $(call gb_Module_add_slowcheck_targets,writerfilter,\
CppunitTest_writerfilter_rtftok \
CppunitTest_writerfilter_misc \
))
# vim: set noet sw=4 ts=4:
/* -*- 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 <limits>
#include <vector>
#include <boost/tuple/tuple.hpp>
#include <cppunit/TestAssert.h>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/plugin/TestPlugIn.h>
#include <sal/types.h>
#include <rtl/ustring.hxx>
#include <WriterFilterDllApi.hxx>
using namespace std;
namespace writerfilter { namespace dmapper {
SAL_DLLPUBLIC_IMPORT // export just for test
boost::tuple<OUString, vector<OUString>, vector<OUString> >
lcl_SplitFieldCommand(const OUString& rCommand);
} }
namespace {
class WriterfilterMiscTest
: public ::CppUnit::TestFixture
{
public:
virtual void setUp();
virtual void tearDown();
void testFieldParameters();
CPPUNIT_TEST_SUITE(WriterfilterMiscTest);
CPPUNIT_TEST(testFieldParameters);
CPPUNIT_TEST_SUITE_END();
};
void WriterfilterMiscTest::setUp()
{
}
void WriterfilterMiscTest::tearDown()
{
}
void WriterfilterMiscTest::testFieldParameters()
{
using writerfilter::dmapper::lcl_SplitFieldCommand;
boost::tuple<OUString, vector<OUString>, vector<OUString> > result;
result = lcl_SplitFieldCommand("PAGEREF last_page");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand(" PAGEREF last_page ");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
result = lcl_SplitFieldCommand("pageref last_page");
CPPUNIT_ASSERT(boost::get<2>(result).empty());
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand("pageref \"last_page\"");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand("\"PAGEREF\" \"last_page\" \"\" ");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand("\"PAGEREF\"\"last_page\" ");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand("PAGEREF\"last_page\" ");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand("\"PAGEREF\"last_page \"\"");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand("\"PAGEREF\"last_page \"\"");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand("pageref \"last\\\\pa\\\"ge\"");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last\\pa\"ge"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT(boost::get<2>(result).empty());
result = lcl_SplitFieldCommand("PAGEREF\"last_page\"\\*");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<2>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("\\*"), boost::get<2>(result)[0]);
result = lcl_SplitFieldCommand("PAGEREF last_page \\b foobar ");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<2>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("\\B"), boost::get<2>(result)[0]);
CPPUNIT_ASSERT_EQUAL(OUString("foobar"), boost::get<2>(result)[1]);
result = lcl_SplitFieldCommand("PAGEREF\\bfoobar\\A\"\"");
CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
CPPUNIT_ASSERT(boost::get<1>(result).empty());
CPPUNIT_ASSERT_EQUAL(size_t(4), boost::get<2>(result).size());
CPPUNIT_ASSERT_EQUAL(OUString("\\B"), boost::get<2>(result)[0]);
CPPUNIT_ASSERT_EQUAL(OUString("foobar"), boost::get<2>(result)[1]);
CPPUNIT_ASSERT_EQUAL(OUString("\\A"), boost::get<2>(result)[2]);
CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<2>(result)[3]);
}
CPPUNIT_TEST_SUITE_REGISTRATION(WriterfilterMiscTest);
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -569,13 +569,14 @@ public:
uno::Reference< uno::XInterface > & xFieldInterface,
uno::Reference< beans::XPropertySet > xFieldProperties);
void handleAuthor
(FieldContextPtr pContext,
(OUString const& rFirstParam,
PropertyNameSupplier& rPropNameSupplier,
uno::Reference< uno::XInterface > & xFieldInterface,
uno::Reference< beans::XPropertySet > xFieldProperties,
FieldId eFieldId);
void handleDocProperty
(FieldContextPtr pContext,
OUString const& rFirstParam,
PropertyNameSupplier& rPropNameSupplier,
uno::Reference< uno::XInterface > & xFieldInterface,
uno::Reference< beans::XPropertySet > xFieldProperties);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment