@@ -1239,7 +1239,6 @@ QDomDocument QgsWMSServer::describeLayer()
1239
1239
QByteArray* QgsWMSServer::getPrint ( const QString& formatString )
1240
1240
{
1241
1241
QStringList layersList, stylesList, layerIdList;
1242
- QString dummyFormat;
1243
1242
QImage* theImage = initializeRendering ( layersList, stylesList, layerIdList );
1244
1243
if ( !theImage )
1245
1244
{
@@ -1257,18 +1256,21 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
1257
1256
}
1258
1257
#endif
1259
1258
1260
- QHash<QgsMapLayer*, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList );
1259
+ // scoped pointer to restore all original layer filters (subsetStrings) when pointer goes out of scope
1260
+ // there's LOTS of potential exit paths here, so we avoid having to restore the filters manually
1261
+ QScopedPointer< QgsOWSServerFilterRestorer > filterRestorer ( new QgsOWSServerFilterRestorer () );
1262
+
1263
+ applyRequestedLayerFilters ( layersList, filterRestorer->originalFilters () );
1261
1264
1262
1265
#ifdef HAVE_SERVER_PYTHON_PLUGINS
1263
- applyAccessControlLayersFilters ( layersList, originalLayerFilters );
1266
+ applyAccessControlLayersFilters ( layersList, filterRestorer-> originalFilters () );
1264
1267
#endif
1265
1268
1266
1269
QStringList selectedLayerIdList = applyFeatureSelections ( layersList );
1267
1270
1268
1271
// GetPrint request needs a template parameter
1269
1272
if ( !mParameters .contains ( " TEMPLATE" ) )
1270
1273
{
1271
- restoreLayerFilters ( originalLayerFilters );
1272
1274
clearFeatureSelections ( selectedLayerIdList );
1273
1275
throw QgsMapServiceException ( " ParameterMissing" , " The TEMPLATE parameter is required for the GetPrint request" );
1274
1276
}
@@ -1284,7 +1286,6 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
1284
1286
QgsComposition* c = mConfigParser ->createPrintComposition ( mParameters [ " TEMPLATE" ], mMapRenderer , QMap<QString, QString>( mParameters ) );
1285
1287
if ( !c )
1286
1288
{
1287
- restoreLayerFilters ( originalLayerFilters );
1288
1289
clearFeatureSelections ( selectedLayerIdList );
1289
1290
return nullptr ;
1290
1291
}
@@ -1333,7 +1334,6 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
1333
1334
if ( !tempFile.open () )
1334
1335
{
1335
1336
delete c;
1336
- restoreLayerFilters ( originalLayerFilters );
1337
1337
clearFeatureSelections ( selectedLayerIdList );
1338
1338
return nullptr ;
1339
1339
}
@@ -1344,13 +1344,11 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
1344
1344
}
1345
1345
else // unknown format
1346
1346
{
1347
- restoreLayerFilters ( originalLayerFilters );
1348
1347
clearFeatureSelections ( selectedLayerIdList );
1349
1348
throw QgsMapServiceException ( " InvalidFormat" , " Output format '" + formatString + " ' is not supported in the GetPrint request" );
1350
1349
}
1351
1350
1352
1351
restoreOpacities ( bkVectorRenderers, bkRasterRenderers, labelTransparencies, labelBufferTransparencies );
1353
- restoreLayerFilters ( originalLayerFilters );
1354
1352
clearFeatureSelections ( selectedLayerIdList );
1355
1353
1356
1354
delete c;
@@ -1397,10 +1395,14 @@ QImage* QgsWMSServer::getMap( HitTest* hitTest )
1397
1395
}
1398
1396
#endif
1399
1397
1400
- QHash<QgsMapLayer*, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList );
1398
+ // scoped pointer to restore all original layer filters (subsetStrings) when pointer goes out of scope
1399
+ // there's LOTS of potential exit paths here, so we avoid having to restore the filters manually
1400
+ QScopedPointer< QgsOWSServerFilterRestorer > filterRestorer ( new QgsOWSServerFilterRestorer () );
1401
+
1402
+ applyRequestedLayerFilters ( layersList, filterRestorer->originalFilters () );
1401
1403
1402
1404
#ifdef HAVE_SERVER_PYTHON_PLUGINS
1403
- applyAccessControlLayersFilters ( layersList, originalLayerFilters );
1405
+ applyAccessControlLayersFilters ( layersList, filterRestorer-> originalFilters () );
1404
1406
#endif
1405
1407
1406
1408
QStringList selectedLayerIdList = applyFeatureSelections ( layersList );
@@ -1426,7 +1428,6 @@ QImage* QgsWMSServer::getMap( HitTest* hitTest )
1426
1428
}
1427
1429
1428
1430
restoreOpacities ( bkVectorRenderers, bkRasterRenderers, labelTransparencies, labelBufferTransparencies );
1429
- restoreLayerFilters ( originalLayerFilters );
1430
1431
clearFeatureSelections ( selectedLayerIdList );
1431
1432
1432
1433
// QgsMessageLog::logMessage( "clearing filters" );
@@ -1625,10 +1626,15 @@ int QgsWMSServer::getFeatureInfo( QDomDocument& result, const QString& version )
1625
1626
}
1626
1627
1627
1628
// get the layer registered in QgsMapLayerRegistry and apply possible filters
1628
- QStringList layerIds = layerSet ( layersList, stylesList, mMapRenderer ->destinationCrs () );
1629
- QHash<QgsMapLayer*, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList );
1629
+ ( void )layerSet ( layersList, stylesList, mMapRenderer ->destinationCrs () );
1630
+
1631
+ // scoped pointer to restore all original layer filters (subsetStrings) when pointer goes out of scope
1632
+ // there's LOTS of potential exit paths here, so we avoid having to restore the filters manually
1633
+ QScopedPointer< QgsOWSServerFilterRestorer > filterRestorer ( new QgsOWSServerFilterRestorer () );
1634
+ applyRequestedLayerFilters ( layersList, filterRestorer->originalFilters () );
1635
+
1630
1636
#ifdef HAVE_SERVER_PYTHON_PLUGINS
1631
- applyAccessControlLayersFilters ( layersList, originalLayerFilters );
1637
+ applyAccessControlLayersFilters ( layersList, filterRestorer-> originalFilters () );
1632
1638
#endif
1633
1639
1634
1640
QDomElement getFeatureInfoElement;
@@ -1710,7 +1716,6 @@ int QgsWMSServer::getFeatureInfo( QDomDocument& result, const QString& version )
1710
1716
#ifdef HAVE_SERVER_PYTHON_PLUGINS
1711
1717
if ( !mAccessControl ->layerReadPermission ( currentLayer ) )
1712
1718
{
1713
- restoreLayerFilters ( originalLayerFilters );
1714
1719
throw QgsMapServiceException ( " Security" , " You are not allowed to access to the layer: " + currentLayer->name () );
1715
1720
}
1716
1721
#endif
@@ -1831,7 +1836,9 @@ int QgsWMSServer::getFeatureInfo( QDomDocument& result, const QString& version )
1831
1836
convertFeatureInfoToSIA2045 ( result );
1832
1837
}
1833
1838
1834
- restoreLayerFilters ( originalLayerFilters );
1839
+ // force restoration of original filters
1840
+ filterRestorer.reset ();
1841
+
1835
1842
QgsMapLayerRegistry::instance ()->removeAllMapLayers ();
1836
1843
delete featuresRect;
1837
1844
return 0 ;
@@ -2495,13 +2502,11 @@ QStringList QgsWMSServer::layerSet( const QStringList &layersList,
2495
2502
}
2496
2503
2497
2504
2498
- QHash<QgsMapLayer*, QString> QgsWMSServer::applyRequestedLayerFilters ( const QStringList& layerList ) const
2505
+ void QgsWMSServer::applyRequestedLayerFilters ( const QStringList& layerList , QHash<QgsMapLayer*, QString>& originalFilters ) const
2499
2506
{
2500
- QHash<QgsMapLayer*, QString> filterMap;
2501
-
2502
2507
if ( layerList.isEmpty () )
2503
2508
{
2504
- return filterMap ;
2509
+ return ;
2505
2510
}
2506
2511
2507
2512
QString filterParameter = mParameters .value ( " FILTER" );
@@ -2548,7 +2553,7 @@ QHash<QgsMapLayer*, QString> QgsWMSServer::applyRequestedLayerFilters( const QSt
2548
2553
QgsVectorLayer* filteredLayer = dynamic_cast <QgsVectorLayer*>( filter );
2549
2554
if ( filteredLayer )
2550
2555
{
2551
- filterMap .insert ( filteredLayer, filteredLayer->subsetString () );
2556
+ originalFilters .insert ( filteredLayer, filteredLayer->subsetString () );
2552
2557
QString newSubsetString = eqSplit.at ( 1 );
2553
2558
if ( !filteredLayer->subsetString ().isEmpty () )
2554
2559
{
@@ -2565,8 +2570,8 @@ QHash<QgsMapLayer*, QString> QgsWMSServer::applyRequestedLayerFilters( const QSt
2565
2570
if ( mMapRenderer && mMapRenderer ->extent ().isEmpty () )
2566
2571
{
2567
2572
QgsRectangle filterExtent;
2568
- QHash<QgsMapLayer*, QString>::const_iterator filterIt = filterMap .constBegin ();
2569
- for ( ; filterIt != filterMap .constEnd (); ++filterIt )
2573
+ QHash<QgsMapLayer*, QString>::const_iterator filterIt = originalFilters .constBegin ();
2574
+ for ( ; filterIt != originalFilters .constEnd (); ++filterIt )
2570
2575
{
2571
2576
QgsMapLayer* mapLayer = filterIt.key ();
2572
2577
if ( !mapLayer )
@@ -2587,7 +2592,6 @@ QHash<QgsMapLayer*, QString> QgsWMSServer::applyRequestedLayerFilters( const QSt
2587
2592
mMapRenderer ->setExtent ( filterExtent );
2588
2593
}
2589
2594
}
2590
- return filterMap;
2591
2595
}
2592
2596
2593
2597
#ifdef HAVE_SERVER_PYTHON_PLUGINS
0 commit comments