Kaydet (Commit) e4204df2 authored tarafından Michael Stahl's avatar Michael Stahl Kaydeden (comit) Andras Timar

sw: fix DOCX export of embedded OOXML objects

OOXML embedded objects are converted to ODF during export, which
prevents the export from working, as it expects a stream, and ODF
uses a storage.

There is already a unit test in testEmbeddedXlsx, but it wrongly
succeeds because the components necessary to convert from OOXML to ODF
are missing in the test environment.

(cherry picked from commit 1dac99e7)
(cherry picked from commit 290cac71)

sw: un-break DOCX formula export

(regression from 1dac99e7)

(cherry picked from commit 3b63d2b9)

Change-Id: Ib4df346e04ecfb54ec1a728535be876db921b884
Reviewed-on: https://gerrit.libreoffice.org/20469Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
(cherry picked from commit 7689b7b7)
üst d68ac7a2
...@@ -33,6 +33,9 @@ define sw_ooxmlexport_components ...@@ -33,6 +33,9 @@ define sw_ooxmlexport_components
dbaccess/util/dba \ dbaccess/util/dba \
drawinglayer/drawinglayer \ drawinglayer/drawinglayer \
embeddedobj/util/embobj \ embeddedobj/util/embobj \
$(if $(filter-out WNT,$(OS)), \
embeddedobj/source/msole/emboleobj \
) \
filter/source/config/cache/filterconfig1 \ filter/source/config/cache/filterconfig1 \
filter/source/odfflatxml/odfflatxml \ filter/source/odfflatxml/odfflatxml \
filter/source/xmlfilterdetect/xmlfd \ filter/source/xmlfilterdetect/xmlfd \
...@@ -45,6 +48,9 @@ define sw_ooxmlexport_components ...@@ -45,6 +48,9 @@ define sw_ooxmlexport_components
package/source/xstor/xstor \ package/source/xstor/xstor \
package/util/package2 \ package/util/package2 \
sax/source/expatwrap/expwrap \ sax/source/expatwrap/expwrap \
sc/util/sc \
sc/util/scd \
sc/util/scfilt \
sw/util/sw \ sw/util/sw \
sw/util/swd \ sw/util/swd \
sw/util/msword \ sw/util/msword \
......
...@@ -984,6 +984,9 @@ DECLARE_OOXMLEXPORT_TEST(testFileOpenInputOutputError,"floatingtbl_with_formula. ...@@ -984,6 +984,9 @@ DECLARE_OOXMLEXPORT_TEST(testFileOpenInputOutputError,"floatingtbl_with_formula.
if (!pXmlDoc) if (!pXmlDoc)
return; return;
assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pStyle", "val", "Normal"); assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pStyle", "val", "Normal");
// let's also assert that the formula was exported properly
assertXPathContent(pXmlDoc, "//wps:txbx/w:txbxContent/w:tbl/w:tr/w:tc[2]/w:p/m:oMath/m:sSubSup/m:e/m:r/m:t", OUString::fromUtf8("\xcf\x83"));
} }
#endif #endif
......
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
#include <com/sun/star/drawing/ShadingPattern.hpp> #include <com/sun/star/drawing/ShadingPattern.hpp>
#include <com/sun/star/text/GraphicCrop.hpp> #include <com/sun/star/text/GraphicCrop.hpp>
#include <com/sun/star/drawing/LineStyle.hpp> #include <com/sun/star/drawing/LineStyle.hpp>
#include <com/sun/star/embed/EmbedStates.hpp>
#include <algorithm> #include <algorithm>
...@@ -4330,22 +4331,27 @@ void DocxAttributeOutput::WriteOLE2Obj( const SdrObject* pSdrObj, SwOLENode& rOL ...@@ -4330,22 +4331,27 @@ void DocxAttributeOutput::WriteOLE2Obj( const SdrObject* pSdrObj, SwOLENode& rOL
bool DocxAttributeOutput::WriteOLEChart( const SdrObject* pSdrObj, const Size& rSize ) bool DocxAttributeOutput::WriteOLEChart( const SdrObject* pSdrObj, const Size& rSize )
{ {
uno::Reference< chart2::XChartDocument > xChartDoc;
uno::Reference< drawing::XShape > xShape( const_cast<SdrObject*>(pSdrObj)->getUnoShape(), uno::UNO_QUERY ); uno::Reference< drawing::XShape > xShape( const_cast<SdrObject*>(pSdrObj)->getUnoShape(), uno::UNO_QUERY );
if( xShape.is() ) if (!xShape.is())
{ return false;
uno::Reference< beans::XPropertySet > xPropSet( xShape, uno::UNO_QUERY );
if( xPropSet.is() )
xChartDoc.set( xPropSet->getPropertyValue( "Model" ), uno::UNO_QUERY );
}
if( xChartDoc.is() ) uno::Reference<beans::XPropertySet> const xPropSet(xShape, uno::UNO_QUERY);
{ if (!xPropSet.is())
m_postponedChart = pSdrObj; return false;
m_postponedChartSize = rSize;
return true; OUString clsid; // why is the property of type string, not sequence<byte>?
} xPropSet->getPropertyValue("CLSID") >>= clsid;
return false; SAL_WARN_IF(clsid.isEmpty(), "sw.ww8", "OLE without CLSID?");
SvGlobalName aClassID;
bool const isValid(aClassID.MakeId(clsid));
SAL_WARN_IF(!isValid, "sw.ww8", "OLE with invalid CLSID?");
if (!SotExchange::IsChart(aClassID))
return false;
m_postponedChart = pSdrObj;
m_postponedChartSize = rSize;
return true;
} }
/* /*
...@@ -4444,6 +4450,10 @@ bool DocxAttributeOutput::WriteOLEMath( const SdrObject*, const SwOLENode& rOLEN ...@@ -4444,6 +4450,10 @@ bool DocxAttributeOutput::WriteOLEMath( const SdrObject*, const SwOLENode& rOLEN
void DocxAttributeOutput::WritePostponedMath(const SwOLENode* pPostponedMath) void DocxAttributeOutput::WritePostponedMath(const SwOLENode* pPostponedMath)
{ {
uno::Reference < embed::XEmbeddedObject > xObj(const_cast<SwOLENode*>(pPostponedMath)->GetOLEObj().GetOleRef()); uno::Reference < embed::XEmbeddedObject > xObj(const_cast<SwOLENode*>(pPostponedMath)->GetOLEObj().GetOleRef());
if (embed::EmbedStates::LOADED == xObj->getCurrentState())
{ // must be running so there is a Component
xObj->changeState(embed::EmbedStates::RUNNING);
}
uno::Reference< uno::XInterface > xInterface( xObj->getComponent(), uno::UNO_QUERY ); uno::Reference< uno::XInterface > xInterface( xObj->getComponent(), uno::UNO_QUERY );
if (!xInterface.is()) if (!xInterface.is())
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment