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.grandin@collabora.co.uk>
This commit is contained in:
@@ -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 );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user