Skip to content

Commit 93a8683

Browse files
committedFeb 3, 2015
Fix common memory leak after using QgsSymbolLayerV2Utils::loadSymbol
1 parent 005e158 commit 93a8683

12 files changed

+56
-16
lines changed
 

‎python/core/symbology-ng/qgssymbollayerv2utils.sip

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,20 @@ class QgsSymbolLayerV2Utils
7575
/**Returns the maximum estimated bleed for the symbol */
7676
static double estimateMaxSymbolBleed( QgsSymbolV2* symbol );
7777

78-
static QgsSymbolV2* loadSymbol( QDomElement& element ) /Factory/;
78+
/**Attempts to load a symbol from a DOM element
79+
* @param element DOM element representing symbol
80+
* @returns decoded symbol, if possible
81+
*/
82+
static QgsSymbolV2* loadSymbol( const QDomElement& element ) /Factory/;
83+
84+
/**Attempts to load a symbol from a DOM element and cast it to a particular symbol
85+
* type.
86+
* @param element DOM element representing symbol
87+
* @returns decoded symbol cast to specified type, if possible
88+
* @note not available in python bindings
89+
*/
90+
//template <class SymbolType> static SymbolType* loadSymbol( const QDomElement& element );
91+
7992
static QgsSymbolLayerV2* loadSymbolLayer( QDomElement& element ) /Factory/;
8093
static QDomElement saveSymbol( QString symbolName, QgsSymbolV2* symbol, QDomDocument& doc );
8194

‎src/app/qgsdecorationgrid.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ void QgsDecorationGrid::projectRead()
135135
{
136136
doc.setContent( xml );
137137
elem = doc.documentElement();
138-
mLineSymbol = dynamic_cast<QgsLineSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( elem ) );
138+
mLineSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsLineSymbolV2>( elem );
139139
}
140140
if ( ! mLineSymbol )
141141
mLineSymbol = new QgsLineSymbolV2();
@@ -147,7 +147,7 @@ void QgsDecorationGrid::projectRead()
147147
{
148148
doc.setContent( xml );
149149
elem = doc.documentElement();
150-
mMarkerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( elem ) );
150+
mMarkerSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsMarkerSymbolV2>( elem );
151151
}
152152
if ( ! mMarkerSymbol )
153153
{

‎src/core/composer/qgscomposerarrow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ bool QgsComposerArrow::readXML( const QDomElement& itemElem, const QDomDocument&
523523
if ( !lineStyleElem.isNull() )
524524
{
525525
delete mLineSymbol;
526-
mLineSymbol = dynamic_cast<QgsLineSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( lineStyleElem ) );
526+
mLineSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsLineSymbolV2>( lineStyleElem );
527527
}
528528
}
529529
else

‎src/core/composer/qgscomposermap.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,7 +1454,7 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
14541454
}
14551455
else
14561456
{
1457-
lineSymbol = dynamic_cast<QgsLineSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( gridSymbolElem ) );
1457+
lineSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsLineSymbolV2>( gridSymbolElem );
14581458
}
14591459
mapGrid->setLineSymbol( lineSymbol );
14601460

@@ -1499,7 +1499,7 @@ bool QgsComposerMap::readXML( const QDomElement& itemElem, const QDomDocument& d
14991499
QDomElement overviewFrameSymbolElem = overviewFrameElem.firstChildElement( "symbol" );
15001500
if ( !overviewFrameSymbolElem.isNull() )
15011501
{
1502-
fillSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( overviewFrameSymbolElem ) );
1502+
fillSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsFillSymbolV2>( overviewFrameSymbolElem );
15031503
mapOverview->setFrameSymbol( fillSymbol );
15041504
}
15051505
mOverviewStack->addOverview( mapOverview );

‎src/core/composer/qgscomposermapgrid.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ bool QgsComposerMapGrid::readXML( const QDomElement& itemElem, const QDomDocumen
348348
if ( !symbolElem.isNull() )
349349
{
350350
delete mGridLineSymbol;
351-
mGridLineSymbol = dynamic_cast<QgsLineSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( symbolElem ) );
351+
mGridLineSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsLineSymbolV2>( symbolElem );
352352
}
353353
}
354354
else
@@ -368,7 +368,7 @@ bool QgsComposerMapGrid::readXML( const QDomElement& itemElem, const QDomDocumen
368368
if ( !symbolElem.isNull() )
369369
{
370370
delete mGridMarkerSymbol;
371-
mGridMarkerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( symbolElem ) );
371+
mGridMarkerSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsMarkerSymbolV2>( symbolElem );
372372
}
373373
}
374374

‎src/core/composer/qgscomposermapoverview.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ bool QgsComposerMapOverview::readXML( const QDomElement &itemElem, const QDomDoc
183183
if ( !frameStyleElem.isNull() )
184184
{
185185
delete mFrameSymbol;
186-
mFrameSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( frameStyleElem ) );
186+
mFrameSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsFillSymbolV2>( frameStyleElem );
187187
}
188188
return ok;
189189
}

