Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix common memory leak after using QgsSymbolLayerV2Utils::loadSymbol
  • Loading branch information
nyalldawson committed Feb 3, 2015
1 parent 005e158 commit 93a8683
Show file tree
Hide file tree
Showing 12 changed files with 56 additions and 16 deletions.
15 changes: 14 additions & 1 deletion python/core/symbology-ng/qgssymbollayerv2utils.sip
Expand Up @@ -75,7 +75,20 @@ class QgsSymbolLayerV2Utils
/**Returns the maximum estimated bleed for the symbol */
static double estimateMaxSymbolBleed( QgsSymbolV2* symbol );

static QgsSymbolV2* loadSymbol( QDomElement& element ) /Factory/;
/**Attempts to load a symbol from a DOM element
* @param element DOM element representing symbol
* @returns decoded symbol, if possible
*/
static QgsSymbolV2* loadSymbol( const QDomElement& element ) /Factory/;

/**Attempts to load a symbol from a DOM element and cast it to a particular symbol
* type.
* @param element DOM element representing symbol
* @returns decoded symbol cast to specified type, if possible
* @note not available in python bindings
*/
//template <class SymbolType> static SymbolType* loadSymbol( const QDomElement& element );

static QgsSymbolLayerV2* loadSymbolLayer( QDomElement& element ) /Factory/;
static QDomElement saveSymbol( QString symbolName, QgsSymbolV2* symbol, QDomDocument& doc );

Expand Down
4 changes: 2 additions & 2 deletions src/app/qgsdecorationgrid.cpp
Expand Up @@ -135,7 +135,7 @@ void QgsDecorationGrid::projectRead()
{
doc.setContent( xml );
elem = doc.documentElement();
mLineSymbol = dynamic_cast<QgsLineSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( elem ) );
mLineSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsLineSymbolV2>( elem );
}
if ( ! mLineSymbol )
mLineSymbol = new QgsLineSymbolV2();
Expand All @@ -147,7 +147,7 @@ void QgsDecorationGrid::projectRead()
{
doc.setContent( xml );
elem = doc.documentElement();
mMarkerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( elem ) );
mMarkerSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsMarkerSymbolV2>( elem );
}
if ( ! mMarkerSymbol )
{
Expand Down
2 changes: 1 addition & 1 deletion src/core/composer/qgscomposerarrow.cpp
Expand Up @@ -523,7 +523,7 @@ bool QgsComposerArrow::readXML( const QDomElement& itemElem, const QDomDocument&
if ( !lineStyleElem.isNull() )
{
delete mLineSymbol;
mLineSymbol = dynamic_cast<QgsLineSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( lineStyleElem ) );
mLineSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsLineSymbolV2>( lineStyleElem );
}
}
else
Expand Down
4 changes: 2 additions & 2 deletions src/core/composer/qgscomposermap.cpp
Expand Up @@ -1454,7 +1454,7 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
}
else
{
lineSymbol = dynamic_cast<QgsLineSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( gridSymbolElem ) );
lineSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsLineSymbolV2>( gridSymbolElem );
}
mapGrid->setLineSymbol( lineSymbol );

