@@ -258,7 +258,7 @@ int msWMSApplyTime(mapObj *map, int version, char *time, char *wms_exception_for
258258 }
259259 } else {
260260 /*
261- ** Check to see if there is a list of possible patterns defined. If it is the case, use
261+ ** Check to see if there is a list of possible patterns defined. If it is the case, use
262262 ** it to set the time pattern to use for the request.
263263 **
264264 ** Last argument is set to TRUE (checkonly) to not trigger the patterns info setting, rather
@@ -310,7 +310,7 @@ int msWMSApplyTime(mapObj *map, int version, char *time, char *wms_exception_for
310310** Apply the FILTER parameter to layers (RFC118)
311311*/
312312int msWMSApplyFilter (mapObj * map , int version , const char * filter ,
313- int def_srs_needs_axis_swap , char * wms_exception_format )
313+ int def_srs_needs_axis_swap , char * wms_exception_format , owsRequestObj * ows_request )
314314{
315315 int i = 0 , numlayers ;
316316 int numfilters = 0 , curfilter = 0 ;
@@ -324,20 +324,20 @@ int msWMSApplyFilter(mapObj *map, int version, const char *filter,
324324 if (!map )
325325 return MS_FAILURE ;
326326
327- /* Count number of requested layers
327+ /* Count number of requested layers / groups / etc.
328328 * Only layers with STATUS ON were in the LAYERS request param.
329329 * Layers with STATUS DEFAULT were set in the mapfile and are
330330 * not expected to have a corresponding filter in the request
331331 */
332- for (i = 0 , numlayers = 0 ; i < map -> numlayers ; i ++ ) {
333- layerObj * lp = NULL ;
332+ for (i = 0 , numlayers = 0 ; i < map -> numlayers ; i ++ ) {
333+ layerObj * lp = NULL ;
334334
335- if (map -> layerorder [i ] != -1 ) {
336- lp = (GET_LAYER (map , map -> layerorder [i ]));
337- if (lp -> status == MS_ON )
338- numlayers ++ ;
339- }
340- }
335+ if (map -> layerorder [i ] != -1 ) {
336+ lp = (GET_LAYER (map , map -> layerorder [i ]));
337+ if (lp -> status == MS_ON )
338+ numlayers ++ ;
339+ }
340+ }
341341
342342 /* -------------------------------------------------------------------- */
343343 /* Parse the Filter parameter. If there are several Filter */
@@ -347,25 +347,21 @@ int msWMSApplyFilter(mapObj *map, int version, const char *filter,
347347 if (filter [0 ] == '(' ) {
348348 paszFilters = FLTSplitFilters (filter , & numfilters );
349349
350- if ( paszFilters && numfilters > 0 && numlayers != numfilters ) {
351- msFreeCharArray (paszFilters , numfilters );
352- paszFilters = NULL ;
353- }
354350 } else if (numlayers == 1 ) {
355351 numfilters = 1 ;
356352 paszFilters = (char * * )msSmallMalloc (sizeof (char * )* numfilters );
357353 paszFilters [0 ] = msStrdup (filter );
358354 }
359355
360- if (numlayers != numfilters ) {
361- msSetError (MS_WMSERR , "Wrong number of filter elements, one filter must be specified for each requested layer." ,
356+ if (numfilters != ows_request -> numwmslayerargs ) {
357+ msSetError (MS_WMSERR , "Wrong number of filter elements, one filter must be specified for each requested layer or groups ." ,
362358 "msWMSApplyFilter" );
363359 msFreeCharArray (paszFilters , numfilters );
364360 return msWMSException (map , version , "InvalidParameterValue" , wms_exception_format );
365361 }
366362
367363 /* We're good to go. Apply each filter to the corresponding layer */
368- for (i = 0 , curfilter = 0 ; i < map -> numlayers && curfilter < numfilters ; i ++ ) {
364+ for (i = 0 ; i < map -> numlayers ; i ++ ) {
369365 layerObj * lp = NULL ;
370366
371367 if (map -> layerorder [i ] != -1 )
@@ -375,9 +371,10 @@ int msWMSApplyFilter(mapObj *map, int version, const char *filter,
375371 if (lp == NULL || lp -> status != MS_ON )
376372 continue ;
377373
374+ curfilter = ows_request -> layerwmsfilterindex [lp -> index ];
375+
378376 /* Skip empty filters */
379377 if (paszFilters [curfilter ][0 ] == '\0' ) {
380- curfilter ++ ;
381378 continue ;
382379 }
383380
@@ -959,9 +956,9 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
959956 outputFormatObj * format = NULL ;
960957 int validlayers = 0 ;
961958 char * styles = NULL ;
962- int numlayers = 0 ;
959+ int numwmslayerargs = 0 ;
963960 char * * layers = NULL ;
964- int layerfound = 0 ;
961+ int layerfound = MS_FALSE ;
965962 int invalidlayers = 0 ;
966963 char epsgbuf [100 ];
967964 char srsbuffer [100 ];
@@ -1033,11 +1030,11 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
10331030 layerOrder = (int * )malloc (map -> numlayers * sizeof (int ));
10341031 MS_CHECK_ALLOC (layerOrder , map -> numlayers * sizeof (int ), MS_FAILURE )
10351032
1036- layers = msStringSplit (values [i ], ',' , & numlayers );
1037- if (layers == NULL || strlen (values [i ]) <=0 || numlayers < 1 ) {
1038- numlayers = 0 ;
1033+ layers = msStringSplit (values [i ], ',' , & numwmslayerargs );
1034+ if (layers == NULL || strlen (values [i ]) <=0 || numwmslayerargs < 1 ) {
1035+ numwmslayerargs = 0 ;
10391036 if (sld_url == NULL && sld_body == NULL ) {
1040- msFreeCharArray (layers ,numlayers );
1037+ msFreeCharArray (layers ,numwmslayerargs );
10411038 msFree (layerOrder );
10421039 msSetError (MS_WMSERR , "At least one layer name required in LAYERS." ,
10431040 "msWMSLoadGetMapParams()" );
@@ -1048,8 +1045,8 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
10481045 if (nVersion >= OWS_1_3_0 ) {
10491046 layerlimit = msOWSLookupMetadata (& (map -> web .metadata ), "MO" , "layerlimit" );
10501047 if (layerlimit ) {
1051- if (numlayers > atoi (layerlimit )) {
1052- msFreeCharArray (layers ,numlayers );
1048+ if (numwmslayerargs > atoi (layerlimit )) {
1049+ msFreeCharArray (layers ,numwmslayerargs );
10531050 msFree (layerOrder );
10541051 msSetError (MS_WMSERR , "Number of layers requested exceeds LayerLimit." ,
10551052 "msWMSLoadGetMapParams()" );
@@ -1079,8 +1076,16 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
10791076 isUsedInNestedGroup = (int * )msSmallCalloc (map -> numlayers , sizeof (int ));
10801077 msWMSPrepareNestedGroups (map , nVersion , nestedGroups , numNestedGroups , isUsedInNestedGroup );
10811078
1082- for (k = 0 ; k < numlayers ; k ++ ) {
1083- layerfound = 0 ;
1079+ if (ows_request -> layerwmsfilterindex != NULL )
1080+ msFree (ows_request -> layerwmsfilterindex );
1081+ ows_request -> layerwmsfilterindex = (int * )msSmallMalloc (map -> numlayers * sizeof (int ));
1082+ for (j = 0 ; j < map -> numlayers ; j ++ ) {
1083+ ows_request -> layerwmsfilterindex [j ] = -1 ;
1084+ }
1085+ ows_request -> numwmslayerargs = numwmslayerargs ;
1086+
1087+ for (k = 0 ; k < numwmslayerargs ; k ++ ) {
1088+ layerfound = MS_FALSE ;
10841089 for (j = 0 ; j < map -> numlayers ; j ++ ) {
10851090 /* Turn on selected layers only. */
10861091 if ( ((GET_LAYER (map , j )-> name &&
@@ -1096,11 +1101,12 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
10961101 GET_LAYER (map , j )-> status = MS_ON ;
10971102 }
10981103 }
1104+ ows_request -> layerwmsfilterindex [j ] = k ; /* Assign the corresponding filter */
10991105 validlayers ++ ;
1100- layerfound = 1 ;
1106+ layerfound = MS_TRUE ;
11011107 }
11021108 }
1103- if (layerfound == 0 && numlayers > 0 )
1109+ if (layerfound == MS_FALSE && numwmslayerargs > 0 )
11041110 invalidlayers ++ ;
11051111
11061112 }
@@ -1123,7 +1129,7 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
11231129 }
11241130
11251131 free (layerOrder );
1126- msFreeCharArray (layers , numlayers );
1132+ msFreeCharArray (layers , numwmslayerargs );
11271133 } else if (strcasecmp (names [i ], "STYLES" ) == 0 ) {
11281134 styles = values [i ];
11291135
@@ -1887,7 +1893,7 @@ this request. Check wms/ows_enable_request settings.",
18871893 return msWMSException (map , nVersion , NULL , wms_exception_format );
18881894 }
18891895
1890- if (msWMSApplyFilter (map , nVersion , filter , need_axis_swap , wms_exception_format ) == MS_FAILURE ) {
1896+ if (msWMSApplyFilter (map , nVersion , filter , need_axis_swap , wms_exception_format , ows_request ) == MS_FAILURE ) {
18911897 return MS_FAILURE ;/* msWMSException(map, nVersion, "InvalidFilterRequest"); */
18921898 }
18931899 }
0 commit comments