diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2020-05-07 18:18:43 +0200 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-05-19 10:26:29 +0200 |
commit | 4e98ba4ba5c17ab8ae1170662af645b9d2bfde84 (patch) | |
tree | 645ebd6f8d5daf918190e8fe7d71a456ddfd0d90 /xmloff/source/style | |
parent | bd03dc39f6f02a875590413378355daa4893a988 (diff) |
tdf#103602 xmloff,sw: ODF 1.3 import: PageStyle with drawing-page style
Associate a style of family "drawing-page" with a style:master-page.
This fixes the small part of the draw:fill attribute problem that is
covered by OFFICE-3937 in ODF 1.3.
This is the import part.
Change-Id: I4c86fa24c36407b64ce33f0890e5da8c26c5292a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93670
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
Diffstat (limited to 'xmloff/source/style')
-rw-r--r-- | xmloff/source/style/PageMasterImportContext.cxx | 40 | ||||
-rw-r--r-- | xmloff/source/style/PageMasterPropHdlFactory.cxx | 2 | ||||
-rw-r--r-- | xmloff/source/style/PageMasterPropHdlFactory.hxx | 37 | ||||
-rw-r--r-- | xmloff/source/style/PageMasterPropMapper.cxx | 4 | ||||
-rw-r--r-- | xmloff/source/style/PageMasterPropMapper.hxx | 37 | ||||
-rw-r--r-- | xmloff/source/style/PageMasterStyleMap.cxx | 30 | ||||
-rw-r--r-- | xmloff/source/style/XMLPageExport.cxx | 4 | ||||
-rw-r--r-- | xmloff/source/style/prstylei.cxx | 3 | ||||
-rw-r--r-- | xmloff/source/style/xmlstyle.cxx | 2 |
9 files changed, 75 insertions, 84 deletions
diff --git a/xmloff/source/style/PageMasterImportContext.cxx b/xmloff/source/style/PageMasterImportContext.cxx index 0e622258977b..a30fafb712a5 100644 --- a/xmloff/source/style/PageMasterImportContext.cxx +++ b/xmloff/source/style/PageMasterImportContext.cxx @@ -34,6 +34,7 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/beans/XPropertySetInfo.hpp> #include <xmloff/xmlerror.hxx> +#include <xmloff/XMLTextMasterPageContext.hxx> using namespace ::com::sun::star; using namespace ::xmloff::token; @@ -158,7 +159,14 @@ SvXMLImportContextRef PageStyleContext::CreateChildContext( return XMLPropStyleContext::CreateChildContext(nPrefix, rLocalName, xAttrList); } -void PageStyleContext::FillPropertySet(const uno::Reference<beans::XPropertySet > & rPropSet) +void PageStyleContext::FillPropertySet(const uno::Reference<beans::XPropertySet > &) +{ + assert(false); // dont call this virtual, call function below +} + +void PageStyleContext::FillPropertySet_PageStyle( + const uno::Reference<beans::XPropertySet> & rPropSet, + XMLPropStyleContext *const pDrawingPageStyle) { // need to filter out old fill definitions when the new ones are used. The new // ones are used when a FillStyle is defined @@ -168,7 +176,9 @@ void PageStyleContext::FillPropertySet(const uno::Reference<beans::XPropertySet static OUString s_HeaderFillStyle("HeaderFillStyle"); static OUString s_FooterFillStyle("FooterFillStyle"); - if(doNewDrawingLayerFillStyleDefinitionsExist(s_FillStyle)) + // note: the function must only check by property name, not any id/flag! + if (doNewDrawingLayerFillStyleDefinitionsExist(s_FillStyle) + || (pDrawingPageStyle && pDrawingPageStyle->doNewDrawingLayerFillStyleDefinitionsExist(s_FillStyle))) { deactivateOldFillStyleDefinitions(getStandardSet()); } @@ -296,6 +306,12 @@ void PageStyleContext::FillPropertySet(const uno::Reference<beans::XPropertySet OSL_ENSURE(xImpPrMap.is(), "Got no SvXMLImportPropertyMapper (!)"); } + // pDrawingPageStyle overrides this + if (pDrawingPageStyle) + { + pDrawingPageStyle->FillPropertySet(rPropSet); + } + // old code, replaced by above stuff // XMLPropStyleContext::FillPropertySet(rPropSet); @@ -308,6 +324,24 @@ void PageStyleContext::FillPropertySet(const uno::Reference<beans::XPropertySet } } +extern ContextID_Index_Pair const g_MasterPageContextIDs[] = +{ + { CTF_PM_FILLGRADIENTNAME, -1 }, + { CTF_PM_FILLTRANSNAME, -1 }, + { CTF_PM_FILLHATCHNAME, -1 }, + { CTF_PM_FILLBITMAPNAME, -1 }, + + {-1, -1} +}; + +extern XmlStyleFamily const g_MasterPageFamilies[] = +{ + XmlStyleFamily::SD_GRADIENT_ID, + XmlStyleFamily::SD_GRADIENT_ID, + XmlStyleFamily::SD_HATCH_ID, + XmlStyleFamily::SD_FILL_IMAGE_ID +}; + // text grid enhancement for better CJK support //set default page layout style void PageStyleContext::SetDefaults( ) @@ -318,7 +352,7 @@ void PageStyleContext::SetDefaults( ) Reference < XInterface > xInt = xFactory->createInstance( "com.sun.star.text.Defaults" ); Reference < beans::XPropertySet > xProperties ( xInt, UNO_QUERY ); if ( xProperties.is() ) - FillPropertySet ( xProperties ); + FillPropertySet_PageStyle(xProperties, nullptr); } } diff --git a/xmloff/source/style/PageMasterPropHdlFactory.cxx b/xmloff/source/style/PageMasterPropHdlFactory.cxx index 6f40f439307a..ae61a3026874 100644 --- a/xmloff/source/style/PageMasterPropHdlFactory.cxx +++ b/xmloff/source/style/PageMasterPropHdlFactory.cxx @@ -17,7 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include "PageMasterPropHdlFactory.hxx" +#include <PageMasterPropHdlFactory.hxx> #include <enummaps.hxx> #include <xmloff/xmlement.hxx> #include <xmloff/xmltypes.hxx> diff --git a/xmloff/source/style/PageMasterPropHdlFactory.hxx b/xmloff/source/style/PageMasterPropHdlFactory.hxx deleted file mode 100644 index b5852e7b9101..000000000000 --- a/xmloff/source/style/PageMasterPropHdlFactory.hxx +++ /dev/null @@ -1,37 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifndef INCLUDED_XMLOFF_SOURCE_STYLE_PAGEMASTERPROPHDLFACTORY_HXX -#define INCLUDED_XMLOFF_SOURCE_STYLE_PAGEMASTERPROPHDLFACTORY_HXX - -#include <xmloff/prhdlfac.hxx> - -class XMLPageMasterPropHdlFactory : public XMLPropertyHandlerFactory -{ -public: - XMLPageMasterPropHdlFactory(); - virtual ~XMLPageMasterPropHdlFactory() override; - - virtual const XMLPropertyHandler* - GetPropertyHandler( sal_Int32 nType ) const override; -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/style/PageMasterPropMapper.cxx b/xmloff/source/style/PageMasterPropMapper.cxx index c741632ad9dd..c792ff0a0eb0 100644 --- a/xmloff/source/style/PageMasterPropMapper.cxx +++ b/xmloff/source/style/PageMasterPropMapper.cxx @@ -17,11 +17,11 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include "PageMasterPropMapper.hxx" +#include <PageMasterPropMapper.hxx> #include <rtl/ref.hxx> #include <PageMasterStyleMap.hxx> -#include "PageMasterPropHdlFactory.hxx" +#include <PageMasterPropHdlFactory.hxx> #include <com/sun/star/beans/XPropertySet.hpp> diff --git a/xmloff/source/style/PageMasterPropMapper.hxx b/xmloff/source/style/PageMasterPropMapper.hxx deleted file mode 100644 index bd1c9ab25f7b..000000000000 --- a/xmloff/source/style/PageMasterPropMapper.hxx +++ /dev/null @@ -1,37 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifndef INCLUDED_XMLOFF_SOURCE_STYLE_PAGEMASTERPROPMAPPER_HXX -#define INCLUDED_XMLOFF_SOURCE_STYLE_PAGEMASTERPROPMAPPER_HXX - -#include <xmloff/xmlprmap.hxx> - -class XMLPageMasterPropSetMapper : public XMLPropertySetMapper -{ -public: - explicit XMLPageMasterPropSetMapper(); - XMLPageMasterPropSetMapper( - const XMLPropertyMapEntry* pEntries, - const rtl::Reference< XMLPropertyHandlerFactory >& rFactory ); - virtual ~XMLPageMasterPropSetMapper() override; -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/style/PageMasterStyleMap.cxx b/xmloff/source/style/PageMasterStyleMap.cxx index 9229b38de7df..7ab1b46f9d2b 100644 --- a/xmloff/source/style/PageMasterStyleMap.cxx +++ b/xmloff/source/style/PageMasterStyleMap.cxx @@ -24,6 +24,7 @@ using namespace ::xmloff::token; #define MAP(name,prefix,token,type,context,version) { name, sizeof(name)-1, prefix, token, type, context, version, false } +#define DPMAP(name,prefix,token,type,context) MAP(name, prefix, token, type|XML_TYPE_PROP_DRAWING_PAGE, context, SvtSaveOptions::ODFSVER_013) #define PLMAP(name,prefix,token,type,context) \ MAP(name, prefix, token, type|XML_TYPE_PROP_PAGE_LAYOUT, context, SvtSaveOptions::ODFSVER_010) #define PLMAP_12(name,prefix,token,type,context) \ @@ -121,6 +122,7 @@ const XMLPropertyMapEntry aXMLPageMasterStyleMap[] = // Also need own defines for the used context flags (e.g. CTF_PM_FILLGRADIENTNAME instead of // CTF_FILLGRADIENTNAME) since these are used to *filter* up to which entry the attributes belong to the // 'page-layout-properties' section (!), see SvXMLAutoStylePoolP_Impl::exportXML, look for XmlStyleFamily::PAGE_MASTER + // note: these are duplicated below, in g_XMLPageMasterDrawingPageStyleMap PLMAP( "FillStyle", XML_NAMESPACE_DRAW, XML_FILL, XML_SW_TYPE_FILLSTYLE, 0 ), PLMAP( "FillColor", XML_NAMESPACE_DRAW, XML_FILL_COLOR, XML_TYPE_COLOR, 0 ), PLMAP( "FillColor2", XML_NAMESPACE_DRAW, XML_SECONDARY_FILL_COLOR, XML_TYPE_COLOR, 0 ), @@ -267,4 +269,32 @@ const XMLPropertyMapEntry aXMLPageMasterStyleMap[] = { nullptr, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFSVER_010, false } // index 190 }; +XMLPropertyMapEntry const g_XMLPageMasterDrawingPageStyleMap[] = +{ + // ODF 1.3 OFFICE-3937 style of family "drawing-page" referenced from style:master-page + // duplication of relevant part of aXMLPageMasterStyleMap but as DP type + DPMAP("FillStyle", XML_NAMESPACE_DRAW, XML_FILL, XML_SW_TYPE_FILLSTYLE, 0), + DPMAP("FillColor", XML_NAMESPACE_DRAW, XML_FILL_COLOR, XML_TYPE_COLOR, 0), + DPMAP("FillColor2", XML_NAMESPACE_DRAW, XML_SECONDARY_FILL_COLOR, XML_TYPE_COLOR, 0), + DPMAP("FillGradientName", XML_NAMESPACE_DRAW, XML_FILL_GRADIENT_NAME, XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_PM_FILLGRADIENTNAME), + DPMAP("FillGradientStepCount", XML_NAMESPACE_DRAW, XML_GRADIENT_STEP_COUNT, XML_TYPE_NUMBER16, 0), + DPMAP("FillHatchName", XML_NAMESPACE_DRAW, XML_FILL_HATCH_NAME, XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_PM_FILLHATCHNAME), + DPMAP("FillBackground", XML_NAMESPACE_DRAW, XML_FILL_HATCH_SOLID, XML_TYPE_BOOL, 0), + DPMAP("FillBitmapName", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_NAME, XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_PM_FILLBITMAPNAME), + DPMAP("FillTransparence", XML_NAMESPACE_DRAW, XML_OPACITY, XML_TYPE_NEG_PERCENT16|MID_FLAG_MULTI_PROPERTY, 0), /* exists in SW, too */ + DPMAP("FillTransparenceGradientName", XML_NAMESPACE_DRAW, XML_OPACITY_NAME, XML_TYPE_STYLENAME|MID_FLAG_NO_PROPERTY_IMPORT, CTF_PM_FILLTRANSNAME), + DPMAP("FillBitmapSizeX", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH, XML_SW_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0), + DPMAP("FillBitmapLogicalSize", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_WIDTH, XML_SW_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0), + DPMAP("FillBitmapSizeY", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT, XML_SW_TYPE_FILLBITMAPSIZE|MID_FLAG_MULTI_PROPERTY, 0), + DPMAP("FillBitmapLogicalSize", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_HEIGHT, XML_SW_TYPE_LOGICAL_SIZE|MID_FLAG_MULTI_PROPERTY, 0), + DPMAP("FillBitmapMode", XML_NAMESPACE_STYLE, XML_REPEAT, XML_SW_TYPE_BITMAP_MODE|MID_FLAG_MULTI_PROPERTY, CTF_PM_FILLBITMAPMODE), + DPMAP("FillBitmapPositionOffsetX", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT_X, XML_TYPE_PERCENT, 0), + DPMAP("FillBitmapPositionOffsetY", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT_Y, XML_TYPE_PERCENT, 0), + DPMAP("FillBitmapRectanglePoint", XML_NAMESPACE_DRAW, XML_FILL_IMAGE_REF_POINT, XML_SW_TYPE_BITMAP_REFPOINT, 0), + DPMAP("FillBitmapOffsetX", XML_NAMESPACE_DRAW, XML_TILE_REPEAT_OFFSET, XML_SW_TYPE_BITMAPREPOFFSETX|MID_FLAG_MULTI_PROPERTY, CTF_PM_REPEAT_OFFSET_X), + DPMAP("FillBitmapOffsetY", XML_NAMESPACE_DRAW, XML_TILE_REPEAT_OFFSET, XML_SW_TYPE_BITMAPREPOFFSETY|MID_FLAG_MULTI_PROPERTY, CTF_PM_REPEAT_OFFSET_Y), + + { nullptr, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFSVER_010, false } +}; + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/style/XMLPageExport.cxx b/xmloff/source/style/XMLPageExport.cxx index f3b27b7d88f5..56f7bf7dae22 100644 --- a/xmloff/source/style/XMLPageExport.cxx +++ b/xmloff/source/style/XMLPageExport.cxx @@ -29,9 +29,9 @@ #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <xmloff/families.hxx> #include <xmloff/xmlexp.hxx> -#include "PageMasterPropHdlFactory.hxx" +#include <PageMasterPropHdlFactory.hxx> #include <PageMasterStyleMap.hxx> -#include "PageMasterPropMapper.hxx" +#include <PageMasterPropMapper.hxx> #include "PageMasterExportPropMapper.hxx" using namespace ::com::sun::star; diff --git a/xmloff/source/style/prstylei.cxx b/xmloff/source/style/prstylei.cxx index ce40f755e8c9..c005a38873f4 100644 --- a/xmloff/source/style/prstylei.cxx +++ b/xmloff/source/style/prstylei.cxx @@ -537,7 +537,8 @@ bool XMLPropStyleContext::doNewDrawingLayerFillStyleDefinitionsExist( { if(!maProperties.empty() && rFillStyleTag.getLength()) { - const rtl::Reference< XMLPropertySetMapper >& rMapper = GetStyles()->GetImportPropertyMapper(GetFamily())->getPropertySetMapper(); + // no & to avoid non-obvious UAF due to the 2nd temp Reference + const rtl::Reference<XMLPropertySetMapper> rMapper = GetStyles()->GetImportPropertyMapper(GetFamily())->getPropertySetMapper(); if(rMapper.is()) { diff --git a/xmloff/source/style/xmlstyle.cxx b/xmloff/source/style/xmlstyle.cxx index 2c4fe5f01912..d020280cb173 100644 --- a/xmloff/source/style/xmlstyle.cxx +++ b/xmloff/source/style/xmlstyle.cxx @@ -25,7 +25,7 @@ #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/style/XAutoStylesSupplier.hpp> #include <com/sun/star/style/XAutoStyleFamily.hpp> -#include "PageMasterPropMapper.hxx" +#include <PageMasterPropMapper.hxx> #include <sal/log.hxx> #include <svl/style.hxx> #include <xmloff/nmspmap.hxx> |