summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2015-12-18 21:25:46 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-01-12 08:59:25 +0000
commitf78d49351ff7689d2fdef8a39634821841eeaf81 (patch)
tree8efe5fb2f8c7231ede6e3f3e8783b6dd345bbb41 /sw
parenta20c344627a71c079c6b9abc1fd629a636b37cc8 (diff)
factor out oox::GetOLEObjectStream() without sw dependencies
Change-Id: I32fa4b6b6d755b613b46b32d3b5961976335c76e (cherry picked from commit 55bf7e4210e159bbeeaebeb0e092b3700a19d666) Reviewed-on: https://gerrit.libreoffice.org/21349 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'sw')
-rw-r--r--sw/source/filter/ww8/docxexport.cxx216
1 files changed, 5 insertions, 211 deletions
diff --git a/sw/source/filter/ww8/docxexport.cxx b/sw/source/filter/ww8/docxexport.cxx
index cd01cd43c9af..f0a931ca0678 100644
--- a/sw/source/filter/ww8/docxexport.cxx
+++ b/sw/source/filter/ww8/docxexport.cxx
@@ -24,13 +24,9 @@
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
#include <com/sun/star/document/XDocumentProperties.hpp>
-#include <com/sun/star/document/XStorageBasedDocument.hpp>
#include <com/sun/star/drawing/XShape.hpp>
-#include <com/sun/star/embed/EmbedStates.hpp>
-#include <com/sun/star/embed/XEmbedPersist.hpp>
#include <com/sun/star/i18n/ScriptType.hpp>
#include <com/sun/star/frame/XModel.hpp>
-#include <com/sun/star/frame/XStorable.hpp>
#include <com/sun/star/xml/dom/XDocument.hpp>
#include <com/sun/star/xml/sax/XSAXSerializable.hpp>
#include <com/sun/star/xml/sax/Writer.hpp>
@@ -74,8 +70,6 @@
#include "ww8par.hxx"
#include "ww8scan.hxx"
#include <oox/token/properties.hxx>
-#include <comphelper/classids.hxx>
-#include <comphelper/embeddedobjectcontainer.hxx>
#include <comphelper/string.hxx>
#include <rtl/ustrbuf.hxx>
#include <vcl/font.hxx>
@@ -371,220 +365,20 @@ OString DocxExport::OutputChart( uno::Reference< frame::XModel >& xModel, sal_In
return OUStringToOString( sId, RTL_TEXTENCODING_UTF8 );
}
-
-static void lcl_ConvertProgID(OUString const& rProgID,
- OUString & o_rMediaType, OUString & o_rRelationType, OUString & o_rFileExtension)
-{
- if (rProgID == "Excel.Sheet.12")
- {
- o_rMediaType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "xlsx";
- }
- else if (rProgID.startsWith("Excel.SheetBinaryMacroEnabled.12") )
- {
- o_rMediaType = "application/vnd.ms-excel.sheet.binary.macroEnabled.12";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "xlsb";
- }
- else if (rProgID.startsWith("Excel.SheetMacroEnabled.12"))
- {
- o_rMediaType = "application/vnd.ms-excel.sheet.macroEnabled.12";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "xlsm";
- }
- else if (rProgID.startsWith("Excel.Sheet"))
- {
- o_rMediaType = "application/vnd.ms-excel";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
- o_rFileExtension = "xls";
- }
- else if (rProgID == "PowerPoint.Show.12")
- {
- o_rMediaType = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "pptx";
- }
- else if (rProgID == "PowerPoint.ShowMacroEnabled.12")
- {
- o_rMediaType = "application/vnd.ms-powerpoint.presentation.macroEnabled.12";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "pptm";
- }
- else if (rProgID.startsWith("PowerPoint.Show"))
- {
- o_rMediaType = "application/vnd.ms-powerpoint";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
- o_rFileExtension = "ppt";
- }
- else if (rProgID.startsWith("PowerPoint.Slide.12"))
- {
- o_rMediaType = "application/vnd.openxmlformats-officedocument.presentationml.slide";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "sldx";
- }
- else if (rProgID == "PowerPoint.SlideMacroEnabled.12")
- {
- o_rMediaType = "application/vnd.ms-powerpoint.slide.macroEnabled.12";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "sldm";
- }
- else if (rProgID == "Word.DocumentMacroEnabled.12")
- {
- o_rMediaType = "application/vnd.ms-word.document.macroEnabled.12";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "docm";
- }
- else if (rProgID == "Word.Document.12")
- {
- o_rMediaType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- o_rFileExtension = "docx";
- }
- else if (rProgID == "Word.Document.8")
- {
- o_rMediaType = "application/msword";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
- o_rFileExtension = "doc";
- }
- else if (rProgID == "Excel.Chart.8")
- {
- o_rMediaType = "application/vnd.ms-excel";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
- o_rFileExtension = "xls";
- }
- else if (rProgID == "AcroExch.Document.11")
- {
- o_rMediaType = "application/pdf";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
- o_rFileExtension = "pdf";
- }
- else
- {
- o_rMediaType = "application/vnd.openxmlformats-officedocument.oleObject";
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
- o_rFileExtension = "bin";
- }
-}
-
-static uno::Reference<io::XInputStream> lcl_StoreOwnAsOOXML(
- uno::Reference<uno::XComponentContext> const& xContext,
- uno::Reference<embed::XEmbeddedObject> const& xObj,
- char const*& o_rpProgID,
- OUString & o_rMediaType, OUString & o_rRelationType, OUString & o_rSuffix)
-{
- static struct {
- struct {
- sal_uInt32 n1;
- sal_uInt16 n2, n3;
- sal_uInt8 b8, b9, b10, b11, b12, b13, b14, b15;
- } ClassId;
- char const* pFilterName;
- char const* pMediaType;
- char const* pProgID;
- char const* pSuffix;
- } s_Mapping[] = {
- { {SO3_SW_CLASSID_60}, "MS Word 2007 XML", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "Word.Document.12", "docx" },
- { {SO3_SC_CLASSID_60}, "Calc MS Excel 2007 XML", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Excel.Sheet.12", "xlsx" },
- { {SO3_SIMPRESS_CLASSID_60}, "Impress MS PowerPoint 2007 XML", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "PowerPoint.Show.12", "pptx" },
- // FIXME: Draw does not appear to have a MSO format export filter?
-// { {SO3_SDRAW_CLASSID}, "", "", "", "" },
- { {SO3_SCH_CLASSID_60}, "unused", "", "", "" },
- { {SO3_SM_CLASSID_60}, "unused", "", "", "" },
- };
-
- const char * pFilterName(nullptr);
- SvGlobalName const classId(xObj->getClassID());
- for (size_t i = 0; i < SAL_N_ELEMENTS(s_Mapping); ++i)
- {
- auto const& rId(s_Mapping[i].ClassId);
- SvGlobalName const temp(rId.n1, rId.n2, rId.n3, rId.b8, rId.b9, rId.b10, rId.b11, rId.b12, rId.b13, rId.b14, rId.b15);
- if (temp == classId)
- {
- assert(SvGlobalName(SO3_SCH_CLASSID_60) != classId); // chart should be written elsewhere!
- assert(SvGlobalName(SO3_SM_CLASSID_60) != classId); // formula should be written elsewhere!
- pFilterName = s_Mapping[i].pFilterName;
- o_rMediaType = OUString::createFromAscii(s_Mapping[i].pMediaType);
- o_rpProgID = s_Mapping[i].pProgID;
- o_rSuffix = OUString::createFromAscii(s_Mapping[i].pSuffix);
- o_rRelationType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package";
- break;
- }
- }
-
- if (!pFilterName)
- {
- SAL_WARN("sw.ww8", "DocxExport::WriteOLEObject: unknown ClassId " << classId.GetHexName());
- return nullptr;
- }
-
- if (embed::EmbedStates::LOADED == xObj->getCurrentState())
- {
- xObj->changeState(embed::EmbedStates::RUNNING);
- }
- // use a temp stream - while it would work to store directly to a
- // fragment stream, an error during export means we'd have to delete it
- uno::Reference<io::XStream> const xTempStream(
- xContext->getServiceManager()->createInstanceWithContext(
- "com.sun.star.comp.MemoryStream", xContext),
- uno::UNO_QUERY_THROW);
- uno::Sequence<beans::PropertyValue> args(2);
- args[0].Name = "OutputStream";
- args[0].Value <<= xTempStream->getOutputStream();
- args[1].Name = "FilterName";
- args[1].Value <<= OUString::createFromAscii(pFilterName);
- uno::Reference<frame::XStorable> xStorable(xObj->getComponent(), uno::UNO_QUERY);
- try
- {
- xStorable->storeToURL("private:stream", args);
- }
- catch (uno::Exception const& e)
- {
- SAL_WARN("sw.ww8", "DocxExport::WriteOLEObject: exception: \"" << e.Message << "\"");
- return nullptr;
- }
- xTempStream->getOutputStream()->closeOutput();
- return xTempStream->getInputStream();
-}
-
OString DocxExport::WriteOLEObject(SwOLEObj& rObject, OUString & io_rProgID)
{
uno::Reference <embed::XEmbeddedObject> xObj( rObject.GetOleRef() );
+ uno::Reference<uno::XComponentContext> const xContext(
+ GetFilter().getComponentContext());
- uno::Reference<io::XInputStream> xInStream;
OUString sMediaType;
OUString sRelationType;
OUString sSuffix;
const char * pProgID(nullptr);
- try
- {
- uno::Reference<document::XStorageBasedDocument> const xParent(
- uno::Reference<container::XChild>(xObj, uno::UNO_QUERY)->getParent(),
- uno::UNO_QUERY);
- uno::Reference<embed::XStorage> const xParentStorage(xParent->getDocumentStorage());
- OUString const entryName(
- uno::Reference<embed::XEmbedPersist>(xObj, uno::UNO_QUERY)->getEntryName());
-
- if (xParentStorage->isStreamElement(entryName))
- {
- lcl_ConvertProgID(io_rProgID, sMediaType, sRelationType, sSuffix);
-
- xInStream = xParentStorage->cloneStreamElement(entryName)->getInputStream();
- // TODO: is it possible to take the sMediaType from the stream?
- }
- else // the object is ODF - either the whole document is
- { // ODF, or the OLE was edited so it was converted to ODF
- uno::Reference<uno::XComponentContext> const xContext(
- GetFilter().getComponentContext());
- xInStream = lcl_StoreOwnAsOOXML(xContext, xObj,
- pProgID, sMediaType, sRelationType, sSuffix);
- }
- }
- catch (uno::Exception const& e)
- {
- SAL_WARN("sw.ww8", "DocxExport::WriteOLEObject: exception: " << e.Message);
- }
+ uno::Reference<io::XInputStream> const xInStream =
+ oox::GetOLEObjectStream(xContext, xObj, io_rProgID,
+ sMediaType, sRelationType, sSuffix, pProgID);
if (!xInStream.is())
{