summaryrefslogtreecommitdiff
path: root/oox
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 /oox
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
Diffstat (limited to 'oox')
-rw-r--r--oox/source/export/shapes.cxx108
1 files changed, 81 insertions, 27 deletions
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 );