From 55bf7e4210e159bbeeaebeb0e092b3700a19d666 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 18 Dec 2015 21:25:46 +0100 Subject: factor out oox::GetOLEObjectStream() without sw dependencies Change-Id: I32fa4b6b6d755b613b46b32d3b5961976335c76e --- sw/source/filter/ww8/docxexport.cxx | 216 +----------------------------------- 1 file changed, 5 insertions(+), 211 deletions(-) (limited to 'sw/source') 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 #include -#include #include -#include -#include #include #include -#include #include #include #include @@ -74,8 +70,6 @@ #include "ww8par.hxx" #include "ww8scan.hxx" #include -#include -#include #include #include #include @@ -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 lcl_StoreOwnAsOOXML( - uno::Reference const& xContext, - uno::Reference 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 const xTempStream( - xContext->getServiceManager()->createInstanceWithContext( - "com.sun.star.comp.MemoryStream", xContext), - uno::UNO_QUERY_THROW); - uno::Sequence args(2); - args[0].Name = "OutputStream"; - args[0].Value <<= xTempStream->getOutputStream(); - args[1].Name = "FilterName"; - args[1].Value <<= OUString::createFromAscii(pFilterName); - uno::Reference 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 xObj( rObject.GetOleRef() ); + uno::Reference const xContext( + GetFilter().getComponentContext()); - uno::Reference xInStream; OUString sMediaType; OUString sRelationType; OUString sSuffix; const char * pProgID(nullptr); - try - { - uno::Reference const xParent( - uno::Reference(xObj, uno::UNO_QUERY)->getParent(), - uno::UNO_QUERY); - uno::Reference const xParentStorage(xParent->getDocumentStorage()); - OUString const entryName( - uno::Reference(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 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 const xInStream = + oox::GetOLEObjectStream(xContext, xObj, io_rProgID, + sMediaType, sRelationType, sSuffix, pProgID); if (!xInStream.is()) { -- cgit v1.2.3