@@ -4134,116 +4134,47 @@ char *msSLDGenerateTextSLD(classObj *psClass, layerObj *psLayer, int nVersion)
41344134#endif
41354135}
41364136
4137+ #if (defined(USE_WMS_SVR ) || defined (USE_WFS_SVR ) || defined (USE_WCS_SVR ) || defined(USE_SOS_SVR )) && defined(USE_OGR )
41374138
4138- /************************************************************************/
4139- /* msSLDGenerateSLDLayer */
4140- /* */
4141- /* Genrate an SLD XML string based on the layer's classes. */
4142- /************************************************************************/
4143- char * msSLDGenerateSLDLayer (layerObj * psLayer , int nVersion )
4139+ static void msSLDAppendName (msStringBuffer * sb , const char * pszName , int nVersion )
41444140{
4145- #if defined(USE_WMS_SVR ) || defined (USE_WFS_SVR ) || defined (USE_WCS_SVR ) || defined(USE_SOS_SVR )
4146-
4147- #ifdef USE_OGR
4148- char szTmp [100 ];
4149- char * pszTmpName = NULL ;
4150- int i , j ;
4151- styleObj * psStyle = NULL ;
4152- char * pszFilter = NULL ;
4153- char * pszFinalSLD = NULL ;
4154- char * pszSLD = NULL ;
4155- const char * pszTmp = NULL ;
4156- double dfMinScale = -1 , dfMaxScale = -1 ;
4157- const char * pszWfsFilter = NULL ;
4158- char * pszEncoded = NULL , * pszWfsFilterEncoded = NULL ;
4159-
4160-
4161- if (psLayer &&
4162- (psLayer -> status == MS_ON || psLayer -> status == MS_DEFAULT ) &&
4163- (psLayer -> type == MS_LAYER_POINT ||
4164- psLayer -> type == MS_LAYER_LINE ||
4165- psLayer -> type == MS_LAYER_POLYGON )) {
4166- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "<NamedLayer>" );
4167- pszFinalSLD = msStringConcatenate (pszFinalSLD , szTmp );
4168-
4169- pszTmp = msOWSLookupMetadata (& (psLayer -> metadata ), "MO" , "name" );
4170- if (pszTmp ) {
4171- pszEncoded = msEncodeHTMLEntities (pszTmp );
4172- if (nVersion > OWS_1_0_0 )
4173- snprintf (szTmp , sizeof (szTmp ), "<se:Name>%s</se:Name>\n" , pszEncoded );
4174- else
4175- snprintf (szTmp , sizeof (szTmp ), "<Name>%s</Name>\n" , pszEncoded );
4176- pszFinalSLD = msStringConcatenate (pszFinalSLD , szTmp );
4177- msFree (pszEncoded );
4178- } else if (psLayer -> name ) {
4179- pszEncoded = msEncodeHTMLEntities (psLayer -> name );
4180- pszTmpName = (char * )malloc (sizeof (char )* (strlen (pszEncoded )+ 100 ));
4181- if (nVersion > OWS_1_0_0 )
4182- sprintf (pszTmpName , "<se:Name>%s</se:Name>\n" , pszEncoded );
4183- else
4184- sprintf (pszTmpName , "<Name>%s</Name>\n" , pszEncoded );
4185-
4186-
4187- msFree (pszEncoded );
4188- pszFinalSLD = msStringConcatenate (pszFinalSLD , pszTmpName );
4189- msFree (pszTmpName );
4190- pszTmpName = NULL ;
4191-
4192- } else {
4193- if (nVersion > OWS_1_0_0 )
4194- snprintf (szTmp , sizeof (szTmp ), "<se:Name>%s</se:Name>\n" , "NamedLayer" );
4195- else
4196- snprintf (szTmp , sizeof (szTmp ), "<Name>%s</Name>\n" , "NamedLayer" );
4197- pszFinalSLD = msStringConcatenate (pszFinalSLD , szTmp );
4198- }
4199-
4141+ char * pszEncoded = msEncodeHTMLEntities (pszName );
4142+ msStringBufferAppend (sb , (nVersion > OWS_1_0_0 ) ? "<se:Name>" : "<Name>" );
4143+ msStringBufferAppend (sb , pszEncoded );
4144+ msStringBufferAppend (sb , (nVersion > OWS_1_0_0 ) ? "</se:Name>\n" : "</Name>\n" );
4145+ msFree (pszEncoded );
4146+ }
42004147
4201- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "<UserStyle>" );
4202- pszFinalSLD = msStringConcatenate (pszFinalSLD , szTmp );
4148+ static void msSLDGenerateUserStyle (msStringBuffer * sb , layerObj * psLayer , int nVersion )
4149+ {
4150+ const char * pszWfsFilter ;
42034151
4204- if (nVersion > OWS_1_0_0 )
4205- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "<se:FeatureTypeStyle>" );
4206- else
4207- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "<FeatureTypeStyle>" );
4152+ msStringBufferAppend (sb , "<UserStyle>\n" );
42084153
4209- pszFinalSLD = msStringConcatenate (pszFinalSLD , szTmp );
4154+ msStringBufferAppend (sb , nVersion > OWS_1_0_0 ?
4155+ "<se:FeatureTypeStyle>\n" : "<FeatureTypeStyle>\n" );
42104156
42114157 pszWfsFilter = msLookupHashTable (& (psLayer -> metadata ), "wfs_filter" );
4212- if (pszWfsFilter )
4213- pszWfsFilterEncoded = msEncodeHTMLEntities (pszWfsFilter );
42144158 if (psLayer -> numclasses > 0 ) {
4159+ int i ;
42154160 for (i = 0 ; i < psLayer -> numclasses ; i ++ ) {
4216- if (nVersion > OWS_1_0_0 )
4217- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "<se:Rule>" );
4218- else
4219- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "<Rule>" );
4161+ char * pszFilter ;
4162+ double dfMinScale = -1 , dfMaxScale = -1 ;
42204163
4221- pszFinalSLD = msStringConcatenate ( pszFinalSLD , szTmp );
4164+ msStringBufferAppend ( sb , nVersion > OWS_1_0_0 ? "<se:Rule>\n" : "<Rule>\n" );
42224165
42234166 /* if class has a name, use it as the RULE name */
42244167 if (psLayer -> class [i ]-> name ) {
4225- pszEncoded = msEncodeHTMLEntities (psLayer -> class [i ]-> name );
4226- pszTmpName = (char * )malloc (sizeof (char )* (strlen (pszEncoded )+ 100 ));
4227-
4228- if (nVersion > OWS_1_0_0 )
4229- sprintf (pszTmpName , "<se:Name>%s</se:Name>\n" , pszEncoded );
4230- else
4231- sprintf (pszTmpName , "<Name>%s</Name>\n" , pszEncoded );
4232-
4233- msFree (pszEncoded );
4234-
4235- pszFinalSLD = msStringConcatenate (pszFinalSLD , pszTmpName );
4236- msFree (pszTmpName );
4237- pszTmpName = NULL ;
4168+ msSLDAppendName (sb , psLayer -> class [i ]-> name , nVersion );
42384169 }
42394170 /* -------------------------------------------------------------------- */
42404171 /* get the Filter if there is a class expression. */
42414172 /* -------------------------------------------------------------------- */
42424173 pszFilter = msSLDGetFilter (psLayer -> class [i ] ,
4243- pszWfsFilter );/* pszWfsFilterEncoded); */
4174+ pszWfsFilter );
42444175
42454176 if (pszFilter ) {
4246- pszFinalSLD = msStringConcatenate ( pszFinalSLD , pszFilter );
4177+ msStringBufferAppend ( sb , pszFilter );
42474178 free (pszFilter );
42484179 }
42494180 /* -------------------------------------------------------------------- */
@@ -4257,14 +4188,15 @@ char *msSLDGenerateSLDLayer(layerObj *psLayer, int nVersion)
42574188 else if (psLayer -> map && psLayer -> map -> web .minscaledenom > 0 )
42584189 dfMinScale = psLayer -> map -> web .minscaledenom ;
42594190 if (dfMinScale > 0 ) {
4191+ char szTmp [100 ];
42604192 if (nVersion > OWS_1_0_0 )
42614193 snprintf (szTmp , sizeof (szTmp ), "<se:MinScaleDenominator>%f</se:MinScaleDenominator>\n" ,
42624194 dfMinScale );
42634195 else
42644196 snprintf (szTmp , sizeof (szTmp ), "<MinScaleDenominator>%f</MinScaleDenominator>\n" ,
42654197 dfMinScale );
42664198
4267- pszFinalSLD = msStringConcatenate ( pszFinalSLD , szTmp );
4199+ msStringBufferAppend ( sb , szTmp );
42684200 }
42694201
42704202 dfMaxScale = -1.0 ;
@@ -4275,14 +4207,15 @@ char *msSLDGenerateSLDLayer(layerObj *psLayer, int nVersion)
42754207 else if (psLayer -> map && psLayer -> map -> web .maxscaledenom > 0 )
42764208 dfMaxScale = psLayer -> map -> web .maxscaledenom ;
42774209 if (dfMaxScale > 0 ) {
4210+ char szTmp [100 ];
42784211 if (nVersion > OWS_1_0_0 )
42794212 snprintf (szTmp , sizeof (szTmp ), "<se:MaxScaleDenominator>%f</se:MaxScaleDenominator>\n" ,
42804213 dfMaxScale );
42814214 else
42824215 snprintf (szTmp , sizeof (szTmp ), "<MaxScaleDenominator>%f</MaxScaleDenominator>\n" ,
42834216 dfMaxScale );
42844217
4285- pszFinalSLD = msStringConcatenate ( pszFinalSLD , szTmp );
4218+ msStringBufferAppend ( sb , szTmp );
42864219 }
42874220
42884221
@@ -4295,69 +4228,90 @@ char *msSLDGenerateSLDLayer(layerObj *psLayer, int nVersion)
42954228 /* Lines using symbols TODO (specially for dash lines) */
42964229 /* -------------------------------------------------------------------- */
42974230 if (psLayer -> type == MS_LAYER_LINE ) {
4231+ int j ;
42984232 for (j = 0 ; j < psLayer -> class [i ]-> numstyles ; j ++ ) {
4299- psStyle = psLayer -> class [i ]-> styles [j ];
4300- pszSLD = msSLDGenerateLineSLD (psStyle , psLayer , nVersion );
4233+ styleObj * psStyle = psLayer -> class [i ]-> styles [j ];
4234+ char * pszSLD = msSLDGenerateLineSLD (psStyle , psLayer , nVersion );
43014235 if (pszSLD ) {
4302- pszFinalSLD = msStringConcatenate ( pszFinalSLD , pszSLD );
4236+ msStringBufferAppend ( sb , pszSLD );
43034237 free (pszSLD );
43044238 }
43054239 }
43064240
43074241 } else if (psLayer -> type == MS_LAYER_POLYGON ) {
4242+ int j ;
43084243 for (j = 0 ; j < psLayer -> class [i ]-> numstyles ; j ++ ) {
4309- psStyle = psLayer -> class [i ]-> styles [j ];
4310- pszSLD = msSLDGeneratePolygonSLD (psStyle , psLayer , nVersion );
4244+ styleObj * psStyle = psLayer -> class [i ]-> styles [j ];
4245+ char * pszSLD = msSLDGeneratePolygonSLD (psStyle , psLayer , nVersion );
43114246 if (pszSLD ) {
4312- pszFinalSLD = msStringConcatenate ( pszFinalSLD , pszSLD );
4247+ msStringBufferAppend ( sb , pszSLD );
43134248 free (pszSLD );
43144249 }
43154250 }
43164251
43174252 } else if (psLayer -> type == MS_LAYER_POINT ) {
4253+ int j ;
43184254 for (j = 0 ; j < psLayer -> class [i ]-> numstyles ; j ++ ) {
4319- psStyle = psLayer -> class [i ]-> styles [j ];
4320- pszSLD = msSLDGeneratePointSLD (psStyle , psLayer , nVersion );
4255+ styleObj * psStyle = psLayer -> class [i ]-> styles [j ];
4256+ char * pszSLD = msSLDGeneratePointSLD (psStyle , psLayer , nVersion );
43214257 if (pszSLD ) {
4322- pszFinalSLD = msStringConcatenate ( pszFinalSLD , pszSLD );
4258+ msStringBufferAppend ( sb , pszSLD );
43234259 free (pszSLD );
43244260 }
43254261 }
43264262
43274263 }
4328- /* label if it exists */
4329- pszSLD = msSLDGenerateTextSLD (psLayer -> class [i ], psLayer , nVersion );
4330- if (pszSLD ) {
4331- pszFinalSLD = msStringConcatenate (pszFinalSLD , pszSLD );
4332- free (pszSLD );
4264+ {
4265+ /* label if it exists */
4266+ char * pszSLD = msSLDGenerateTextSLD (psLayer -> class [i ], psLayer , nVersion );
4267+ if (pszSLD ) {
4268+ msStringBufferAppend (sb , pszSLD );
4269+ free (pszSLD );
4270+ }
43334271 }
4334- if (nVersion > OWS_1_0_0 )
4335- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "</se:Rule>" );
4336- else
4337- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "</Rule>" );
4272+ msStringBufferAppend (sb , nVersion > OWS_1_0_0 ? "</se:Rule>\n" : "</Rule>\n" );
4273+ }
4274+ }
43384275
4339- pszFinalSLD = msStringConcatenate (pszFinalSLD , szTmp );
4276+ msStringBufferAppend (sb , nVersion > OWS_1_0_0 ? "</se:FeatureTypeStyle>\n" : "</FeatureTypeStyle>\n" );
4277+ msStringBufferAppend (sb , "</UserStyle>\n" );
4278+ }
43404279
4280+ #endif
43414281
4342- }
4343- }
4344- if (pszWfsFilterEncoded )
4345- msFree (pszWfsFilterEncoded );
4346- if (nVersion > OWS_1_0_0 )
4347- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "</se:FeatureTypeStyle>" );
4348- else
4349- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "</FeatureTypeStyle>" );
4282+ /************************************************************************/
4283+ /* msSLDGenerateSLDLayer */
4284+ /* */
4285+ /* Genrate an SLD XML string based on the layer's classes. */
4286+ /************************************************************************/
4287+ char * msSLDGenerateSLDLayer (layerObj * psLayer , int nVersion )
4288+ {
4289+ #if defined(USE_WMS_SVR ) || defined (USE_WFS_SVR ) || defined (USE_WCS_SVR ) || defined(USE_SOS_SVR )
4290+
4291+ #ifdef USE_OGR
4292+ const char * pszWMSLayerName = NULL ;
4293+ msStringBuffer * sb = msStringBufferAlloc ();
4294+
4295+ if (psLayer &&
4296+ (psLayer -> status == MS_ON || psLayer -> status == MS_DEFAULT ) &&
4297+ (psLayer -> type == MS_LAYER_POINT ||
4298+ psLayer -> type == MS_LAYER_LINE ||
4299+ psLayer -> type == MS_LAYER_POLYGON )) {
43504300
4351- pszFinalSLD = msStringConcatenate ( pszFinalSLD , szTmp );
4301+ msStringBufferAppend ( sb , "<NamedLayer>\n" );
43524302
4353- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "</UserStyle>" );
4354- pszFinalSLD = msStringConcatenate (pszFinalSLD , szTmp );
4303+ pszWMSLayerName = msOWSLookupMetadata (& (psLayer -> metadata ), "MO" , "name" );
4304+ msSLDAppendName (sb ,
4305+ pszWMSLayerName ? pszWMSLayerName :
4306+ psLayer -> name ? psLayer -> name :
4307+ "NamedLayer" ,
4308+ nVersion );
43554309
4356- snprintf (szTmp , sizeof (szTmp ), "%s\n" , "</NamedLayer>" );
4357- pszFinalSLD = msStringConcatenate (pszFinalSLD , szTmp );
4310+ msSLDGenerateUserStyle (sb , psLayer , nVersion );
43584311
4312+ msStringBufferAppend (sb , "</NamedLayer>\n" );
43594313 }
4360- return pszFinalSLD ;
4314+ return msStringBufferReleaseStringAndFree ( sb ) ;
43614315
43624316
43634317#else
0 commit comments