sw/source/filter/ww8/docxattributeoutput.cxx | 20 ++++++++++++++++++-- sw/source/filter/ww8/docxattributeoutput.hxx | 3 +++ sw/source/filter/ww8/docxsdrexport.cxx | 14 +++++++------- sw/source/filter/ww8/docxsdrexport.hxx | 2 ++ 4 files changed, 30 insertions(+), 9 deletions(-)
New commits: commit 5291d902b2e8bbf405dc56a03b685bd10cecabf8 Author: YogeshBharate <yogesh.bhar...@synerzip.com> Date: Thu Mar 13 20:39:28 2014 +0530 fdo#76122: File Corruption-doc contains nested alternateContents. Problem Description: - After roundtrip, files contains <mc:AlternateContent> in <mc:Choice>. - Due to this document gets corrupted when we open it in MS Office 2010. - Added unit test. Change-Id: Ic64b815eda4a42cd59f522ac4570ae145b0b38e1 Reviewed-on: https://gerrit.libreoffice.org/8575 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Miklos Vajna <vmik...@collabora.co.uk> diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 1b3ec74..968fd55 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -302,6 +302,12 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT m_pSerializer->startElementNS(XML_mc, XML_Choice, XML_Requires, "wps", FSEND); + /** + This is to avoid AltenateContent within another AlternateContent. + So when Choice is Open, only write the DML Drawing instead of both DML + and VML Drawing in another AlternateContent. + **/ + SetAlternateContentChoiceOpen( true ); /** FDO#71834 : We should probably be renaming the function switchHeaderFooter to something like SaveRetrieveTableReference. @@ -321,6 +327,7 @@ void DocxAttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pT m_rExport.SdrExporter().writeDMLTextFrame(&aFrame, m_anchorId++); m_pSerializer->endElementNS(XML_mc, XML_Choice); + SetAlternateContentChoiceOpen( false ); // Reset table infos, otherwise the depth of the cells will be incorrect, // in case the text frame had table(s) and we try to export the @@ -3897,7 +3904,10 @@ void DocxAttributeOutput::WritePostponedDMLDrawing() it != m_postponedDMLDrawing->end(); ++it ) { - m_rExport.SdrExporter().writeDMLAndVMLDrawing(it->object, *(it->frame), *(it->point), m_anchorId++); + if ( IsAlternateContentChoiceOpen() ) + m_rExport.SdrExporter().writeDMLDrawing(it->object, (it->frame), m_anchorId++); + else + m_rExport.SdrExporter().writeDMLAndVMLDrawing(it->object, *(it->frame), *(it->point), m_anchorId++); } delete m_postponedDMLDrawing; m_postponedDMLDrawing = NULL; @@ -3942,7 +3952,12 @@ void DocxAttributeOutput::OutputFlyFrame_Impl( const sw::Frame &rFrame, const Po else { if ( m_postponedDMLDrawing == NULL ) - m_rExport.SdrExporter().writeDMLAndVMLDrawing( pSdrObj, rFrame.GetFrmFmt(), rNdTopLeft, m_anchorId++); + { + if ( IsAlternateContentChoiceOpen() ) + m_rExport.SdrExporter().writeDMLDrawing( pSdrObj, &rFrame.GetFrmFmt(), m_anchorId++); + else + m_rExport.SdrExporter().writeDMLAndVMLDrawing( pSdrObj, rFrame.GetFrmFmt(), rNdTopLeft, m_anchorId++); + } else // we are writing out attributes, but w:drawing should not be inside w:rPr, so write it out later m_postponedDMLDrawing->push_back(PostponedDrawing(pSdrObj, &(rFrame.GetFrmFmt()), &rNdTopLeft)); @@ -6945,6 +6960,7 @@ DocxAttributeOutput::DocxAttributeOutput( DocxExport &rExport, FSHelperPtr pSeri m_pTableWrt( NULL ), m_bParagraphOpened( false ), m_bIsFirstParagraph( true ), + m_bAlternateContentChoiceOpen( false ), m_nColBreakStatus( COLBRK_NONE ), m_nTextFrameLevel( 0 ), m_closeHyperlinkInThisRun( false ), diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index 6012f43..042fea6 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -756,6 +756,7 @@ private: bool m_bParagraphOpened; bool m_bIsFirstParagraph; + bool m_bAlternateContentChoiceOpen; // Remember that a column break has to be opened at the // beginning of the next paragraph @@ -892,6 +893,8 @@ public: void SetWritingHeaderFooter( bool bWritingHeaderFooter ) { m_bWritingHeaderFooter = bWritingHeaderFooter; } bool GetWritingHeaderFooter( ) { return m_bWritingHeaderFooter; } + void SetAlternateContentChoiceOpen( bool bAltContentChoiceOpen ) { m_bAlternateContentChoiceOpen = bAltContentChoiceOpen; } + bool IsAlternateContentChoiceOpen( ) { return m_bAlternateContentChoiceOpen; } }; #endif // INCLUDED_SW_SOURCE_FILTER_WW8_DOCXATTRIBUTEOUTPUT_HXX diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx index 8e7a4127..aae6752 100644 --- a/sw/source/filter/ww8/docxsdrexport.cxx +++ b/sw/source/filter/ww8/docxsdrexport.cxx @@ -138,7 +138,7 @@ struct DocxSdrExport::Impl } /// Writes wp wrapper code around an SdrObject, which itself is written using drawingML syntax. - void writeDMLDrawing(const SdrObject* pSdrObj, const SwFrmFmt* pFrmFmt, int nAnchorId); + void textFrameShadow(const SwFrmFmt& rFrmFmt); bool isSupportedDMLShape(com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xShape); }; @@ -532,11 +532,11 @@ void DocxSdrExport::writeVMLDrawing(const SdrObject* sdrObj, const SwFrmFmt& rFr const_cast< SdrObject* >(sdrObj)->SetPage(0); } -void DocxSdrExport::Impl::writeDMLDrawing(const SdrObject* pSdrObject, const SwFrmFmt* pFrmFmt, int nAnchorId) +void DocxSdrExport::writeDMLDrawing(const SdrObject* pSdrObject, const SwFrmFmt* pFrmFmt, int nAnchorId) { - sax_fastparser::FSHelperPtr pFS = m_pSerializer; + sax_fastparser::FSHelperPtr pFS = m_pImpl->m_pSerializer; Size aSize(pSdrObject->GetLogicRect().GetWidth(), pSdrObject->GetLogicRect().GetHeight()); - m_rSdrExport.startDMLAnchorInline(pFrmFmt, aSize); + m_pImpl->m_rSdrExport.startDMLAnchorInline(pFrmFmt, aSize); sax_fastparser::FastAttributeList* pDocPrAttrList = pFS->createAttrList(); pDocPrAttrList->add(XML_id, OString::number(nAnchorId).getStr()); @@ -562,7 +562,7 @@ void DocxSdrExport::Impl::writeDMLDrawing(const SdrObject* pSdrObject, const SwF XML_uri, pNamespace, FSEND); - m_rExport.OutputDML(xShape); + m_pImpl->m_rExport.OutputDML(xShape); pFS->endElementNS(XML_a, XML_graphicData); pFS->endElementNS(XML_a, XML_graphic); @@ -590,7 +590,7 @@ void DocxSdrExport::Impl::writeDMLDrawing(const SdrObject* pSdrObject, const SwF pFS->endElementNS(XML_wp14, XML_sizeRelV); } - m_rSdrExport.endDMLAnchorInline(pFrmFmt); + m_pImpl->m_rSdrExport.endDMLAnchorInline(pFrmFmt); } void DocxSdrExport::Impl::textFrameShadow(const SwFrmFmt& rFrmFmt) @@ -657,7 +657,7 @@ void DocxSdrExport::writeDMLAndVMLDrawing(const SdrObject* sdrObj, const SwFrmFm m_pImpl->m_pSerializer->startElementNS(XML_mc, XML_Choice, XML_Requires, (pObjGroup ? "wpg" : "wps"), FSEND); - m_pImpl->writeDMLDrawing(sdrObj, &rFrmFmt, nAnchorId); + writeDMLDrawing(sdrObj, &rFrmFmt, nAnchorId); m_pImpl->m_pSerializer->endElementNS(XML_mc, XML_Choice); m_pImpl->m_pSerializer->startElementNS(XML_mc, XML_Fallback, FSEND); diff --git a/sw/source/filter/ww8/docxsdrexport.hxx b/sw/source/filter/ww8/docxsdrexport.hxx index 8833ab9..1fa7fe0 100644 --- a/sw/source/filter/ww8/docxsdrexport.hxx +++ b/sw/source/filter/ww8/docxsdrexport.hxx @@ -77,6 +77,8 @@ public: void endDMLAnchorInline(const SwFrmFmt* pFrmFmt); /// Writes a drawing as VML data. void writeVMLDrawing(const SdrObject* sdrObj, const SwFrmFmt& rFrmFmt,const Point& rNdTopLeft); + /// Writes a drawing as DML. + void writeDMLDrawing(const SdrObject* pSdrObj, const SwFrmFmt* pFrmFmt, int nAnchorId); /// Writes shape in both DML and VML format. void writeDMLAndVMLDrawing(const SdrObject* sdrObj, const SwFrmFmt& rFrmFmt,const Point& rNdTopLeft, int nAnchorId); /// Write <a:effectLst>, the effect list. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits