diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2019-09-20 19:42:16 +0200 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2019-09-23 13:35:19 +0200 |
commit | 1db6fb0f831e92ac3902af9c58e33f49ede5532b (patch) | |
tree | db5678d6abb195d8d8d234195df07bad980ad8c1 | |
parent | adceab34ca45128d4848edcc58affa220be87686 (diff) |
writerfilter: fix assert importing fdo77404-1.docx
The problem is that StyleSheetTable::ApplyStyleSheets() inserts a
SwNumRule with name "WW8Num1" and then ListDef::CreateNumberingRule()
also wants to insert a SwNumRule with name "WW8Num1" but gets an
exception instead, leaving ListDef::m_xNumRules null, and then
finishParagraph thinks it's numbered but there's no ListId.
Try to avoid collisions of the generated names in
ListDef::GetStyleName(), by checking what styles actually exist in the
document (which works better in the Insert->File case), and
on the assumption that the initialising call always happens before
the using calls.
(regression from 7992bd73a2307edce96a145e954f8e4c3ab9f57d)
Change-Id: I91c98aa897c12778fb214e9690da0bae99550b93
Reviewed-on: https://gerrit.libreoffice.org/79312
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 16 | ||||
-rw-r--r-- | writerfilter/source/dmapper/NumberingManager.cxx | 25 | ||||
-rw-r--r-- | writerfilter/source/dmapper/NumberingManager.hxx | 7 |
3 files changed, 38 insertions, 10 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 192b5ab70130..81acdf59ebce 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -1237,9 +1237,10 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con { bool bNumberingFromBaseStyle = false; sal_Int32 nListId = pEntry ? lcl_getListId(pEntry, GetStyleSheetTable(), bNumberingFromBaseStyle) : -1; - if (nListId >= 0 && !pParaContext->isSet(PROP_NUMBERING_STYLE_NAME)) + auto const pList(GetListTable()->GetList(nListId)); + if (pList && nListId >= 0 && !pParaContext->isSet(PROP_NUMBERING_STYLE_NAME)) { - pParaContext->Insert( PROP_NUMBERING_STYLE_NAME, uno::makeAny( ListDef::GetStyleName( nListId ) ), false); + pParaContext->Insert( PROP_NUMBERING_STYLE_NAME, uno::makeAny( pList->GetStyleName(nListId) ), false); isNumberingViaStyle = true; // Indent properties from the paragraph style have priority @@ -6075,7 +6076,12 @@ uno::Reference<container::XIndexAccess> DomainMapper_Impl::GetCurrentNumberingRu *pListLevel = pStyleSheetProperties->GetListLevel(); // So we are in a paragraph style and it has numbering. Look up the relevant numbering rules. - OUString aListName = ListDef::GetStyleName(nListId); + auto const pList(GetListTable()->GetList(nListId)); + OUString aListName; + if (pList) + { + aListName = pList->GetStyleName(nListId); + } uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier(GetTextDocument(), uno::UNO_QUERY_THROW); uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies(); uno::Reference<container::XNameAccess> xNumberingStyles; @@ -6190,7 +6196,9 @@ sal_Int32 DomainMapper_Impl::getNumberingProperty(const sal_Int32 nListId, sal_I if (nNumberingLevel < 0) // It seems it's valid to omit numbering level, and in that case it means zero. nNumberingLevel = 0; - const OUString aListName = ListDef::GetStyleName(nListId); + auto const pList(GetListTable()->GetList(nListId)); + assert(pList); + const OUString aListName = pList->GetStyleName(nListId); const uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier(GetTextDocument(), uno::UNO_QUERY_THROW); const uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies(); uno::Reference<container::XNameAccess> xNumberingStyles; diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx index 1b8a8b283f99..8f7d05e5f4d0 100644 --- a/writerfilter/source/dmapper/NumberingManager.cxx +++ b/writerfilter/source/dmapper/NumberingManager.cxx @@ -447,12 +447,27 @@ ListDef::~ListDef( ) { } -OUString ListDef::GetStyleName( sal_Int32 nId ) +OUString ListDef::GetStyleName(sal_Int32 const nId, + uno::Reference<container::XNameContainer> const& xStyles) { - OUString sStyleName( "WWNum" ); - sStyleName += OUString::number( nId ); + if (xStyles.is()) + { + OUString sStyleName( "WWNum" ); + sStyleName += OUString::number( nId ); + + while (xStyles.is() && xStyles->hasByName(sStyleName)) // unique + { + sStyleName += "a"; + } + + m_StyleName = sStyleName; + } + else + { +// fails in rtftok test assert(!m_StyleName.isEmpty()); // must be inited first + } - return sStyleName; + return m_StyleName; } uno::Sequence<uno::Sequence<beans::PropertyValue>> ListDef::GetMergedPropertyValues() @@ -519,7 +534,7 @@ void ListDef::CreateNumberingRules( DomainMapper& rDMapper, xFactory->createInstance("com.sun.star.style.NumberingStyle"), uno::UNO_QUERY_THROW ); - OUString sStyleName = GetStyleName( GetId( ) ); + OUString sStyleName = GetStyleName(GetId(), xStyles); xStyles->insertByName( sStyleName, makeAny( xStyle ) ); diff --git a/writerfilter/source/dmapper/NumberingManager.hxx b/writerfilter/source/dmapper/NumberingManager.hxx index c484b7bd9803..0ba356f64f3c 100644 --- a/writerfilter/source/dmapper/NumberingManager.hxx +++ b/writerfilter/source/dmapper/NumberingManager.hxx @@ -170,6 +170,9 @@ private: // Cache for the UNO numbering rules css::uno::Reference< css::container::XIndexReplace > m_xNumRules; + /// mapped list style name + OUString m_StyleName; + public: typedef tools::SvRef< ListDef > Pointer; @@ -181,7 +184,9 @@ public: const AbstractListDef::Pointer& GetAbstractDefinition( ) { return m_pAbstractDef; }; // Mapping functions - static OUString GetStyleName( sal_Int32 nId ); + OUString GetStyleName(sal_Int32 nId, + css::uno::Reference<css::container::XNameContainer> const& xStyles + = css::uno::Reference<css::container::XNameContainer>()); css::uno::Sequence< css::uno::Sequence<css::beans::PropertyValue> > GetMergedPropertyValues(); |