@@ -1167,29 +1167,46 @@ namespace QgsWms
1167
1167
QStringList QgsWmsParameters::filters () const
1168
1168
{
1169
1169
const QString filter = mWmsParameters [ QgsWmsParameter::FILTER ].toString ();
1170
- if ( filter.startsWith ( QStringLiteral ( " (<" ) ) && filter.endsWith ( QStringLiteral ( " Filter>)" ) ) )
1170
+ QStringList results;
1171
+ int pos = 0 ;
1172
+ while ( pos < filter.size () )
1171
1173
{
1172
- // OGC filter on multiple layers
1173
- // remove the "(<" at the beginning and the "Filter>)" at the end
1174
- const QString toSplit = filter.mid ( 2 , filter.length () - 10 );
1175
-
1176
- QStringList result;
1177
- for ( const QString &cur : toSplit.split ( QStringLiteral ( " Filter>)(<" ), QString::SkipEmptyParts ) )
1174
+ if ( pos + 1 < filter.size () && filter[pos] == ' (' && filter[pos + 1 ] == ' <' )
1178
1175
{
1179
- result.append ( QStringLiteral ( " <" ) + cur + QStringLiteral ( " Filter>" ) );
1176
+ // OGC filter on multiple layers
1177
+ int posEnd = filter.indexOf ( " Filter>)" , pos );
1178
+ if ( posEnd < 0 )
1179
+ {
1180
+ posEnd = filter.size ();
1181
+ }
1182
+ results.append ( filter.mid ( pos + 1 , posEnd - pos + 6 ) );
1183
+ pos = posEnd + 8 ;
1184
+ }
1185
+ else if ( pos + 1 < filter.size () && filter[pos] == ' (' && filter[pos + 1 ] == ' )' )
1186
+ {
1187
+ // empty OGC filter
1188
+ results.append ( " " );
1189
+ pos += 2 ;
1190
+ }
1191
+ else if ( filter[pos] == ' <' )
1192
+ {
1193
+ // Single OGC filter
1194
+ results.append ( filter.mid ( pos ) );
1195
+ break ;
1196
+ }
1197
+ else
1198
+ {
1199
+ // QGIS specific filter
1200
+ int posEnd = filter.indexOf ( ' ;' , pos + 1 );
1201
+ if ( posEnd < 0 )
1202
+ {
1203
+ posEnd = filter.size ();
1204
+ }
1205
+ results.append ( filter.mid ( pos, posEnd - pos ) );
1206
+ pos = posEnd + 1 ;
1180
1207
}
1181
- return result;
1182
- }
1183
- else if ( filter.startsWith ( QStringLiteral ( " <" ) ) && filter.endsWith ( QStringLiteral ( " Filter>" ) ) )
1184
- {
1185
- // single OGC filter
1186
- return QStringList ( filter );
1187
- }
1188
- else
1189
- {
1190
- // QGIS specific filter
1191
- return filter.split ( ' ;' , QString::SkipEmptyParts );
1192
1208
}
1209
+ return results;
1193
1210
}
1194
1211
1195
1212
QString QgsWmsParameters::filterGeom () const
@@ -1233,8 +1250,6 @@ namespace QgsWms
1233
1250
1234
1251
QMultiMap<QString, QString> QgsWmsParameters::getLayerFilters ( const QStringList &layers ) const
1235
1252
{
1236
- // filter format: "LayerName:filterString;LayerName2:filterString2;..."
1237
- // several filters can be defined for one layer
1238
1253
const QStringList rawFilters = filters ();
1239
1254
QMultiMap<QString, QString> layerFilters;
1240
1255
for ( int i = 0 ; i < rawFilters.size (); i++ )
@@ -1244,8 +1259,10 @@ namespace QgsWms
1244
1259
{
1245
1260
layerFilters.insert ( layers[i], f );
1246
1261
}
1247
- else
1262
+ else if ( !f. isEmpty () )
1248
1263
{
1264
+ // filter format: "LayerName:filterString;LayerName2:filterString2;..."
1265
+ // several filters can be defined for one layer
1249
1266
const QStringList splits = f.split ( ' :' );
1250
1267
if ( splits.size () == 2 )
1251
1268
{
0 commit comments