summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZolnai Tamás <tamas.zolnai@collabora.com>2014-12-21 15:38:10 +0100
committerZolnai Tamás <tamas.zolnai@collabora.com>2014-12-22 16:36:59 +0100
commit0c3d5fb0ad35ff7fc18917fc86fa58d9312fe3ae (patch)
tree76d111797e5a546bd87d0179269f6859c18ae944
parentce6f9cbb5f46921ba6670c0b057463d61d05d46e (diff)
bnc#822341: PPTX export of embedded text documents
-Make embedded text documents exported by analogy with spreadsheet embedded documents. -Convert MS ole objects to LO sepcific objecst to allow exporting those ole objects too. Plus use gb_CppunitTest_use_rdb instead of wasting time on finding out which missing components cause test failing. Especcially when we have platform dependent components (e.g. related to embedded object) Change-Id: Ic76d659b51274777a1669c215344a1169ebcba81
-rw-r--r--embeddedobj/source/msole/oleembed.cxx11
-rw-r--r--include/oox/export/shapes.hxx2
-rw-r--r--oox/source/export/shapes.cxx108
-rw-r--r--sd/CppunitTest_sd_export_tests.mk41
-rw-r--r--sd/qa/unit/data/odp/bnc822341.odpbin0 -> 15983 bytes
-rw-r--r--sd/qa/unit/export-tests.cxx37
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
new file mode 100644
index 000000000000..28fe2f4f4b8b
--- /dev/null
+++ b/sd/qa/unit/data/odp/bnc822341.odp
Binary files differ
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();