summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-03-12 22:52:30 +0100
committerMichael Stahl <mstahl@redhat.com>2014-03-12 23:55:38 +0100
commitb749a589bb2e111546fc9e4b4dd32791e424a37b (patch)
tree62bf87034e5b2a8f94b0f9f48c014571ed5cb2d9 /writerfilter
parentb234d816a6f4232f6aa4a16e2605fb0a0856dca4 (diff)
writerfilter: assert that substream doesn't leave extra contexts
... on the stacks, to prevent problems like rhbz#988516. Change-Id: I76392586e5276e4b73941064875c0224834684b5
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx54
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx2
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);
};