diff options
-rw-r--r-- | embeddedobj/source/msole/oleembed.cxx | 11 | ||||
-rw-r--r-- | include/oox/export/shapes.hxx | 2 | ||||
-rw-r--r-- | oox/source/export/shapes.cxx | 108 | ||||
-rw-r--r-- | sd/CppunitTest_sd_export_tests.mk | 41 | ||||
-rw-r--r-- | sd/qa/unit/data/odp/bnc822341.odp | bin | 0 -> 15983 bytes | |||
-rw-r--r-- | sd/qa/unit/export-tests.cxx | 37 |
6 files changed, 131 insertions, 68 deletions
diff --git a/embeddedobj/source/msole/oleembed.cxx b/embeddedobj/source/msole/oleembed.cxx index 7bce91d12cb8..ca8b73187b29 100644 --- a/embeddedobj/source/msole/oleembed.cxx +++ b/embeddedobj/source/msole/oleembed.cxx @@ -587,6 +587,17 @@ void SAL_CALL OleEmbeddedObject::changeState( sal_Int32 nNewState ) } } else +#else + // if it is possible, the object will be converted to OOo format + if ( !m_bTriedConversion ) + { + m_bTriedConversion = true; + if ( TryToConvertToOOo() ) + { + changeState( nNewState ); + return; + } + } #endif { throw embed::UnreachableStateException(); diff --git a/include/oox/export/shapes.hxx b/include/oox/export/shapes.hxx index f0dcdcc237de..6403aec59a8b 100644 --- a/include/oox/export/shapes.hxx +++ b/include/oox/export/shapes.hxx @@ -43,7 +43,7 @@ namespace oox { namespace drawingml { class OOX_DLLPUBLIC ShapeExport : public DrawingML { private: - static int mnSpreadsheetCounter; + static int mnEmbeddeDocumentCounter; struct ShapeCheck { bool operator()( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s1, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> s2 ) const diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx index 8d394fe935e7..8fa575b1082c 100644 --- a/oox/source/export/shapes.cxx +++ b/oox/source/export/shapes.cxx @@ -52,6 +52,7 @@ #include <com/sun/star/text/XSimpleText.hpp> #include <com/sun/star/text/XText.hpp> #include <com/sun/star/text/XTextContent.hpp> +#include <com/sun/star/text/XTextDocument.hpp> #include <com/sun/star/text/XTextField.hpp> #include <com/sun/star/text/XTextRange.hpp> #include <com/sun/star/table/XTable.hpp> @@ -111,7 +112,7 @@ namespace oox { namespace drawingml { mAny >>= variable; // not thread safe -int ShapeExport::mnSpreadsheetCounter = 1; +int ShapeExport::mnEmbeddeDocumentCounter = 1; ShapeExport::ShapeExport( sal_Int32 nXmlNamespace, FSHelperPtr pFS, ShapeHashMap* pShapeMap, XmlFilterBase* pFB, DocumentType eDocumentType, DMLTextExport* pTextExport ) : DrawingML( pFS, pFB, eDocumentType, pTextExport ) @@ -988,47 +989,90 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) } else { - // this part now supports only embedded spreadsheets, it can be extended to support remaining ooxml documents - // only exporter, counter and object filename are specific to spreadsheet - Reference< XSpreadsheetDocument > xSheetDoc( mAny, UNO_QUERY ); - if( xSheetDoc.is() && mpFB) + const bool bSpreadSheet = Reference< XSpreadsheetDocument >( mAny, UNO_QUERY ).is(); + const bool bTextDocument = Reference< css::text::XTextDocument >( mAny, UNO_QUERY ).is(); + if( ( bSpreadSheet || bTextDocument ) && mpFB) { Reference< XComponent > xDocument( mAny, UNO_QUERY ); if( xDocument.is() ) { - Reference< XOutputStream > xOutStream = mpFB->openFragmentStream( OUStringBuffer() - .appendAscii( GetComponentDir() ) - .appendAscii( "/embeddings/spreadsheet" ) - .append( (sal_Int32) mnSpreadsheetCounter ) - .appendAscii( ".xlsx" ) - .makeStringAndClear(), - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ); + Reference< XOutputStream > xOutStream; + if( bSpreadSheet ) + { + xOutStream = mpFB->openFragmentStream( OUStringBuffer() + .appendAscii( GetComponentDir() ) + .appendAscii( "/embeddings/spreadsheet" ) + .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter) ) + .appendAscii( ".xlsx" ) + .makeStringAndClear(), + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ); + } + else + { + xOutStream = mpFB->openFragmentStream( OUStringBuffer() + .appendAscii( GetComponentDir() ) + .appendAscii( "/embeddings/textdocument" ) + .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter) ) + .appendAscii( ".docx" ) + .makeStringAndClear(), + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ); + } + // export the embedded document Sequence< PropertyValue > rMedia(1); rMedia[0].Name = utl::MediaDescriptor::PROP_STREAMFOROUTPUT(); rMedia[0].Value <<= xOutStream; - Reference< XExporter > xExporter( - mpFB->getComponentContext()->getServiceManager()-> - createInstanceWithContext( - "com.sun.star.comp.oox.xls.ExcelFilter", - mpFB->getComponentContext() ), - UNO_QUERY_THROW ); + Reference< XExporter > xExporter; + if( bSpreadSheet ) + { + xExporter.set( + mpFB->getComponentContext()->getServiceManager()-> + createInstanceWithContext( + "com.sun.star.comp.oox.xls.ExcelFilter", + mpFB->getComponentContext() ), + UNO_QUERY_THROW ); + } + else + { + xExporter.set( + mpFB->getComponentContext()->getServiceManager()-> + createInstanceWithContext( + "com.sun.star.comp.Writer.WriterFilter", + mpFB->getComponentContext() ), + UNO_QUERY_THROW ); + + } xExporter->setSourceDocument( xDocument ); Reference< XFilter >( xExporter, UNO_QUERY_THROW )-> filter( rMedia ); xOutStream->closeOutput(); - OUString sRelId = mpFB->addRelation( mpFS->getOutputStream(), - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package", - OUStringBuffer() - .appendAscii( GetRelationCompPrefix() ) - .appendAscii( "embeddings/spreadsheet" ) - .append( (sal_Int32) mnSpreadsheetCounter ++ ) - .appendAscii( ".xlsx" ) - .makeStringAndClear() ); + OUString sRelId; + if( bSpreadSheet ) + { + sRelId = mpFB->addRelation( mpFS->getOutputStream(), + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package", + OUStringBuffer() + .appendAscii( GetRelationCompPrefix() ) + .appendAscii( "embeddings/spreadsheet" ) + .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter++) ) + .appendAscii( ".xlsx" ) + .makeStringAndClear() ); + } + else + { + sRelId = mpFB->addRelation( mpFS->getOutputStream(), + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package", + OUStringBuffer() + .appendAscii( GetRelationCompPrefix() ) + .appendAscii( "embeddings/textdocument" ) + .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter++) ) + .appendAscii( ".docx" ) + .makeStringAndClear() ); + } mpFS->startElementNS( mnXmlNamespace, XML_graphicFrame, FSEND ); @@ -1053,10 +1097,20 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) mpFS->startElementNS( XML_a, XML_graphicData, XML_uri, "http://schemas.openxmlformats.org/presentationml/2006/ole", FSEND ); - mpFS->startElementNS( mnXmlNamespace, XML_oleObj, + if( bSpreadSheet ) + { + mpFS->startElementNS( mnXmlNamespace, XML_oleObj, XML_name, "Spreadsheet", FSNS(XML_r, XML_id), USS( sRelId ), FSEND ); + } + else + { + mpFS->startElementNS( mnXmlNamespace, XML_oleObj, + XML_name, "Document", + FSNS(XML_r, XML_id), USS( sRelId ), + FSEND ); + } mpFS->singleElementNS( mnXmlNamespace, XML_embed, FSEND ); diff --git a/sd/CppunitTest_sd_export_tests.mk b/sd/CppunitTest_sd_export_tests.mk index a8f3dbfa067b..1c54b95f0c99 100644 --- a/sd/CppunitTest_sd_export_tests.mk +++ b/sd/CppunitTest_sd_export_tests.mk @@ -65,46 +65,7 @@ $(eval $(call gb_CppunitTest_use_api,sd_export_tests,\ $(eval $(call gb_CppunitTest_use_ure,sd_export_tests)) $(eval $(call gb_CppunitTest_use_vcl,sd_export_tests)) -$(eval $(call gb_CppunitTest_use_components,sd_export_tests,\ - animations/source/animcore/animcore \ - basic/util/sb \ - chart2/source/chartcore \ - chart2/source/controller/chartcontroller \ - comphelper/util/comphelp \ - configmgr/source/configmgr \ - dbaccess/util/dba \ - desktop/source/deployment/deployment \ - embeddedobj/util/embobj \ - filter/source/config/cache/filterconfig1 \ - filter/source/svg/svgfilter \ - forms/util/frm \ - framework/util/fwk \ - i18npool/util/i18npool \ - linguistic/source/lng \ - oox/util/oox \ - package/source/xstor/xstor \ - package/util/package2 \ - sax/source/expatwrap/expwrap \ - sd/util/sd \ - sd/util/sdfilt \ - sd/util/sdd \ - sfx2/util/sfx \ - sot/util/sot \ - svl/source/fsstor/fsstorage \ - svtools/util/svt \ - toolkit/util/tk \ - ucb/source/core/ucb1 \ - ucb/source/ucp/expand/ucpexpand1 \ - ucb/source/ucp/file/ucpfile1 \ - ucb/source/ucp/package/ucppkg1 \ - ucb/source/ucp/tdoc/ucptdoc1 \ - unotools/util/utl \ - unoxml/source/rdf/unordf \ - unoxml/source/service/unoxml \ - xmloff/util/xo \ - xmlsecurity/util/xsec_fw \ - xmlsecurity/util/xmlsecurity \ -)) +$(eval $(call gb_CppunitTest_use_rdb,sd_export_tests,services)) $(eval $(call gb_CppunitTest_use_custom_headers,sd_export_tests,\ officecfg/registry \ diff --git a/sd/qa/unit/data/odp/bnc822341.odp b/sd/qa/unit/data/odp/bnc822341.odp Binary files differnew file mode 100644 index 000000000000..28fe2f4f4b8b --- /dev/null +++ b/sd/qa/unit/data/odp/bnc822341.odp diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx index 037f8e51722a..b42532316f92 100644 --- a/sd/qa/unit/export-tests.cxx +++ b/sd/qa/unit/export-tests.cxx @@ -81,6 +81,7 @@ public: void testSwappedOutImageExport(); void testLinkedGraphicRT(); void testImageWithSpecialID(); + void testBnc822341(); CPPUNIT_TEST_SUITE(SdExportTest); CPPUNIT_TEST(testN821567); @@ -100,6 +101,7 @@ public: CPPUNIT_TEST(testSwappedOutImageExport); CPPUNIT_TEST(testLinkedGraphicRT); CPPUNIT_TEST(testImageWithSpecialID); + CPPUNIT_TEST(testBnc822341); CPPUNIT_TEST_SUITE_END(); }; @@ -720,6 +722,41 @@ void SdExportTest::testImageWithSpecialID() } } +void SdExportTest::testBnc822341() +{ + // Check import / export of embedded text document + ::sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("sd/qa/unit/data/odp/bnc822341.odp"), ODP); + xDocShRef = saveAndReload( xDocShRef, PPTX ); + + // Export an LO specific ole object (exported from an ODP document) + { + SdDrawDocument *pDoc = xDocShRef->GetDoc(); + CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != NULL ); + const SdrPage *pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT_MESSAGE( "no page", pPage != NULL ); + + const SdrObject* pObj = dynamic_cast<SdrObject*>( pPage->GetObj(0) ); + CPPUNIT_ASSERT_MESSAGE( "no object", pObj != NULL); + CPPUNIT_ASSERT_EQUAL( static_cast<sal_uInt16>(OBJ_OLE2), pObj->GetObjIdentifier() ); + } + + xDocShRef = saveAndReload( xDocShRef, PPTX ); + + // Export an MS specific ole object (exported from a PPTX document) + { + SdDrawDocument *pDoc = xDocShRef->GetDoc(); + CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != NULL ); + const SdrPage *pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT_MESSAGE( "no page", pPage != NULL ); + + const SdrObject* pObj = dynamic_cast<SdrObject*>( pPage->GetObj(0) ); + CPPUNIT_ASSERT_MESSAGE( "no object", pObj != NULL); + CPPUNIT_ASSERT_EQUAL( static_cast<sal_uInt16>(OBJ_OLE2), pObj->GetObjIdentifier() ); + } + + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdExportTest); CPPUNIT_PLUGIN_IMPLEMENT(); |