diff options
author | Michael Stahl <mstahl@redhat.com> | 2014-03-12 22:52:30 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2014-03-12 23:55:38 +0100 |
commit | b749a589bb2e111546fc9e4b4dd32791e424a37b (patch) | |
tree | 62bf87034e5b2a8f94b0f9f48c014571ed5cb2d9 | |
parent | b234d816a6f4232f6aa4a16e2605fb0a0856dca4 (diff) |
writerfilter: assert that substream doesn't leave extra contexts
... on the stacks, to prevent problems like rhbz#988516.
Change-Id: I76392586e5276e4b73941064875c0224834684b5
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 54 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 2 |
2 files changed, 39 insertions, 17 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index c5f761f62363..60208a38aaba 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -2763,11 +2763,25 @@ void DomainMapper::lcl_table(Id name, writerfilter::Reference<Table>::Pointer_t void DomainMapper::lcl_substream(Id rName, ::writerfilter::Reference<Stream>::Pointer_t ref) { - m_pImpl->appendTableManager( ); + m_pImpl->substream(rName, ref); +} + +void DomainMapper_Impl::substream(Id rName, + ::writerfilter::Reference<Stream>::Pointer_t const& ref) +{ +#ifndef NDEBUG + size_t contextSize(m_aContextStack.size()); + size_t propSize[NUMBER_OF_CONTEXTS]; + for (int i = 0; i < NUMBER_OF_CONTEXTS; ++i) { + propSize[i] = m_aPropertyStacks[i].size(); + } +#endif + + appendTableManager(); // Appending a TableManager resets its TableHandler, so we need to append // that as well, or tables won't be imported properly in headers/footers. - m_pImpl->appendTableHandler( ); - m_pImpl->getTableManager().startLevel(); + appendTableHandler(); + getTableManager().startLevel(); //import of page header/footer @@ -2775,37 +2789,37 @@ void DomainMapper::lcl_substream(Id rName, ::writerfilter::Reference<Stream>::Po { case NS_ooxml::LN_headerl: - m_pImpl->PushPageHeader(SectionPropertyMap::PAGE_LEFT); + PushPageHeader(SectionPropertyMap::PAGE_LEFT); break; case NS_ooxml::LN_headerr: - m_pImpl->PushPageHeader(SectionPropertyMap::PAGE_RIGHT); + PushPageHeader(SectionPropertyMap::PAGE_RIGHT); break; case NS_ooxml::LN_headerf: - m_pImpl->PushPageHeader(SectionPropertyMap::PAGE_FIRST); + PushPageHeader(SectionPropertyMap::PAGE_FIRST); break; case NS_ooxml::LN_footerl: - m_pImpl->PushPageFooter(SectionPropertyMap::PAGE_LEFT); + PushPageFooter(SectionPropertyMap::PAGE_LEFT); break; case NS_ooxml::LN_footerr: - m_pImpl->PushPageFooter(SectionPropertyMap::PAGE_RIGHT); + PushPageFooter(SectionPropertyMap::PAGE_RIGHT); break; case NS_ooxml::LN_footerf: - m_pImpl->PushPageFooter(SectionPropertyMap::PAGE_FIRST); + PushPageFooter(SectionPropertyMap::PAGE_FIRST); break; case NS_ooxml::LN_footnote: case NS_ooxml::LN_endnote: - m_pImpl->PushFootOrEndnote( NS_ooxml::LN_footnote == rName ); + PushFootOrEndnote( NS_ooxml::LN_footnote == rName ); break; case NS_ooxml::LN_annotation : - m_pImpl->PushAnnotation(); + PushAnnotation(); break; } - ref->resolve(*this); + ref->resolve(m_rDMapper); switch( rName ) { case NS_ooxml::LN_headerl: @@ -2814,19 +2828,25 @@ void DomainMapper::lcl_substream(Id rName, ::writerfilter::Reference<Stream>::Po case NS_ooxml::LN_footerl: case NS_ooxml::LN_footerr: case NS_ooxml::LN_footerf: - m_pImpl->PopPageHeaderFooter(); + PopPageHeaderFooter(); break; case NS_ooxml::LN_footnote: case NS_ooxml::LN_endnote: - m_pImpl->PopFootOrEndnote(); + PopFootOrEndnote(); break; case NS_ooxml::LN_annotation : - m_pImpl->PopAnnotation(); + PopAnnotation(); break; } - m_pImpl->getTableManager().endLevel(); - m_pImpl->popTableManager( ); + getTableManager().endLevel(); + popTableManager(); + + // check that stacks are the same as before substream + assert(m_aContextStack.size() == contextSize); + for (int i = 0; i < NUMBER_OF_CONTEXTS; ++i) { + assert(m_aPropertyStacks[i].size() == propSize[i]); + } } void DomainMapper::lcl_info(const string & /*info_*/) diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 2b54bb879bc2..6b7ca583c9f6 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -771,6 +771,8 @@ public: bool isInIndexContext() { return m_bStartIndex;} bool isInBibliographyContext() { return m_bStartBibliography;} + void substream(Id rName, ::writerfilter::Reference<Stream>::Pointer_t const& ref); + private: void PushPageHeaderFooter(bool bHeader, SectionPropertyMap::PageType eType); }; |