summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2015-12-18 22:12:12 +0100
committerMichael Stahl <mstahl@redhat.com>2015-12-20 00:56:06 +0100
commitca29357f7310f057f79357e80a9129b670914404 (patch)
tree11a8c7d8cab769a7cf2e7de710fb38ea2a9301ac /oox
parent55bf7e4210e159bbeeaebeb0e092b3700a19d666 (diff)
oox: replace incomplete implementation of ShapeExport::WriteOLE2Shape()
... with oox::GetOLEObjectStream(), and add the "progId" attribute while at it. Not sure what the "name" attribute is good for, it appears more like a unique name than some kind of type classification? This makes SdExportTest::testBnc822341 fail temporarily, and also breaks roundtripping of OOXML OLEs in PPTX files. Change-Id: I20043b2a414cf5a28eaa24adaf2ddeb737986250
Diffstat (limited to 'oox')
-rw-r--r--oox/source/export/shapes.cxx122
1 files changed, 38 insertions, 84 deletions
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 00f4a94c3afa..e03a8f62fe0d 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -77,6 +77,7 @@
#include <tools/stream.hxx>
#include <tools/globname.hxx>
#include <comphelper/classids.hxx>
+#include <comphelper/storagehelper.hxx>
#include <vcl/cvtgrf.hxx>
#include <unotools/fontcvt.hxx>
#include <vcl/graph.hxx>
@@ -1597,90 +1598,44 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
}
else
{
- 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;
- if( bSpreadSheet )
- {
- xOutStream = mpFB->openFragmentStream( OUStringBuffer()
- .appendAscii( GetComponentDir() )
- .append( "/embeddings/spreadsheet" )
- .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter) )
- .append( ".xlsx" )
- .makeStringAndClear(),
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" );
- }
- else
- {
- xOutStream = mpFB->openFragmentStream( OUStringBuffer()
- .appendAscii( GetComponentDir() )
- .append( "/embeddings/textdocument" )
- .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter) )
- .append( ".docx" )
- .makeStringAndClear(),
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document" );
- }
-
- // export the embedded document
- Sequence< PropertyValue > rMedia(1);
+ uno::Reference<embed::XEmbeddedObject> const xObj(
+ xPropSet->getPropertyValue("EmbeddedObject"), uno::UNO_QUERY);
- rMedia[0].Name = utl::MediaDescriptor::PROP_STREAMFOROUTPUT();
- rMedia[0].Value <<= xOutStream;
+ OUString sMediaType;
+ OUString sRelationType;
+ OUString sSuffix;
+ const char * pProgID(nullptr);
- 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 );
+ uno::Reference<io::XInputStream> const xInStream =
+ oox::GetOLEObjectStream(
+ mpFB->getComponentContext(), xObj, OUString(),
+ sMediaType, sRelationType, sSuffix, pProgID);
- }
- xExporter->setSourceDocument( xDocument );
- Reference< XFilter >( xExporter, UNO_QUERY_THROW )->
- filter( rMedia );
+ if (!xInStream.is())
+ {
+ return *this;
+ }
- xOutStream->closeOutput();
+ assert(!sMediaType.isEmpty());
+ assert(!sRelationType.isEmpty());
+ assert(!sSuffix.isEmpty());
+
+ OUString sFileName = "embeddings/oleObject" + OUString::number(mnEmbeddeDocumentCounter++) + "." + sSuffix;
+ uno::Reference<io::XOutputStream> const xOutStream(
+ mpFB->openFragmentStream(
+ OUString::createFromAscii(GetComponentDir()) + "/" + sFileName,
+ sMediaType));
+ assert(xOutStream.is()); // no reason why that could fail
+
+ try {
+ ::comphelper::OStorageHelper::CopyInputToOutput(xInStream, xOutStream);
+ } catch (uno::Exception const& e) {
+ SAL_WARN("oox", "ShapeExport::WriteOLEObject: exception: " << e.Message);
+ }
- OUString sRelId;
- if( bSpreadSheet )
- {
- sRelId = mpFB->addRelation( mpFS->getOutputStream(),
- "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package",
- OUStringBuffer()
- .appendAscii( GetRelationCompPrefix() )
- .append( "embeddings/spreadsheet" )
- .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter++) )
- .append( ".xlsx" )
- .makeStringAndClear() );
- }
- else
- {
- sRelId = mpFB->addRelation( mpFS->getOutputStream(),
- "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package",
- OUStringBuffer()
- .appendAscii( GetRelationCompPrefix() )
- .append( "embeddings/textdocument" )
- .append( static_cast<sal_Int32>(mnEmbeddeDocumentCounter++) )
- .append( ".docx" )
- .makeStringAndClear() );
- }
+ OUString const sRelId = mpFB->addRelation(
+ mpFS->getOutputStream(), sRelationType,
+ OUString::createFromAscii(GetRelationCompPrefix()) + sFileName);
mpFS->startElementNS( mnXmlNamespace, XML_graphicFrame, FSEND );
@@ -1705,17 +1660,18 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
mpFS->startElementNS( XML_a, XML_graphicData,
XML_uri, "http://schemas.openxmlformats.org/presentationml/2006/ole",
FSEND );
- if( bSpreadSheet )
+ if (pProgID)
{
mpFS->startElementNS( mnXmlNamespace, XML_oleObj,
- XML_name, "Spreadsheet",
+ XML_progId, pProgID,
FSNS(XML_r, XML_id), USS( sRelId ),
+ XML_spid, "",
FSEND );
}
else
{
mpFS->startElementNS( mnXmlNamespace, XML_oleObj,
- XML_name, "Document",
+//? XML_name, "Document",
FSNS(XML_r, XML_id), USS( sRelId ),
// The spec says that this is a required attribute, but PowerPoint can only handle an empty value.
XML_spid, "",
@@ -1741,8 +1697,6 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
mpFS->endElementNS( XML_a, XML_graphic );
mpFS->endElementNS( mnXmlNamespace, XML_graphicFrame );
- }
- }
}
}
}