Changeset 7569

Show
Ignore:
Timestamp:
05/07/08 02:43:15 (2 months ago)
Author:
sdlime
Message:

More RFC work. Added TEMPLATE output format and feature tag support.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/mapserver/mapoutput.c

    r7418 r7569  
    11/****************************************************************************** 
    2  * $Id:
     2 * $Id
    33 * 
    44 * Project:  MapServer 
     
    273273        format->renderer = MS_RENDER_WITH_SVG; 
    274274    } 
     275 
     276    if( strcasecmp(driver,"template") == 0 ) { 
     277      format = msAllocOutputFormat( map, "template", driver ); 
     278      format->mimetype = strdup("text/html"); 
     279      format->extension = strdup("html"); 
     280      format->imagemode = 0; 
     281      format->renderer = MS_RENDER_WITH_TEMPLATE; 
     282    } 
     283 
    275284    if( format != NULL ) 
    276         format->inmapfile = MS_FALSE; 
     285      format->inmapfile = MS_FALSE; 
    277286 
    278287    return format; 
  • trunk/mapserver/mapserver.h

    r7558 r7569  
    278278#define MS_DRIVER_SVG(format) (strncasecmp((format)->driver,"svg",3)==0) 
    279279#define MS_DRIVER_AGG(format) (strncasecmp((format)->driver,"agg/",3)==0) 
    280  
    281  
    282 #define MS_RENDER_WITH_GD
     280#define MS_DRIVER_TEMPLATE(format) (strncasecmp((format)->driver,"template",8)==0) 
     281 
     282#define MS_RENDER_WITH_GD      
    283283#define MS_RENDER_WITH_SWF      2 
    284284#define MS_RENDER_WITH_RAWDATA  3 
    285 #define MS_RENDER_WITH_PDF 
     285#define MS_RENDER_WITH_PDF     
    286286#define MS_RENDER_WITH_IMAGEMAP 5 
    287287#define MS_RENDER_WITH_SVG      6 
    288288#define MS_RENDER_WITH_AGG      7 
     289#define MS_RENDER_WITH_TEMPLATE 8 /* query results only */ 
    289290 
    290291#define MS_RENDERER_GD(format)  ((format)->renderer == MS_RENDER_WITH_GD) 
     
    295296#define MS_RENDERER_SVG(format) ((format)->renderer == MS_RENDER_WITH_SVG) 
    296297#define MS_RENDERER_AGG(format) ((format)->renderer == MS_RENDER_WITH_AGG) 
     298#define MS_RENDERER_TEMPLATE(format) ((format)->renderer == MS_RENDER_WITH_TEMPLATE) 
    297299 
    298300#define MS_CELLSIZE(min,max,d) ((max - min)/(d-1)) /* where min/max are from an MapServer pixel center-to-pixel center extent */ 
  • trunk/mapserver/maptemplate.c

    r7561 r7569  
    179179} 
    180180 
    181 int msReturnTemplateQuery(mapservObj *mapserv, char* pszMimeType, char **papszBuffer) 
     181int msReturnTemplateQuery(mapservObj *mapserv, char *queryFormat, char **papszBuffer) 
    182182{ 
    183183  imageObj *img = NULL; 
     
    185185  char buffer[1024]; 
    186186 
    187   if(!pszMimeType) { 
    188     msSetError(MS_WEBERR, "Mime type not specified.", "msReturnTemplateQuery()"); 
     187  outputFormatObj *outputFormat; 
     188 
     189  if(!queryFormat) { 
     190    msSetError(MS_WEBERR, "Return format/mime-type not specified.", "msReturnTemplateQuery()"); 
    189191    return MS_FAILURE; 
    190192  } 
    191     
    192   if(mapserv->Map->querymap.status) { 
    193     checkWebScale(mapserv); 
    194  
    195     img = msDrawMap(mapserv->Map, MS_TRUE); 
    196     if(!img) return MS_FAILURE; 
    197  
    198     snprintf(buffer, 1024, "%s%s%s.%s", mapserv->Map->web.imagepath, mapserv->Map->name, mapserv->Id, MS_IMAGE_EXTENSION(mapserv->Map->outputformat)); 
    199  
    200     status = msSaveImage(mapserv->Map, img, buffer); 
    201     if(status != MS_SUCCESS) return status; 
    202  
    203     msFreeImage(img); 
    204  
    205     if((mapserv->Map->legend.status == MS_ON || mapserv->UseShapes) && mapserv->Map->legend.template == NULL) { 
    206       img = msDrawLegend(mapserv->Map, MS_FALSE); 
     193 
     194  /* does the format reference an outputFormatObj */ 
     195  if((outputFormat = msSelectOutputFormat( mapserv->Map, queryFormat)) != NULL) { 
     196 
     197    printf("got an output format!\n"); 
     198 
     199  } else { 
     200    if(mapserv->Map->querymap.status) { 
     201      checkWebScale(mapserv); 
     202 
     203      img = msDrawMap(mapserv->Map, MS_TRUE); 
    207204      if(!img) return MS_FAILURE; 
    208       snprintf(buffer, 1024, "%s%sleg%s.%s", mapserv->Map->web.imagepath, mapserv->Map->name, mapserv->Id, MS_IMAGE_EXTENSION(mapserv->Map->outputformat)); 
     205 
     206      snprintf(buffer, 1024, "%s%s%s.%s", mapserv->Map->web.imagepath, mapserv->Map->name, mapserv->Id, MS_IMAGE_EXTENSION(mapserv->Map->outputformat)); 
     207 
    209208      status = msSaveImage(mapserv->Map, img, buffer); 
    210209      if(status != MS_SUCCESS) return status; 
     210 
    211211      msFreeImage(img); 
    212     } 
     212 
     213      if((mapserv->Map->legend.status == MS_ON || mapserv->UseShapes) && mapserv->Map->legend.template == NULL) { 
     214        img = msDrawLegend(mapserv->Map, MS_FALSE); 
     215        if(!img) return MS_FAILURE; 
     216        snprintf(buffer, 1024, "%s%sleg%s.%s", mapserv->Map->web.imagepath, mapserv->Map->name, mapserv->Id, MS_IMAGE_EXTENSION(mapserv->Map->outputformat)); 
     217        status = msSaveImage(mapserv->Map, img, buffer); 
     218        if(status != MS_SUCCESS) return status; 
     219        msFreeImage(img); 
     220      } 
    213221   
    214     if(mapserv->Map->scalebar.status == MS_ON) { 
    215       img = msDrawScalebar(mapserv->Map); 
    216       if(!img) return MS_FAILURE; 
    217       snprintf(buffer, 1024, "%s%ssb%s.%s", mapserv->Map->web.imagepath, mapserv->Map->name, mapserv->Id, MS_IMAGE_EXTENSION(mapserv->Map->outputformat)); 
    218       status = msSaveImage( mapserv->Map, img, buffer); 
    219       if(status != MS_SUCCESS) return status; 
    220       msFreeImage(img); 
    221    
     222      if(mapserv->Map->scalebar.status == MS_ON) { 
     223        img = msDrawScalebar(mapserv->Map); 
     224        if(!img) return MS_FAILURE; 
     225        snprintf(buffer, 1024, "%s%ssb%s.%s", mapserv->Map->web.imagepath, mapserv->Map->name, mapserv->Id, MS_IMAGE_EXTENSION(mapserv->Map->outputformat)); 
     226        status = msSaveImage( mapserv->Map, img, buffer); 
     227        if(status != MS_SUCCESS) return status; 
     228        msFreeImage(img); 
     229     
    222230   
    223     if(mapserv->Map->reference.status == MS_ON) { 
    224       img = msDrawReferenceMap(mapserv->Map); 
    225        if(!img) return MS_FAILURE; 
    226        snprintf(buffer, 1024, "%s%sref%s.%s", mapserv->Map->web.imagepath, mapserv->Map->name, mapserv->Id, MS_IMAGE_EXTENSION(mapserv->Map->outputformat)); 
    227        status = msSaveImage(mapserv->Map, img, buffer); 
    228        if(status != MS_SUCCESS) return status; 
    229        msFreeImage(img); 
    230     } 
    231   } 
    232     
    233   if((status = msReturnQuery(mapserv, pszMimeType, papszBuffer)) != MS_SUCCESS) 
    234     return status; 
     231      if(mapserv->Map->reference.status == MS_ON) { 
     232        img = msDrawReferenceMap(mapserv->Map); 
     233        if(!img) return MS_FAILURE; 
     234        snprintf(buffer, 1024, "%s%sref%s.%s", mapserv->Map->web.imagepath, mapserv->Map->name, mapserv->Id, MS_IMAGE_EXTENSION(mapserv->Map->outputformat)); 
     235        status = msSaveImage(mapserv->Map, img, buffer); 
     236        if(status != MS_SUCCESS) return status; 
     237        msFreeImage(img); 
     238      } 
     239    } 
     240    
     241    if((status = msReturnQuery(mapserv, queryFormat, papszBuffer)) != MS_SUCCESS) 
     242      return status; 
     243  } 
    235244 
    236245  return MS_SUCCESS; 
     
    845854 
    846855  mapserv->LRN = 1; /* layer result counter */ 
    847   msInitShape(&(mapserv->ResultShape)); 
     856  msInitShape(&(mapserv->resultshape)); 
    848857 
    849858  for(i=0; i<layer->resultcache->numresults; i++) { 
    850     status = msLayerGetShape(layer, &(mapserv->ResultShape), layer->resultcache->results[i].tileindex, layer->resultcache->results[i].shapeindex); 
     859    status = msLayerGetShape(layer, &(mapserv->resultshape), layer->resultcache->results[i].tileindex, layer->resultcache->results[i].shapeindex); 
    851860    if(status != MS_SUCCESS) return status; 
    852861 
     
    855864      for(j=0; j<layer->numjoins; j++) { 
    856865        if(layer->joins[j].type == MS_JOIN_ONE_TO_ONE) { 
    857           msJoinPrepare(&(layer->joins[j]), &(mapserv->ResultShape)); 
     866          msJoinPrepare(&(layer->joins[j]), &(mapserv->resultshape)); 
    858867          msJoinNext(&(layer->joins[j])); /* fetch the first row */ 
    859868        } 
     
    868877 
    869878    free(tagInstance); 
    870     msFreeShape(&(mapserv->ResultShape)); /* init too */ 
     879    msFreeShape(&(mapserv->resultshape)); /* init too */ 
    871880 
    872881    mapserv->RN++; /* increment counters */ 
     
    958967  if(lp->resultcache && lp->resultcache->numresults > 0) { 
    959968    /* output the tag content */ 
     969    *line = msStringConcatenate(*line, tag); 
    960970  } 
    961971 
    962972  *line = msStringConcatenate(*line, postTag); 
     973 
     974  /* clean up */ 
     975  msFreeHashTable(tagArgs); tagArgs=NULL; 
     976  free(postTag); 
     977  free(tag); 
    963978 
    964979  return(MS_SUCCESS); 
     
    26332648  if((outbuf = strdup("")) == NULL) return(NULL); /* empty at first */ 
    26342649 
    2635   msJoinPrepare(join, &(mapserv->ResultShape)); /* execute the join */ 
     2650  msJoinPrepare(join, &(mapserv->resultshape)); /* execute the join */ 
    26362651  while(msJoinNext(join) == MS_SUCCESS) { 
    26372652    /* First time through, deal with the header (if necessary) and open the main template. We only */ 
     
    30373052  } 
    30383053 
     3054  if(processResultSetTag(mapserv, &outstr, stream) != MS_SUCCESS) 
     3055    return(NULL); 
     3056 
    30393057  if(mode == QUERY) { /* return shape and/or values  */ 
    3040  
    3041     if(processResultSetTag(mapserv, &outstr, stream) != MS_SUCCESS) 
    3042       return(NULL); 
    30433058 
    30443059    /* allow layer metadata access in a query template, within the context of a query no layer name is necessary */ 
     
    30593074    } 
    30603075     
    3061     sprintf(repstr, "%f %f", (mapserv->ResultShape.bounds.maxx + mapserv->ResultShape.bounds.minx)/2, (mapserv->ResultShape.bounds.maxy + mapserv->ResultShape.bounds.miny)/2);  
     3076    sprintf(repstr, "%f %f", (mapserv->resultshape.bounds.maxx + mapserv->resultshape.bounds.minx)/2, (mapserv->resultshape.bounds.maxy + mapserv->resultshape.bounds.miny)/2);  
    30623077    outstr = msReplaceSubstring(outstr, "[shpmid]", repstr); 
    3063     sprintf(repstr, "%f", (mapserv->ResultShape.bounds.maxx + mapserv->ResultShape.bounds.minx)/2); 
     3078    sprintf(repstr, "%f", (mapserv->resultshape.bounds.maxx + mapserv->resultshape.bounds.minx)/2); 
    30643079    outstr = msReplaceSubstring(outstr, "[shpmidx]", repstr); 
    3065     sprintf(repstr, "%f", (mapserv->ResultShape.bounds.maxy + mapserv->ResultShape.bounds.miny)/2); 
     3080    sprintf(repstr, "%f", (mapserv->resultshape.bounds.maxy + mapserv->resultshape.bounds.miny)/2); 
    30663081    outstr = msReplaceSubstring(outstr, "[shpmidy]", repstr); 
    30673082     
    3068     sprintf(repstr, "%f %f %f %f", mapserv->ResultShape.bounds.minx, mapserv->ResultShape.bounds.miny,  mapserv->ResultShape.bounds.maxx, mapserv->ResultShape.bounds.maxy); 
     3083    sprintf(repstr, "%f %f %f %f", mapserv->resultshape.bounds.minx, mapserv->resultshape.bounds.miny,  mapserv->resultshape.bounds.maxx, mapserv->resultshape.bounds.maxy); 
    30693084    outstr = msReplaceSubstring(outstr, "[shpext]", repstr); 
    30703085      
     
    30733088    free(encodedstr); 
    30743089      
    3075     sprintf(repstr, "%d", mapserv->ResultShape.classindex); 
     3090    sprintf(repstr, "%d", mapserv->resultshape.classindex); 
    30763091    outstr = msReplaceSubstring(outstr, "[shpclass]", repstr); 
    30773092 
    3078     if(processShpxyTag(mapserv->ResultLayer, &outstr, &mapserv->ResultShape) != MS_SUCCESS) 
     3093    if(processShpxyTag(mapserv->ResultLayer, &outstr, &mapserv->resultshape) != MS_SUCCESS) 
    30793094      return(NULL); 
    30803095 
    3081     sprintf(repstr, "%f", mapserv->ResultShape.bounds.minx); 
     3096    sprintf(repstr, "%f", mapserv->resultshape.bounds.minx); 
    30823097    outstr = msReplaceSubstring(outstr, "[shpminx]", repstr); 
    3083     sprintf(repstr, "%f", mapserv->ResultShape.bounds.miny); 
     3098    sprintf(repstr, "%f", mapserv->resultshape.bounds.miny); 
    30843099    outstr = msReplaceSubstring(outstr, "[shpminy]", repstr); 
    3085     sprintf(repstr, "%f", mapserv->ResultShape.bounds.maxx); 
     3100    sprintf(repstr, "%f", mapserv->resultshape.bounds.maxx); 
    30863101    outstr = msReplaceSubstring(outstr, "[shpmaxx]", repstr); 
    3087     sprintf(repstr, "%f", mapserv->ResultShape.bounds.maxy); 
     3102    sprintf(repstr, "%f", mapserv->resultshape.bounds.maxy); 
    30883103    outstr = msReplaceSubstring(outstr, "[shpmaxy]", repstr); 
    30893104     
    3090     sprintf(repstr, "%ld", mapserv->ResultShape.index); 
     3105    sprintf(repstr, "%ld", mapserv->resultshape.index); 
    30913106    outstr = msReplaceSubstring(outstr, "[shpidx]", repstr); 
    3092     sprintf(repstr, "%d", mapserv->ResultShape.tileindex); 
     3107    sprintf(repstr, "%d", mapserv->resultshape.tileindex); 
    30933108    outstr = msReplaceSubstring(outstr, "[tileidx]", repstr);   
    30943109 
     
    30973112      char *valuestr=NULL; 
    30983113 
    3099       valuestr = msJoinStrings(mapserv->ResultShape.values, mapserv->ResultLayer->numitems, ","); 
     3114      valuestr = msJoinStrings(mapserv->resultshape.values, mapserv->ResultLayer->numitems, ","); 
    31003115      outstr = msReplaceSubstring(outstr, "[values]", valuestr); 
    31013116      free(valuestr); 
     
    31063121      snprintf(substr, PROCESSLINE_BUFLEN, "[%s]", mapserv->ResultLayer->items[i]); 
    31073122      if(strstr(outstr, substr) != NULL) { 
    3108         encodedstr = msEncodeHTMLEntities(mapserv->ResultShape.values[i]); 
     3123        encodedstr = msEncodeHTMLEntities(mapserv->resultshape.values[i]); 
    31093124        outstr = msReplaceSubstring(outstr, substr, encodedstr); 
    31103125        free(encodedstr); 
     
    31143129      snprintf(substr, PROCESSLINE_BUFLEN, "[%s_esc]", mapserv->ResultLayer->items[i]); 
    31153130      if(strstr(outstr, substr) != NULL) { 
    3116         encodedstr = msEncodeUrl(mapserv->ResultShape.values[i]); 
     3131        encodedstr = msEncodeUrl(mapserv->resultshape.values[i]); 
    31173132        outstr = msReplaceSubstring(outstr, substr, encodedstr); 
    31183133        free(encodedstr); 
     
    31223137      snprintf(substr, PROCESSLINE_BUFLEN, "[%s_raw]", mapserv->ResultLayer->items[i]); 
    31233138      if(strstr(outstr, substr) != NULL) 
    3124         outstr = msReplaceSubstring(outstr, substr, mapserv->ResultShape.values[i]); 
     3139        outstr = msReplaceSubstring(outstr, substr, mapserv->resultshape.values[i]); 
    31253140    } 
    31263141     
    3127     if(processItemTag(mapserv->ResultLayer, &outstr, &mapserv->ResultShape) != MS_SUCCESS) 
     3142    if(processItemTag(mapserv->ResultLayer, &outstr, &mapserv->resultshape) != MS_SUCCESS) 
    31283143      return(NULL); 
    31293144 
     
    33263341  } 
    33273342   
    3328   msInitShape(&(mapserv->ResultShape)); 
     3343  msInitShape(&(mapserv->resultshape)); 
    33293344 
    33303345  if((mapserv->Mode == ITEMQUERY) || (mapserv->Mode == QUERY)) { /* may need to handle a URL result set */ 
     
    33593374        if(status != MS_SUCCESS) return status; 
    33603375 
    3361         status = msLayerGetShape(lp, &(mapserv->ResultShape), lp->resultcache->results[0].tileindex, lp->resultcache->results[0].shapeindex); 
     3376        status = msLayerGetShape(lp, &(mapserv->resultshape), lp->resultcache->results[0].tileindex, lp->resultcache->results[0].shapeindex); 
    33623377        if(status != MS_SUCCESS) return status; 
    33633378 
     
    33673382            if(status != MS_SUCCESS) return status;   
    33683383 
    3369             msJoinPrepare(&(lp->joins[k]), &(mapserv->ResultShape)); 
     3384            msJoinPrepare(&(lp->joins[k]), &(mapserv->resultshape)); 
    33703385            msJoinNext(&(lp->joins[k])); /* fetch the first row */ 
    33713386          } 
     
    33763391        } 
    33773392 
    3378         msFreeShape(&(mapserv->ResultShape)); 
     3393        msFreeShape(&(mapserv->resultshape)); 
    33793394        msLayerClose(lp); 
    33803395        mapserv->ResultLayer = NULL; 
     
    34493464    mapserv->LRN = 1; /* layer result number */ 
    34503465    for(j=0; j<lp->resultcache->numresults; j++) { 
    3451       status = msLayerGetShape(lp, &(mapserv->ResultShape), lp->resultcache->results[j].tileindex, lp->resultcache->results[j].shapeindex); 
     3466      status = msLayerGetShape(lp, &(mapserv->resultshape), lp->resultcache->results[j].tileindex, lp->resultcache->results[j].shapeindex); 
    34523467      if(status != MS_SUCCESS) return status; 
    34533468 
     
    34563471        for(k=0; k<lp->numjoins; k++) { 
    34573472          if(lp->joins[k].type == MS_JOIN_ONE_TO_ONE) { 
    3458             msJoinPrepare(&(lp->joins[k]), &(mapserv->ResultShape)); 
     3473            msJoinPrepare(&(lp->joins[k]), &(mapserv->resultshape)); 
    34593474            msJoinNext(&(lp->joins[k])); /* fetch the first row */ 
    34603475          } 
     
    34693484      if(msReturnPage(mapserv, template, QUERY, papszBuffer) != MS_SUCCESS) return MS_FAILURE; 
    34703485 
    3471       msFreeShape(&(mapserv->ResultShape)); /* init too */ 
     3486      msFreeShape(&(mapserv->resultshape)); /* init too */ 
    34723487 
    34733488      mapserv->RN++; /* increment counters */ 
  • trunk/mapserver/maptemplate.h

    r7553 r7569  
    8080 
    8181 
    82    shapeObj SelectShape, ResultShape; 
     82   shapeObj SelectShape, resultshape; 
    8383 
    8484   rectObj RawExt;