‎src/core/composer/qgscomposershape.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ bool QgsComposerShape::readXML( const QDomElement& itemElem, const QDomDocument&
315315
if ( !shapeStyleSymbolElem.isNull() )
316316
{
317317
delete mShapeStyleSymbol;
318-
mShapeStyleSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( shapeStyleSymbolElem ) );
318+
mShapeStyleSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsFillSymbolV2>( shapeStyleSymbolElem );
319319
}
320320
else
321321
{

‎src/core/composer/qgscomposition.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ bool QgsComposition::readXML( const QDomElement& compositionElem, const QDomDocu
867867
if ( !pageStyleSymbolElem.isNull() )
868868
{
869869
delete mPageStyleSymbol;
870-
mPageStyleSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( pageStyleSymbolElem ) );
870+
mPageStyleSymbol = QgsSymbolLayerV2Utils::loadSymbol<QgsFillSymbolV2>( pageStyleSymbolElem );
871871
}
872872

873873
if ( widthConversionOk && heightConversionOk )

‎src/core/symbology-ng/qgspointdisplacementrenderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ QgsFeatureRendererV2* QgsPointDisplacementRenderer::create( QDomElement& symbolo
350350
QDomElement centerSymbolElem = symbologyElem.firstChildElement( "symbol" );
351351
if ( !centerSymbolElem.isNull() )
352352
{
353-
r->setCenterSymbol( dynamic_cast<QgsMarkerSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( centerSymbolElem ) ) );
353+
r->setCenterSymbol( QgsSymbolLayerV2Utils::loadSymbol<QgsMarkerSymbolV2>( centerSymbolElem ) );
354354
}
355355
return r;
356356
}

‎src/core/symbology-ng/qgssymbollayerv2utils.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,7 @@ QList<QPolygonF> offsetLine( QPolygonF polyline, double dist )
852852
/////
853853

854854

855-
QgsSymbolV2* QgsSymbolLayerV2Utils::loadSymbol( QDomElement& element )
855+
QgsSymbolV2* QgsSymbolLayerV2Utils::loadSymbol( const QDomElement &element )
856856
{
857857
QgsSymbolLayerV2List layers;
858858
QDomNode layerNode = element.firstChild();
@@ -3745,4 +3745,3 @@ QString QgsSymbolLayerV2Utils::fieldOrExpressionFromExpression( QgsExpression* e
37453745
return expression->expression();
37463746
}
37473747

3748-

‎src/core/symbology-ng/qgssymbollayerv2utils.h

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,35 @@ class CORE_EXPORT QgsSymbolLayerV2Utils
115115
/**Returns the maximum estimated bleed for the symbol */
116116
static double estimateMaxSymbolBleed( QgsSymbolV2* symbol );
117117

118-
static QgsSymbolV2* loadSymbol( QDomElement& element );
118+
/**Attempts to load a symbol from a DOM element
119+
* @param element DOM element representing symbol
120+
* @returns decoded symbol, if possible
121+
*/
122+
static QgsSymbolV2* loadSymbol( const QDomElement& element );
123+
124+
/**Attempts to load a symbol from a DOM element and cast it to a particular symbol
125+
* type.
126+
* @param element DOM element representing symbol
127+
* @returns decoded symbol cast to specified type, if possible
128+
* @note not available in python bindings
129+
*/
130+
template <class SymbolType> static SymbolType* loadSymbol( const QDomElement& element )
131+
{
132+
QgsSymbolV2* tmpSymbol = QgsSymbolLayerV2Utils::loadSymbol( element );
133+
SymbolType* symbolCastToType = dynamic_cast<SymbolType*>( tmpSymbol );
134+
135+
if ( symbolCastToType )
136+
{
137+
return symbolCastToType;
138+
}
139+
else
140+
{
141+
//could not cast
142+
delete tmpSymbol;
143+
return NULL;
144+
}
145+
}
146+
119147
static QgsSymbolLayerV2* loadSymbolLayer( QDomElement& element );
120148
static QDomElement saveSymbol( QString symbolName, QgsSymbolV2* symbol, QDomDocument& doc );
121149

‎src/gui/qgsannotationitem.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ void QgsAnnotationItem::_readXML( const QDomDocument& doc, const QDomElement& an
443443
QDomElement symbolElem = annotationElem.firstChildElement( "symbol" );
444444
if ( !symbolElem.isNull() )
445445
{
446-
QgsMarkerSymbolV2* symbol = dynamic_cast<QgsMarkerSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( symbolElem ) );
446+
QgsMarkerSymbolV2* symbol = QgsSymbolLayerV2Utils::loadSymbol<QgsMarkerSymbolV2>( symbolElem );
447447
if ( symbol )
448448
{
449449
delete mMarkerSymbol;

0 commit comments

Comments
 (0)
Please sign in to comment.