[Libreoffice-commits] core.git: Branch 'libreoffice-5-1' - oox/source
Michael Stahl
mstahl at redhat.com
Tue Jan 12 01:00:26 PST 2016
oox/source/export/shapes.cxx | 138 +++++++++++++++----------------------------
1 file changed, 50 insertions(+), 88 deletions(-)
New commits:
commit ad5489e994c9ccdbc54ccd0e3721adb64a1e77ba
Author: Michael Stahl <mstahl at redhat.com>
Date: Fri Dec 18 22:12:12 2015 +0100
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.
(cherry picked from commit ca29357f7310f057f79357e80a9129b670914404)
oox: stop pointlessly loading embedded objects to check if it's a chart
This fixes SdExportTest::testBnc822341 again, because the conversion
TryToConvertToOOo() in OleEmbeddedObject no longer breaks it.
(cherry picked from commit d54624ff7e7f97d8d7e8fd70572348f63b8a3da5)
Change-Id: I20043b2a414cf5a28eaa24adaf2ddeb737986250
Reviewed-on: https://gerrit.libreoffice.org/21350
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 00f4a94..0c087e8 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -77,6 +77,8 @@
#include <tools/stream.hxx>
#include <tools/globname.hxx>
#include <comphelper/classids.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <sot/exchange.hxx>
#include <vcl/cvtgrf.hxx>
#include <unotools/fontcvt.hxx>
#include <vcl/graph.hxx>
@@ -1583,12 +1585,19 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
{
Reference< XPropertySet > xPropSet( xShape, UNO_QUERY );
if( xPropSet.is() ) {
- if( GetProperty( xPropSet, "Model" ) )
+ OUString clsid;
+ xPropSet->getPropertyValue("CLSID") >>= clsid;
+ assert(!clsid.isEmpty());
+ SvGlobalName aClassID;
+ bool const isValid(aClassID.MakeId(clsid));
+ assert(isValid); (void)isValid;
+
{
- Reference< XChartDocument > xChartDoc;
- mAny >>= xChartDoc;
- if( xChartDoc.is() )
+ if (SotExchange::IsChart(aClassID))
{
+ Reference< XChartDocument > xChartDoc;
+ xPropSet->getPropertyValue("Model") >>= xChartDoc;
+ assert(xChartDoc.is());
//export the chart
Reference< XModel > xModel( xChartDoc, UNO_QUERY );
ChartExport aChartExport( mnXmlNamespace, GetFS(), xModel, GetFB(), GetDocumentType() );
@@ -1597,90 +1606,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 +1668,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 +1705,6 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape )
mpFS->endElementNS( XML_a, XML_graphic );
mpFS->endElementNS( mnXmlNamespace, XML_graphicFrame );
- }
- }
}
}
}
More information about the Libreoffice-commits
mailing list