include/xmloff/txtparae.hxx | 5 +- sw/source/filter/xml/xmltexte.cxx | 67 ++++++++++---------------------------- xmloff/source/text/txtflde.cxx | 2 - xmloff/source/text/txtparae.cxx | 26 +++----------- 4 files changed, 30 insertions(+), 70 deletions(-)
New commits: commit a25385e0d8027d7257ab95a4b787404dfca59913 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Thu May 20 10:08:30 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu May 20 10:47:35 2021 +0200 simplify some XMLPropertyState memory management which fixes a leak if some of the code throws an exception Change-Id: Ic89060e7951060458ffe7ee5b6fe51cd076ef19b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115830 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/xmloff/txtparae.hxx b/include/xmloff/txtparae.hxx index 2495f0f504d0..3a7ca544d358 100644 --- a/include/xmloff/txtparae.hxx +++ b/include/xmloff/txtparae.hxx @@ -29,6 +29,7 @@ #include <xmloff/xmltoken.hxx> #include <xmloff/SinglePropertySetInfoCache.hxx> #include <xmloff/XMLTextListAutoStylePool.hxx> +#include <o3tl/span.hxx> #include <memory> #include <vector> @@ -385,14 +386,14 @@ public: void Add( XmlStyleFamily nFamily, const css::uno::Reference< css::beans::XPropertySet > & rPropSet, - const XMLPropertyState** pAddState = nullptr, bool bDontSeek = false ); + const o3tl::span<XMLPropertyState> aAddStates = {}, bool bDontSeek = false ); /// find style name for specified family and parent OUString Find( XmlStyleFamily nFamily, const css::uno::Reference< css::beans::XPropertySet > & rPropSet, const OUString& rParent, - const XMLPropertyState** pAddState = nullptr ) const; + const o3tl::span<XMLPropertyState> aAddStates = {} ) const; static SvXMLExportPropertyMapper *CreateShapeExtPropMapper( SvXMLExport& rExport ); diff --git a/sw/source/filter/xml/xmltexte.cxx b/sw/source/filter/xml/xmltexte.cxx index c883f4f5528a..b9e3ac9fa03d 100644 --- a/sw/source/filter/xml/xmltexte.cxx +++ b/sw/source/filter/xml/xmltexte.cxx @@ -115,19 +115,17 @@ static void lcl_addURL ( SvXMLExport &rExport, const OUString &rURL, static void lcl_addAspect( const svt::EmbeddedObjectRef& rObj, - const XMLPropertyState **pStates, + std::vector<XMLPropertyState>& rStates, const rtl::Reference < XMLPropertySetMapper >& rMapper ) { sal_Int64 nAspect = rObj.GetViewAspect(); if ( nAspect ) - { - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_DRAW_ASPECT ), uno::makeAny( nAspect ) ); - } + rStates.emplace_back( rMapper->FindEntryIndex( CTF_OLE_DRAW_ASPECT ), uno::makeAny( nAspect ) ); } static void lcl_addOutplaceProperties( const svt::EmbeddedObjectRef& rObj, - const XMLPropertyState **pStates, + std::vector<XMLPropertyState>& rStates, const rtl::Reference < XMLPropertySetMapper >& rMapper ) { MapMode aMode( MapUnit::Map100thMM ); // the API expects this map mode for the embedded objects @@ -136,21 +134,15 @@ static void lcl_addOutplaceProperties( if( !(aSize.Width() && aSize.Height()) ) return; - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_LEFT ), Any(sal_Int32(0)) ); - pStates++; - - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_TOP ), Any(sal_Int32(0)) ); - pStates++; - - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_WIDTH ), Any(static_cast<sal_Int32>(aSize.Width())) ); - pStates++; - - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_HEIGHT ), Any(static_cast<sal_Int32>(aSize.Height())) ); + rStates.emplace_back( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_LEFT ), Any(sal_Int32(0)) ); + rStates.emplace_back( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_TOP ), Any(sal_Int32(0)) ); + rStates.emplace_back( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_WIDTH ), Any(static_cast<sal_Int32>(aSize.Width())) ); + rStates.emplace_back( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_HEIGHT ), Any(static_cast<sal_Int32>(aSize.Height())) ); } static void lcl_addFrameProperties( const uno::Reference < embed::XEmbeddedObject >& xObj, - const XMLPropertyState **pStates, + std::vector<XMLPropertyState>& rStates, const rtl::Reference < XMLPropertySetMapper >& rMapper ) { if ( !::svt::EmbeddedObjectRef::TryRunningState( xObj ) ) @@ -185,24 +177,13 @@ static void lcl_addFrameProperties( aAny >>= nHeight; if( !bIsAutoScroll ) - { - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_FRAME_DISPLAY_SCROLLBAR ), makeAny(bIsScrollingMode) ); - pStates++; - } + rStates.emplace_back( rMapper->FindEntryIndex( CTF_FRAME_DISPLAY_SCROLLBAR ), makeAny(bIsScrollingMode) ); if( !bIsAutoBorder ) - { - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_FRAME_DISPLAY_BORDER ), makeAny(bIsBorderSet) ); - pStates++; - } + rStates.emplace_back( rMapper->FindEntryIndex( CTF_FRAME_DISPLAY_BORDER ), makeAny(bIsBorderSet) ); if( SIZE_NOT_SET != nWidth ) - { - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_FRAME_MARGIN_HORI ), Any(nWidth) ); - pStates++; - } + rStates.emplace_back( rMapper->FindEntryIndex( CTF_FRAME_MARGIN_HORI ), Any(nWidth) ); if( SIZE_NOT_SET != nHeight ) - { - *pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_FRAME_MARGIN_VERT ), Any(nHeight) ); - } + rStates.emplace_back( rMapper->FindEntryIndex( CTF_FRAME_MARGIN_VERT ), Any(nHeight) ); } void SwXMLTextParagraphExport::_collectTextEmbeddedAutoStyles( @@ -213,7 +194,8 @@ void SwXMLTextParagraphExport::_collectTextEmbeddedAutoStyles( if( !rObjRef.is() ) return; - const XMLPropertyState *aStates[8] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; + std::vector<XMLPropertyState> aStates; + aStates.reserve(8); SvGlobalName aClassId( rObjRef->getClassID() ); if( aIFrameClassId == aClassId ) @@ -230,14 +212,7 @@ void SwXMLTextParagraphExport::_collectTextEmbeddedAutoStyles( lcl_addAspect( rObjRef, aStates, GetAutoFramePropMapper()->getPropertySetMapper() ); - Add( XmlStyleFamily::TEXT_FRAME, rPropSet, aStates ); - - const XMLPropertyState **pStates = aStates; - while( *pStates ) - { - delete *pStates; - pStates++; - } + Add( XmlStyleFamily::TEXT_FRAME, rPropSet, { aStates.data(), aStates.size() } ); } void SwXMLTextParagraphExport::_exportTextEmbedded( @@ -282,7 +257,8 @@ void SwXMLTextParagraphExport::_exportTextEmbedded( aAny >>= sStyle; } - const XMLPropertyState *aStates[8] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; + std::vector<XMLPropertyState> aStates; + aStates.reserve(8); switch( nType ) { case SV_EMBEDDED_FRAME: @@ -301,13 +277,8 @@ void SwXMLTextParagraphExport::_exportTextEmbedded( GetAutoFramePropMapper()->getPropertySetMapper() ); const OUString sAutoStyle = Find( XmlStyleFamily::TEXT_FRAME, - rPropSet, sStyle, aStates ); - const XMLPropertyState **pStates = aStates; - while( *pStates ) - { - delete *pStates; - pStates++; - } + rPropSet, sStyle, { aStates.data(), aStates.size() } ); + aStates.clear(); if( !sAutoStyle.isEmpty() ) rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE_NAME, sAutoStyle ); diff --git a/xmloff/source/text/txtflde.cxx b/xmloff/source/text/txtflde.cxx index 111df2f0a7bf..962e30e995d4 100644 --- a/xmloff/source/text/txtflde.cxx +++ b/xmloff/source/text/txtflde.cxx @@ -896,7 +896,7 @@ void XMLTextFieldExport::ExportFieldAutoStyle( // export text style with the addition of the combined characters DBG_ASSERT(nullptr != pCombinedCharactersPropertyState, "need proper PropertyState for combined characters"); - const XMLPropertyState *aStates[] = { pCombinedCharactersPropertyState.get(), nullptr }; + o3tl::span<XMLPropertyState> aStates( pCombinedCharactersPropertyState.get(), 1 ); GetExport().GetTextParagraphExport()->Add( XmlStyleFamily::TEXT_TEXT, xRangePropSet, aStates); diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx index b5c5de5b9133..cd715f15e599 100644 --- a/xmloff/source/text/txtparae.cxx +++ b/xmloff/source/text/txtparae.cxx @@ -510,7 +510,7 @@ void FieldParamExporter::ExportParameter(const OUString& sKey, const OUString& s void XMLTextParagraphExport::Add( XmlStyleFamily nFamily, const Reference < XPropertySet > & rPropSet, - const XMLPropertyState** ppAddStates, bool bDontSeek ) + const o3tl::span<XMLPropertyState> aAddStates, bool bDontSeek ) { rtl::Reference < SvXMLExportPropertyMapper > xPropMapper; switch( nFamily ) @@ -537,14 +537,8 @@ void XMLTextParagraphExport::Add( XmlStyleFamily nFamily, vector< XMLPropertyState > aPropStates = xPropMapper->Filter(GetExport(), rPropSet); - if( ppAddStates ) - { - while( *ppAddStates ) - { - aPropStates.push_back( **ppAddStates ); - ppAddStates++; - } - } + for (const XMLPropertyState& rState : aAddStates) + aPropStates.push_back( rState ); if( aPropStates.empty() ) return; @@ -741,7 +735,7 @@ OUString XMLTextParagraphExport::Find( XmlStyleFamily nFamily, const Reference < XPropertySet > & rPropSet, const OUString& rParent, - const XMLPropertyState** ppAddStates) const + const o3tl::span<XMLPropertyState> aAddStates) const { OUString sName( rParent ); rtl::Reference < SvXMLExportPropertyMapper > xPropMapper; @@ -765,14 +759,8 @@ OUString XMLTextParagraphExport::Find( if( !xPropMapper.is() ) return sName; vector<XMLPropertyState> aPropStates(xPropMapper->Filter(GetExport(), rPropSet)); - if( ppAddStates ) - { - while( *ppAddStates ) - { - aPropStates.push_back( **ppAddStates ); - ++ppAddStates; - } - } + for (const XMLPropertyState& rState : aAddStates) + aPropStates.push_back( rState ); if( std::any_of( aPropStates.begin(), aPropStates.end(), lcl_validPropState ) ) sName = GetAutoStylePool().Find( nFamily, sName, aPropStates ); @@ -1438,7 +1426,7 @@ void XMLTextParagraphExport::collectTextAutoStylesOptimized( bool bIsProgress ) aAny = xAutoStylesEnum->nextElement(); Reference< XAutoStyle > xAutoStyle = *o3tl::doAccess<Reference<XAutoStyle>>(aAny); Reference < XPropertySet > xPSet( xAutoStyle, uno::UNO_QUERY ); - Add( nFamily, xPSet, nullptr, true ); + Add( nFamily, xPSet, {}, true ); } }; collectFamily("CharacterStyles", XmlStyleFamily::TEXT_TEXT); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits