[mapserver-commits] r8501 - trunk/mapserver
svn at osgeo.org
svn at osgeo.org
Wed Feb 4 23:15:11 EST 2009
Author: sdlime
Date: 2009-02-04 23:15:11 -0500 (Wed, 04 Feb 2009)
New Revision: 8501
Modified:
trunk/mapserver/mapfile.c
Log:
Base code for RFC44 implmentation. Only layer->data uses it but I don't want to sit on it any more...
Modified: trunk/mapserver/mapfile.c
===================================================================
--- trunk/mapserver/mapfile.c 2009-02-05 01:22:59 UTC (rev 8500)
+++ trunk/mapserver/mapfile.c 2009-02-05 04:15:11 UTC (rev 8501)
@@ -79,6 +79,20 @@
static char *msJoinType[2]={"ONE-TO-ONE", "ONE-TO-MANY"};
static char *msAlignValue[3]={"LEFT","CENTER","RIGHT"};
+/*
+** Validates a string (value) against a series of patterns. We support up to four to allow cascading from classObj to
+** layerObj to webObj plus a legacy pattern like TEMPLATEPATTERN or qstring_validation_pattern.
+*/
+int msValidateParameter(char *value, char *pattern1, char *pattern2, char *pattern3, char *pattern4) {
+ if(msEvalRegex(pattern1, value) == MS_TRUE) return MS_SUCCESS;
+ if(msEvalRegex(pattern2, value) == MS_TRUE) return MS_SUCCESS;
+ if(msEvalRegex(pattern3, value) == MS_TRUE) return MS_SUCCESS;
+ if(msEvalRegex(pattern4, value) == MS_TRUE) return MS_SUCCESS;
+
+ msSetError(MS_REGEXERR, "Parameter pattern validation failed." , "msValidateParameter()");
+ return(MS_FAILURE);
+}
+
int msEvalRegex(char *e, char *s) {
ms_regex_t re;
@@ -1399,6 +1413,11 @@
break;
case(SIZE):
#if defined (USE_GD_TTF) || defined (USE_GD_FT)
+ if(label->bindings[MS_LABEL_BINDING_SIZE].item) {
+ msFree(label->bindings[MS_LABEL_BINDING_SIZE].item);
+ label->numbindings--;
+ }
+
if((symbol = getSymbol(7, MS_NUMBER,MS_BINDING,MS_TINY,MS_SMALL,MS_MEDIUM,MS_LARGE,MS_GIANT)) == -1)
return(-1);
@@ -1720,16 +1739,15 @@
case(END):
return(MS_SUCCESS);
case(MS_STRING):
- key = strdup(msyytext);
+ key = strdup(msyytext); /* the key is *always* a string */
if(getString(&data) == MS_FAILURE) return(MS_FAILURE);
- msInsertHashTable(ptable, key, data);
-
+ msInsertHashTable(ptable, key, data);
+
free(key);
free(data); data=NULL;
break;
default:
- msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadHashTable()",
- msyytext, msyylineno );
+ msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadHashTable()", msyytext, msyylineno );
return(MS_FAILURE);
}
}
@@ -1748,8 +1766,9 @@
for (i=0;i<MS_HASHSIZE; i++) {
if (table->items[i] != NULL) {
- for (tp=table->items[i]; tp!=NULL; tp=tp->next)
- fprintf(stream, "%s \"%s\"\t\"%s\"\n", tab, tp->key, tp->data);
+ for (tp=table->items[i]; tp!=NULL; tp=tp->next) {
+ fprintf(stream, "%s \"%s\"\t\"%s\"\n", tab, tp->key, tp->data);
+ }
}
}
@@ -2072,8 +2091,8 @@
class->type = -1;
- /* class->metadata = NULL; */
initHashTable(&(class->metadata));
+ initHashTable(&(class->validation));
class->maxscaledenom = class->minscaledenom = -1.0;
@@ -2104,20 +2123,21 @@
msFree(class->name);
msFree(class->title);
msFree(class->template);
- msFree(class->group);
+ msFree(class->group);
if (&(class->metadata)) msFreeHashItems(&(class->metadata));
+ if (&(class->validation)) msFreeHashItems(&(class->validation));
-
- for(i=0;i<class->numstyles;i++) { /* each style */
- if (class->styles[i]!=NULL) {
- if( freeStyle(class->styles[i]) == MS_SUCCESS ) {
- msFree(class->styles[i]);
- }
+ for(i=0;i<class->numstyles;i++) { /* each style */
+ if(class->styles[i]!=NULL) {
+ if(freeStyle(class->styles[i]) == MS_SUCCESS) {
+ msFree(class->styles[i]);
+ }
}
}
msFree(class->styles);
msFree(class->keyimage);
+
return MS_SUCCESS;
}
@@ -2271,7 +2291,7 @@
case(MAXSCALE):
case(MAXSCALEDENOM):
if(getDouble(&(class->maxscaledenom)) == -1) return(-1);
- break;
+ break;
case(METADATA):
if(loadHashTable(&(class->metadata)) != MS_SUCCESS) return(-1);
break;
@@ -2397,6 +2417,10 @@
class->styles[1]->symbolname = strdup(msyytext);
class->numstyles = 2;
break;
+
+ case(VALIDATION):
+ if(loadHashTable(&(class->validation)) != MS_SUCCESS) return(-1);
+ break;
default:
if(strlen(msyytext) > 0) {
msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadClass()", msyytext, msyylineno);
@@ -2570,8 +2594,8 @@
layer->requires = layer->labelrequires = NULL;
- /* layer->metadata = NULL; */
initHashTable(&(layer->metadata));
+ initHashTable(&(layer->validation));
layer->dump = MS_FALSE;
@@ -2583,7 +2607,7 @@
layer->numprocessing = 0;
layer->processing = NULL;
layer->numjoins = 0;
- if((layer->joins = (joinObj *)malloc(MS_MAXJOINS*sizeof(joinObj))) == NULL) {
+ if((layer->joins = (joinObj *) malloc(MS_MAXJOINS*sizeof(joinObj))) == NULL) {
msSetError(MS_MEMERR, NULL, "initLayer()");
return(-1);
}
@@ -2644,6 +2668,8 @@
msFree(layer->resultcache);
}
+ msFree(layer->styleitem);
+
msFree(layer->filteritem);
freeExpression(&(layer->filter));
@@ -2651,10 +2677,11 @@
msFree(layer->labelrequires);
if(&(layer->metadata)) msFreeHashItems(&(layer->metadata));
+ if(&(layer->validation)) msFreeHashItems(&(layer->validation));
- if( layer->numprocessing > 0 )
- msFreeCharArray( layer->processing, layer->numprocessing );
- msFree(layer->styleitem);
+ if(layer->numprocessing > 0)
+ msFreeCharArray(layer->processing, layer->numprocessing);
+
for(i=0;i<layer->numjoins;i++) /* each join */
freeJoin(&(layer->joins[i]));
msFree(layer->joins);
@@ -2713,11 +2740,10 @@
return layer->class[layer->numclasses];
}
-
-
int loadLayer(layerObj *layer, mapObj *map)
{
int type;
+ char *string;
char *templatepattern = NULL;
layer->map = (mapObj *)map;
@@ -2747,11 +2773,12 @@
if((layer->connectiontype = getSymbol(9, MS_SDE, MS_OGR, MS_POSTGIS, MS_WMS, MS_ORACLESPATIAL, MS_WFS, MS_GRATICULE, MS_MYGIS, MS_PLUGIN)) == -1) return(-1);
break;
case(DATA):
- if(getString(&layer->data) == MS_FAILURE) return(-1);
- if(msyysource == MS_URL_TOKENS && msEvalRegex(map->datapattern, layer->data) != MS_TRUE) {
+ if(getString(&string) == MS_FAILURE) return(-1);
+ if(msyysource == MS_URL_TOKENS && msValidateParameter(string, msLookupHashTable(&(layer->validation), "data"), msLookupHashTable(&(map->web.validation), "data"), map->datapattern, NULL) != MS_SUCCESS) {
msSetError(MS_MISCERR, "URL-based DATA configuration failed pattern validation." , "loadLayer()");
return(-1);
}
+ layer->data = string;
break;
case(DEBUG):
if((layer->debug = getSymbol(3, MS_ON,MS_OFF, MS_NUMBER)) == -1) return(-1);
@@ -2785,10 +2812,8 @@
if(getDouble(&(layer->extent.maxx)) == -1) return(-1);
if(getDouble(&(layer->extent.maxy)) == -1) return(-1);
if (!MS_VALID_EXTENT(layer->extent)) {
- msSetError(MS_MISCERR, "Given layer extent is invalid. Check that it " \
- "is in the form: minx, miny, maxx, maxy",
- "loadLayer()");
- return(-1);
+ msSetError(MS_MISCERR, "Given layer extent is invalid. Check that it is in the form: minx, miny, maxx, maxy", "loadLayer()");
+ return(-1);
}
break;
}
@@ -2977,6 +3002,9 @@
case(UNITS):
if((layer->units = getSymbol(8, MS_INCHES,MS_FEET,MS_MILES,MS_METERS,MS_KILOMETERS,MS_DD,MS_PIXELS,MS_PERCENTAGES)) == -1) return(-1);
break;
+ case(VALIDATION):
+ if(loadHashTable(&(layer->validation)) != MS_SUCCESS) return(-1);
+ break;
default:
if(strlen(msyytext) > 0) {
msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLayer()", msyytext, msyylineno);
@@ -3112,6 +3140,7 @@
if (layer->type != -1)
fprintf(stream, " TYPE %s\n", msLayerTypes[layer->type]);
fprintf(stream, " UNITS %s\n", msUnits[layer->units]);
+ if(&(layer->validation)) writeHashTable(&(layer->metadata), stream, " ", "VALIDATION");
if(layer->classgroup) fprintf(stream, " CLASSGROUP \"%s\"\n", layer->classgroup);
@@ -3891,9 +3920,9 @@
web->imagepath = strdup("");
web->imageurl = strdup("");
- /* web->metadata = NULL; */
initHashTable(&(web->metadata));
-
+ initHashTable(&(web->validation));
+
web->map = NULL;
web->queryformat = strdup("text/html");
web->legendformat = strdup("text/html");
@@ -3916,6 +3945,7 @@
msFree(web->legendformat);
msFree(web->browseformat);
if(&(web->metadata)) msFreeHashItems(&(web->metadata));
+ if(&(web->validation)) msFreeHashItems(&(web->validation));
}
static void writeWeb(webObj *web, FILE *stream)
@@ -3941,6 +3971,7 @@
if(web->legendformat != NULL) fprintf(stream, " LEGENDFORMAT %s\n", web->legendformat);
if(web->browseformat != NULL) fprintf(stream, " BROWSEFORMAT %s\n", web->browseformat);
if(web->template) fprintf(stream, " TEMPLATE \"%s\"\n", web->template);
+ if(&(web->validation)) writeHashTable(&(web->metadata), stream, " ", "VALIDATION");
fprintf(stream, " END\n\n");
}
@@ -4036,6 +4067,9 @@
return(-1);
}
break;
+ case(VALIDATION):
+ if(loadHashTable(&(web->validation)) != MS_SUCCESS) return(-1);
+ break;
default:
if(strlen(msyytext) > 0) {
msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadWeb()", msyytext, msyylineno);
More information about the mapserver-commits
mailing list