sw/qa/extras/ooxmlexport/data/tdf114882.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport11.cxx   |    5 +++
 sw/source/filter/ww8/docxattributeoutput.cxx |   40 ++++++++++-----------------
 sw/source/filter/ww8/docxattributeoutput.hxx |   26 ++++++++++-------
 sw/source/filter/ww8/docxexport.cxx          |   30 ++++++++------------
 5 files changed, 49 insertions(+), 52 deletions(-)

New commits:
commit 4f65853df16a599fe81576bbccbca6ea78488d54
Author: Mike Kaganski <mike.kagan...@collabora.com>
Date:   Sun Jan 7 23:53:02 2018 +0300

    tdf#114882: don't try to close SDT when processing inner objects
    
    Change-Id: Ib7e59e1a6c82d2d35a8466312a2571f76f2338b7
    Reviewed-on: https://gerrit.libreoffice.org/47546
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf114882.docx 
b/sw/qa/extras/ooxmlexport/data/tdf114882.docx
new file mode 100644
index 000000000000..8663f6b15557
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf114882.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
index 00c362340ce5..46e31f89b6c8 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
@@ -197,6 +197,11 @@ DECLARE_OOXMLEXPORT_TEST(testTdf113399, "tdf113399.doc")
     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nPaddingValue);
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf114882, "tdf114882.docx")
+{
+    // fastserializer must not fail assertion because of mismatching elements
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index 3f6b78ef6932..fbcc5e634f2d 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -494,10 +494,10 @@ void DocxAttributeOutput::EndParagraph( 
ww8::WW8TableNodeInfoInner::Pointer_t pT
                        otherwise the StartParagraph function will use the 
previous existing
                        table reference attributes since the variable is being 
shared.
                 */
-                DocxTableExportContext aDMLTableExportContext;
-                pushToTableExportContext(aDMLTableExportContext);
-                m_rExport.SdrExporter().writeDMLTextFrame(&aFrame, 
m_anchorId++);
-                popFromTableExportContext(aDMLTableExportContext);
+                {
+                    DocxTableExportContext aDMLTableExportContext(*this);
+                    m_rExport.SdrExporter().writeDMLTextFrame(&aFrame, 
m_anchorId++);
+                }
                 m_pSerializer->endElementNS(XML_mc, XML_Choice);
                 SetAlternateContentChoiceOpen( false );
 
@@ -508,10 +508,10 @@ void DocxAttributeOutput::EndParagraph( 
ww8::WW8TableNodeInfoInner::Pointer_t pT
                 //reset the tableReference.
 
                 m_pSerializer->startElementNS(XML_mc, XML_Fallback, FSEND);
-                DocxTableExportContext aVMLTableExportContext;
-                pushToTableExportContext(aVMLTableExportContext);
-                m_rExport.SdrExporter().writeVMLTextFrame(&aFrame);
-                popFromTableExportContext(aVMLTableExportContext);
+                {
+                    DocxTableExportContext aVMLTableExportContext(*this);
+                    m_rExport.SdrExporter().writeVMLTextFrame(&aFrame);
+                }
                 m_rExport.m_pTableInfo = pOldTableInfo;
 
                 m_pSerializer->endElementNS(XML_mc, XML_Fallback);
@@ -579,12 +579,10 @@ void DocxAttributeOutput::EndParagraph( 
ww8::WW8TableNodeInfoInner::Pointer_t pT
     {
         for ( const auto & pFrame : aFramePrTextbox )
         {
-            DocxTableExportContext aTableExportContext;
-            pushToTableExportContext(aTableExportContext);
+            DocxTableExportContext aTableExportContext(*this);
             m_pCurrentFrame = pFrame.get();
             m_rExport.SdrExporter().writeOnlyTextOfFrame(pFrame.get());
             m_pCurrentFrame = nullptr;
-            popFromTableExportContext(aTableExportContext);
         }
         aFramePrTextbox.clear();
     }
@@ -5310,7 +5308,6 @@ void DocxAttributeOutput::WritePostponedCustomShape()
     if (!m_pPostponedCustomShape)
         return;
 
-    bool bStartedParaSdt = m_bStartedParaSdt;
     for( const auto & rPostponedDrawing : *m_pPostponedCustomShape)
     {
         if ( IsAlternateContentChoiceOpen() )
@@ -5318,7 +5315,6 @@ void DocxAttributeOutput::WritePostponedCustomShape()
         else
             
m_rExport.SdrExporter().writeDMLAndVMLDrawing(rPostponedDrawing.object, 
*rPostponedDrawing.frame, m_anchorId++);
     }
-    m_bStartedParaSdt = bStartedParaSdt;
     m_pPostponedCustomShape.reset(nullptr);
 }
 
@@ -5331,7 +5327,6 @@ void DocxAttributeOutput::WritePostponedDMLDrawing()
     std::unique_ptr< std::vector<PostponedDrawing> > 
pPostponedDMLDrawings(m_pPostponedDMLDrawings.release());
     std::unique_ptr< std::vector<PostponedOLE> > 
pPostponedOLEs(m_pPostponedOLEs.release());
 
-    bool bStartedParaSdt = m_bStartedParaSdt;
     for( const auto & rPostponedDrawing : *pPostponedDMLDrawings )
     {
         // Avoid w:drawing within another w:drawing.
@@ -5340,7 +5335,6 @@ void DocxAttributeOutput::WritePostponedDMLDrawing()
         else
             
m_rExport.SdrExporter().writeDMLAndVMLDrawing(rPostponedDrawing.object, 
*rPostponedDrawing.frame, m_anchorId++);
     }
-    m_bStartedParaSdt = bStartedParaSdt;
 
     m_pPostponedOLEs = std::move(pPostponedOLEs);
 }
@@ -5393,7 +5387,6 @@ void DocxAttributeOutput::OutputFlyFrame_Impl( const 
ww8::Frame &rFrame, const P
                     {
                         if (!m_pPostponedDMLDrawings)
                         {
-                            bool bStartedParaSdt = m_bStartedParaSdt;
                             if ( IsAlternateContentChoiceOpen() )
                             {
                                 // Do not write w:drawing inside w:drawing. 
Instead Postpone the Inner Drawing.
@@ -5404,7 +5397,6 @@ void DocxAttributeOutput::OutputFlyFrame_Impl( const 
ww8::Frame &rFrame, const P
                             }
                             else
                                 m_rExport.SdrExporter().writeDMLAndVMLDrawing( 
pSdrObj, rFrame.GetFrameFormat(), m_anchorId++);
-                            m_bStartedParaSdt = bStartedParaSdt;
 
                             m_bPostponedProcessingFly = false ;
                         }
@@ -5579,6 +5571,9 @@ void 
DocxAttributeOutput::pushToTableExportContext(DocxTableExportContext& rCont
 
     rContext.m_nTableDepth = m_tableReference->m_nTableDepth;
     m_tableReference->m_nTableDepth = 0;
+
+    rContext.m_bStartedParaSdt = m_bStartedParaSdt;
+    m_bStartedParaSdt = false;
 }
 
 void DocxAttributeOutput::popFromTableExportContext(DocxTableExportContext 
const & rContext)
@@ -5586,32 +5581,27 @@ void 
DocxAttributeOutput::popFromTableExportContext(DocxTableExportContext const
     m_rExport.m_pTableInfo = rContext.m_pTableInfo;
     m_tableReference->m_bTableCellOpen = rContext.m_bTableCellOpen;
     m_tableReference->m_nTableDepth = rContext.m_nTableDepth;
+    m_bStartedParaSdt = rContext.m_bStartedParaSdt;
 }
 
 void DocxAttributeOutput::WriteTextBox(uno::Reference<drawing::XShape> xShape)
 {
-    DocxTableExportContext aTableExportContext;
-    pushToTableExportContext(aTableExportContext);
+    DocxTableExportContext aTableExportContext(*this);
 
     SwFrameFormat* pTextBox = SwTextBoxHelper::getOtherTextBoxFormat(xShape);
     const SwPosition* pAnchor = pTextBox->GetAnchor().GetContentAnchor();
     ww8::Frame aFrame(*pTextBox, *pAnchor);
     m_rExport.SdrExporter().writeDMLTextFrame(&aFrame, m_anchorId++, 
/*bTextBoxOnly=*/true);
-
-    popFromTableExportContext(aTableExportContext);
 }
 
 void DocxAttributeOutput::WriteVMLTextBox(uno::Reference<drawing::XShape> 
xShape)
 {
-    DocxTableExportContext aTableExportContext;
-    pushToTableExportContext(aTableExportContext);
+    DocxTableExportContext aTableExportContext(*this);
 
     SwFrameFormat* pTextBox = SwTextBoxHelper::getOtherTextBoxFormat(xShape);
     const SwPosition* pAnchor = pTextBox->GetAnchor().GetContentAnchor();
     ww8::Frame aFrame(*pTextBox, *pAnchor);
     m_rExport.SdrExporter().writeVMLTextFrame(&aFrame, /*bTextBoxOnly=*/true);
-
-    popFromTableExportContext(aTableExportContext);
 }
 
 oox::drawingml::DrawingML& DocxAttributeOutput::GetDrawingML()
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx 
b/sw/source/filter/ww8/docxattributeoutput.hxx
index 7e77ba90648e..237204592766 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -104,16 +104,7 @@ struct PageMargins
     PageMargins() : nPageMarginLeft(0), nPageMarginRight(0), 
nPageMarginTop(0), nPageMarginBottom(0) {}
 };
 
-/**
- * All the information that should be stashed away when we're in the middle of
- * of a table export and still have to do something else, e.g. export a shape.
- */
-struct DocxTableExportContext
-{
-    ww8::WW8TableInfo::Pointer_t m_pTableInfo;
-    bool m_bTableCellOpen;
-    sal_uInt32 m_nTableDepth;
-};
+struct DocxTableExportContext;
 
 /**
  * A structure that holds flags for the table export.
@@ -1029,6 +1020,21 @@ public:
     void popFromTableExportContext(DocxTableExportContext const & rContext);
 };
 
+/**
+* All the information that should be stashed away when we're in the middle of
+* of a table export and still have to do something else, e.g. export a shape.
+*/
+struct DocxTableExportContext
+{
+    DocxAttributeOutput& m_rOutput;
+    ww8::WW8TableInfo::Pointer_t m_pTableInfo;
+    bool m_bTableCellOpen;
+    bool m_bStartedParaSdt;
+    sal_uInt32 m_nTableDepth;
+    DocxTableExportContext(DocxAttributeOutput& rOutput) : m_rOutput(rOutput) 
{ m_rOutput.pushToTableExportContext(*this); }
+    ~DocxTableExportContext() { m_rOutput.popFromTableExportContext(*this); }
+};
+
 #endif // INCLUDED_SW_SOURCE_FILTER_WW8_DOCXATTRIBUTEOUTPUT_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/docxexport.cxx 
b/sw/source/filter/ww8/docxexport.cxx
index 2a76ae0cfc40..7a851397d5d4 100644
--- a/sw/source/filter/ww8/docxexport.cxx
+++ b/sw/source/filter/ww8/docxexport.cxx
@@ -808,29 +808,25 @@ void DocxExport::WriteHeaderFooter( const SwFormat* 
pFormat, bool bHeader, const
     m_pVMLExport->SetFS( pFS );
     m_pSdrExport->setSerializer(pFS);
     SetFS( pFS );
-    bool bStartedParaSdt = m_pAttrOutput->IsStartedParaSdt();
-    m_pAttrOutput->SetStartedParaSdt(false);
-
-    DocxTableExportContext aTableExportContext;
-    m_pAttrOutput->pushToTableExportContext(aTableExportContext);
-    //When the stream changes the cache which is maintained for the graphics 
in case of alternate content is not cleared.
-    //So clearing the alternate content graphic cache.
-    m_pAttrOutput->PushRelIdCache();
-    // do the work
-    if( pFormat == nullptr )
-        AttrOutput().EmptyParagraph();
-    else
-        WriteHeaderFooterText( *pFormat, bHeader );
-    m_pAttrOutput->PopRelIdCache();
-    m_pAttrOutput->popFromTableExportContext(aTableExportContext);
-    m_pAttrOutput->EndParaSdtBlock();
+    {
+        DocxTableExportContext aTableExportContext(*m_pAttrOutput);
+        //When the stream changes the cache which is maintained for the 
graphics in case of alternate content is not cleared.
+        //So clearing the alternate content graphic cache.
+        m_pAttrOutput->PushRelIdCache();
+        // do the work
+        if (pFormat == nullptr)
+            AttrOutput().EmptyParagraph();
+        else
+            WriteHeaderFooterText(*pFormat, bHeader);
+        m_pAttrOutput->PopRelIdCache();
+        m_pAttrOutput->EndParaSdtBlock();
+    }
 
     // switch the serializer back
     m_pAttrOutput->SetSerializer( m_pDocumentFS );
     m_pVMLExport->SetFS( m_pDocumentFS );
     m_pSdrExport->setSerializer(m_pDocumentFS);
     SetFS( m_pDocumentFS );
-    m_pAttrOutput->SetStartedParaSdt(bStartedParaSdt);
 
     // close the tag
     sal_Int32 nReference;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to