Expand Down Expand Up @@ -1499,7 +1499,7 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
QDomElement overviewFrameSymbolElem = overviewFrameElem.firstChildElement( "symbol" );
if ( !overviewFrameSymbolElem.isNull() )
{
fillSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( overviewFrameSymbolElem ) );
fillSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsFillSymbolV2>( overviewFrameSymbolElem );
mapOverview->setFrameSymbol( fillSymbol );
}
mOverviewStack->addOverview( mapOverview );
Expand Down
4 changes: 2 additions & 2 deletions src/core/composer/qgscomposermapgrid.cpp
Expand Up @@ -348,7 +348,7 @@ bool QgsComposerMapGrid::readXML( const QDomElement& itemElem, const QDomDocumen
if ( !symbolElem.isNull() )
{
delete mGridLineSymbol;
mGridLineSymbol = dynamic_cast<QgsLineSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( symbolElem ) );
mGridLineSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsLineSymbolV2>( symbolElem );
}
}
else
Expand All @@ -368,7 +368,7 @@ bool QgsComposerMapGrid::readXML( const QDomElement& itemElem, const QDomDocumen
if ( !symbolElem.isNull() )
{
delete mGridMarkerSymbol;
mGridMarkerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( symbolElem ) );
mGridMarkerSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsMarkerSymbolV2>( symbolElem );
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/core/composer/qgscomposermapoverview.cpp
Expand Up @@ -183,7 +183,7 @@ bool QgsComposerMapOverview::readXML( const QDomElement &itemElem, const QDomDoc
if ( !frameStyleElem.isNull() )
{
delete mFrameSymbol;
mFrameSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( frameStyleElem ) );
mFrameSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsFillSymbolV2>( frameStyleElem );
}
return ok;
}
Expand Down
2 changes: 1 addition & 1 deletion src/core/composer/qgscomposershape.cpp
Expand Up @@ -315,7 +315,7 @@ bool QgsComposerShape::readXML( const QDomElement& itemElem, const QDomDocument&
if ( !shapeStyleSymbolElem.isNull() )
{
delete mShapeStyleSymbol;
mShapeStyleSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( shapeStyleSymbolElem ) );
mShapeStyleSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsFillSymbolV2>( shapeStyleSymbolElem );
}
else
{
Expand Down
2 changes: 1 addition & 1 deletion src/core/composer/qgscomposition.cpp
Expand Up @@ -867,7 +867,7 @@ bool QgsComposition::readXML( const QDomElement& compositionElem, const QDomDocu
if ( !pageStyleSymbolElem.isNull() )
{
delete mPageStyleSymbol;
mPageStyleSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( pageStyleSymbolElem ) );
mPageStyleSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsFillSymbolV2>( pageStyleSymbolElem );
}

if ( widthConversionOk && heightConversionOk )
Expand Down
2 changes: 1 addition & 1 deletion src/core/symbology-ng/qgspointdisplacementrenderer.cpp
Expand Up @@ -350,7 +350,7 @@ QgsFeatureRendererV2* QgsPointDisplacementRenderer::create( QDomElement& symbolo
QDomElement centerSymbolElem = symbologyElem.firstChildElement( "symbol" );
if ( !centerSymbolElem.isNull() )
{
r->setCenterSymbol( dynamic_cast<QgsMarkerSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( centerSymbolElem ) ) );
r->setCenterSymbol( QgsSymbolLayerV2Utils::loadSymbol<QgsMarkerSymbolV2>( centerSymbolElem ) );
}
return r;
}
Expand Down
3 changes: 1 addition & 2 deletions src/core/symbology-ng/qgssymbollayerv2utils.cpp
Expand Up @@ -852,7 +852,7 @@ QList<QPolygonF> offsetLine( QPolygonF polyline, double dist )
/////


QgsSymbolV2* QgsSymbolLayerV2Utils::loadSymbol( QDomElement& element )
QgsSymbolV2* QgsSymbolLayerV2Utils::loadSymbol( const QDomElement &element )
{
QgsSymbolLayerV2List layers;
QDomNode layerNode = element.firstChild();
Expand Down Expand Up @@ -3745,4 +3745,3 @@ QString QgsSymbolLayerV2Utils::fieldOrExpressionFromExpression( QgsExpression* e
return expression->expression();
}


30 changes: 29 additions & 1 deletion src/core/symbology-ng/qgssymbollayerv2utils.h
Expand Up @@ -115,7 +115,35 @@ class CORE_EXPORT QgsSymbolLayerV2Utils
/**Returns the maximum estimated bleed for the symbol */
static double estimateMaxSymbolBleed( QgsSymbolV2* symbol );

static QgsSymbolV2* loadSymbol( QDomElement& element );
/**Attempts to load a symbol from a DOM element
* @param element DOM element representing symbol
* @returns decoded symbol, if possible
*/
static QgsSymbolV2* loadSymbol( const QDomElement& element );

/**Attempts to load a symbol from a DOM element and cast it to a particular symbol
* type.
* @param element DOM element representing symbol
* @returns decoded symbol cast to specified type, if possible
* @note not available in python bindings
*/
template <class SymbolType> static SymbolType* loadSymbol( const QDomElement& element )
{
QgsSymbolV2* tmpSymbol = QgsSymbolLayerV2Utils::loadSymbol( element );
SymbolType* symbolCastToType = dynamic_cast<SymbolType*>( tmpSymbol );

if ( symbolCastToType )
{
return symbolCastToType;
}
else
{
//could not cast
delete tmpSymbol;
return NULL;
}
}

static QgsSymbolLayerV2* loadSymbolLayer( QDomElement& element );
static QDomElement saveSymbol( QString symbolName, QgsSymbolV2* symbol, QDomDocument& doc );

Expand Down
2 changes: 1 addition & 1 deletion src/gui/qgsannotationitem.cpp
Expand Up @@ -443,7 +443,7 @@ void QgsAnnotationItem::_readXML( const QDomDocument& doc, const QDomElement& an
QDomElement symbolElem = annotationElem.firstChildElement( "symbol" );
if ( !symbolElem.isNull() )
{
QgsMarkerSymbolV2* symbol = dynamic_cast<QgsMarkerSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( symbolElem ) );
QgsMarkerSymbolV2* symbol = QgsSymbolLayerV2Utils::loadSymbol<QgsMarkerSymbolV2>( symbolElem );
if ( symbol )
{
delete mMarkerSymbol;
Expand Down

0 comments on commit 93a8683

Please sign in to comment.