From 72e6269b88a32a672e00d2c25f0d0400038d1360 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Wed, 14 Nov 2018 17:17:46 +0100 Subject: sw: fix modification of ole obj native data during HTML import It is expected that if you load an OLE2 storage (from reqif-xhtml) and you save it as ODT, the OLE2 data is not modified. This was almost the case, but we insisted on removing the OLE2 preview from the storage. Add a new flag to OleEmbeddedObject, so import filters can opt in for not modifying the OLE2 data. [ The nice situation is that we already had a test file which had a preview stream in the OLE2 storage, so we can easily assert there that the size doesn't change. ] Change-Id: I9b8b29f015dd4f2513e51a1066767218580cb5d8 Reviewed-on: https://gerrit.libreoffice.org/63381 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- embeddedobj/source/inc/oleembobj.hxx | 10 +++++++++- embeddedobj/source/msole/olemisc.cxx | 14 ++++++++++++++ embeddedobj/source/msole/olepersist.cxx | 3 ++- 3 files changed, 25 insertions(+), 2 deletions(-) (limited to 'embeddedobj') diff --git a/embeddedobj/source/inc/oleembobj.hxx b/embeddedobj/source/inc/oleembobj.hxx index b1f44fbbd429..d9b75d2a9836 100644 --- a/embeddedobj/source/inc/oleembobj.hxx +++ b/embeddedobj/source/inc/oleembobj.hxx @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -117,7 +118,8 @@ class OleEmbeddedObject : public ::cppu::WeakImplHelper , css::embed::XLinkageSupport , css::embed::XInplaceObject , css::container::XChild - , css::io::XActiveDataStreamer > + , css::io::XActiveDataStreamer + , css::lang::XInitialization > { friend class OleComponent; @@ -205,6 +207,9 @@ class OleEmbeddedObject : public ::cppu::WeakImplHelper css::uno::Reference< css::uno::XInterface > m_xParent; + /// If it is allowed to modify entires in the stream of the OLE storage. + bool m_bStreamReadOnly = false; + protected: /// @throws css::uno::Exception css::uno::Reference< css::io::XStream > TryToGetAcceptableFormat_Impl( @@ -441,6 +446,9 @@ public: // XActiveDataStreamer void SAL_CALL setStream(const css::uno::Reference& xStream) override; css::uno::Reference SAL_CALL getStream() override; + + // XInitialization + void SAL_CALL initialize(const css::uno::Sequence& rArguments) override; }; #endif diff --git a/embeddedobj/source/msole/olemisc.cxx b/embeddedobj/source/msole/olemisc.cxx index 83485c89d768..2d757a594533 100644 --- a/embeddedobj/source/msole/olemisc.cxx +++ b/embeddedobj/source/msole/olemisc.cxx @@ -29,6 +29,7 @@ #include #include +#include #include #include "olepersist.hxx" @@ -676,4 +677,17 @@ css::uno::Reference OleEmbeddedObject::getStream() return m_xObjectStream; } +void OleEmbeddedObject::initialize(const uno::Sequence& rArguments) +{ + if (!rArguments.hasElements()) + return; + + comphelper::SequenceAsHashMap aValues(rArguments[0]); + for (const auto& rValue : aValues) + { + if (rValue.first == "StreamReadOnly") + rValue.second >>= m_bStreamReadOnly; + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/embeddedobj/source/msole/olepersist.cxx b/embeddedobj/source/msole/olepersist.cxx index eedc8c4fe63b..df78e09291ce 100644 --- a/embeddedobj/source/msole/olepersist.cxx +++ b/embeddedobj/source/msole/olepersist.cxx @@ -1201,7 +1201,8 @@ void OleEmbeddedObject::StoreToLocation_Impl( if ( !xCachedVisualRepresentation.is() ) xCachedVisualRepresentation = TryToRetrieveCachedVisualRepresentation_Impl( xTargetStream ); - RemoveVisualCache_Impl( xTargetStream ); + if (!m_bStreamReadOnly) + RemoveVisualCache_Impl(xTargetStream); } } -- cgit