fdo#73219 File corruption: Table in header

Description:
File corrupt due to the end tag </w:tc> </w:tr> </w:tbl> are missing after roundtrip in header4.xml

Conflicts:
	sw/qa/extras/ooxmlexport/ooxmlexport.cxx
Reviewed on:
	https://gerrit.libreoffice.org/8378

Change-Id: Ib05a50b3b3beca6c744b93360f9341ddcaa1a22a
diff --git a/sw/qa/extras/ooxmlexport/data/tableCurrupt.docx b/sw/qa/extras/ooxmlexport/data/tableCurrupt.docx
new file mode 100644
index 0000000..1deda7d
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tableCurrupt.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index 094519c..4c1ba4f 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -2962,6 +2962,15 @@ DECLARE_OOXMLEXPORT_TEST(testFdo74792, "fdo74792.docx")
    CPPUNIT_ASSERT( xInputStream.is() );
}

DECLARE_OOXMLEXPORT_TEST(testTableCurruption, "tableCurrupt.docx")
{
    xmlDocPtr pXmlDoc = parseExport("word/header4.xml");
    if (!pXmlDoc)
        return;
    CPPUNIT_ASSERT(pXmlDoc) ;
    assertXPath(pXmlDoc, "/w:hdr/w:tbl[1]/w:tr[1]/w:tc[1]",1);
}

#endif

CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index d7d9dea..2fe102c 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -251,9 +251,18 @@ void DocxAttributeOutput::StartParagraph( ww8::WW8TableNodeInfo::Pointer_t pText
                {
                    ww8::WW8TableNodeInfoInner::Pointer_t pInner( pTextNodeInfo->getInnerForDepth( nDepth ) );

                    if (m_tableReference->m_pOldTablepInner && m_tableReference->m_pOldTablepInner->getTable() == pInner->getTable() && nCurrentDepth > 1 &&  nDepth != 1)
                    {
                       m_tableReference->m_pOldTablepInner = pInner;
                       break;
                    }
                    else
                    {
                    StartTable( pInner );
                    StartTableRow( pInner );
                    StartTableCell( pInner );
                    m_tableReference->m_pOldTablepInner = pInner;
                    }
                }

                m_tableReference->m_nTableDepth = nCurrentDepth;
@@ -2366,8 +2375,10 @@ void DocxAttributeOutput::switchHeaderFooter(bool isHeaderFooter, sal_Int32 inde
    {
        m_oldTableReference->m_bTableCellOpen = m_tableReference->m_bTableCellOpen;
        m_oldTableReference->m_nTableDepth = m_tableReference->m_nTableDepth;
        m_oldTableReference->m_pOldTablepInner = m_tableReference->m_pOldTablepInner;
        m_tableReference->m_bTableCellOpen = false;
        m_tableReference->m_nTableDepth = 0;
        m_pSectionInfo.reset();
    }
    else if( index == -1)
    {
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index b765315..6012f43 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -113,6 +113,8 @@ struct TableReference
    /// Remember the current table depth.
    sal_uInt32 m_nTableDepth;

    ww8::WW8TableNodeInfoInner::Pointer_t m_pOldTablepInner;

    TableReference()
        : m_bTableCellOpen(false),
        m_nTableDepth(0)