From 92a407b7f90a98704a238c5ffa3a3491eaf3263a Mon Sep 17 00:00:00 2001 From: Gülşah Köse Date: Wed, 7 Jul 2021 00:27:58 +0300 Subject: tdf143222 Handle alternate content of graphicData element. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Handle alternate content and make true choice. According to ooxml spec ole object requires exactly one pic element. (ECMA-376 Part 1, Annex A, CT_OleObject). In the current case first choice has not pic element and we should allow fallback processing. Change-Id: I30b7de703b8c2f00d6bf286e05eea505ac3627f2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118539 Tested-by: Jenkins Reviewed-by: Gülşah Köse --- include/oox/core/contexthandler2.hxx | 19 ++++++++++++++++++- include/oox/core/fragmenthandler2.hxx | 11 ----------- include/oox/drawingml/graphicshapecontext.hxx | 1 + include/oox/ole/oleobjecthelper.hxx | 1 + 4 files changed, 20 insertions(+), 12 deletions(-) (limited to 'include/oox') diff --git a/include/oox/core/contexthandler2.hxx b/include/oox/core/contexthandler2.hxx index 4e256089ac8e..3a75aff5706a 100644 --- a/include/oox/core/contexthandler2.hxx +++ b/include/oox/core/contexthandler2.hxx @@ -72,7 +72,7 @@ struct ElementInfo; class OOX_DLLPUBLIC ContextHandler2Helper { public: - explicit ContextHandler2Helper( bool bEnableTrimSpace ); + explicit ContextHandler2Helper( bool bEnableTrimSpace, XmlFilterBase& rFilter ); explicit ContextHandler2Helper( const ContextHandler2Helper& rParent ); virtual ~ContextHandler2Helper(); @@ -201,6 +201,21 @@ protected: /** Must be called from endRecord() in derived classes. */ void implEndRecord( sal_Int32 nRecId ); + bool prepareMceContext( sal_Int32 nElement, const AttributeList& rAttribs ); + XmlFilterBase& getDocFilter() const { return mrFilter; } + + enum class MCE_STATE + { + Started, + FoundChoice + }; + + MCE_STATE getMCEState() const { return aMceState.back(); } + void setMCEState( MCE_STATE aState ) { aMceState.back() = aState; } + void addMCEState( MCE_STATE aState ) { aMceState.push_back( aState ); } + void removeMCEState() { aMceState.pop_back(); } + bool isMCEStateEmpty() { return aMceState.empty(); } + private: ContextHandler2Helper& operator=( const ContextHandler2Helper& ) = delete; @@ -214,9 +229,11 @@ private: ContextStackRef mxContextStack; ///< Stack of all processed elements. size_t mnRootStackSize; ///< Stack size on construction time. + std::vector aMceState; protected: bool mbEnableTrimSpace; ///< True = trim whitespace in characters(). + XmlFilterBase& mrFilter; }; class OOX_DLLPUBLIC ContextHandler2 : public ContextHandler, public ContextHandler2Helper diff --git a/include/oox/core/fragmenthandler2.hxx b/include/oox/core/fragmenthandler2.hxx index 86d1453f13a1..598426ee681e 100644 --- a/include/oox/core/fragmenthandler2.hxx +++ b/include/oox/core/fragmenthandler2.hxx @@ -47,17 +47,6 @@ class XmlFilterBase; class OOX_DLLPUBLIC FragmentHandler2 : public FragmentHandler, public ContextHandler2Helper { -protected: - enum class MCE_STATE - { - Started, - FoundChoice - }; - ::std::vector aMceState; - - bool prepareMceContext( sal_Int32 nElement, const AttributeList& rAttribs ); - - public: explicit FragmentHandler2( XmlFilterBase& rFilter, diff --git a/include/oox/drawingml/graphicshapecontext.hxx b/include/oox/drawingml/graphicshapecontext.hxx index 4813d5fc9aed..ffd579f00bb1 100644 --- a/include/oox/drawingml/graphicshapecontext.hxx +++ b/include/oox/drawingml/graphicshapecontext.hxx @@ -62,6 +62,7 @@ public: OleObjectGraphicDataContext( ::oox::core::ContextHandler2Helper const & rParent, const ShapePtr& pShapePtr ); virtual ~OleObjectGraphicDataContext() override; virtual ::oox::core::ContextHandlerRef onCreateContext( ::sal_Int32 Element, const ::oox::AttributeList& rAttribs ) override; + virtual void onEndElement() override; private: ::oox::vml::OleObjectInfo& mrOleObjectInfo; diff --git a/include/oox/ole/oleobjecthelper.hxx b/include/oox/ole/oleobjecthelper.hxx index d2506f3d4949..5b792f2048b1 100644 --- a/include/oox/ole/oleobjecthelper.hxx +++ b/include/oox/ole/oleobjecthelper.hxx @@ -47,6 +47,7 @@ struct OleObjectInfo bool mbLinked; ///< True = linked OLE object, false = embedded OLE object. bool mbShowAsIcon; ///< True = show as icon, false = show contents. bool mbAutoUpdate; + bool mbHasPicture; /// explicit OleObjectInfo(); }; -- cgit