Changeset 7583

Show
Ignore:
Timestamp:
05/12/08 16:34:12 (2 months ago)
Author:
dmorissette
Message:

Call msHTTP* code only when we have WMS/WFS layers to draw (#2615)

Files:

Legend:

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

    r7577 r7583  
    292292#if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) 
    293293  enum MS_CONNECTION_TYPE lastconnectiontype; 
    294   httpRequestObj *pasOWSReqInfo
    295   int numOWSRequests=0; 
     294  httpRequestObj *pasOWSReqInfo=NULL
     295  int numOWSLayers=0, numOWSRequests=0; 
    296296  wmsParamsObj sLastWMSParams; 
    297  
    298   /* Alloc and init pasOWSReqInfo... for now we alloc numlayers+1 entries 
    299    * but this could definitely be optimized 
    300    */ 
    301   pasOWSReqInfo = (httpRequestObj *)malloc((map->numlayers+1)*sizeof(httpRequestObj)); 
    302   if (pasOWSReqInfo == NULL) { 
    303     msSetError(MS_MEMERR, "Allocation of httpRequestObj failed.", "msDrawMap()"); 
    304     return NULL; 
    305   } 
    306  
    307   msHTTPInitRequestObj(pasOWSReqInfo, map->numlayers+1); 
    308   msInitWmsParamsObj(&sLastWMSParams); 
    309297#endif 
    310298 
     
    322310  if(!image) { 
    323311    msSetError(MS_IMGERR, "Unable to initialize image.", "msDrawMap()"); 
     312    return(NULL); 
     313  } 
     314 
    324315#if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) 
    325     msFreeWmsParamsObj(&sLastWMSParams); 
    326     msFree(pasOWSReqInfo); 
    327 #endif 
    328     return(NULL); 
    329   } 
    330  
    331 #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) 
    332   /* Pre-download all WMS/WFS layers in parallel before starting to draw map */ 
    333   lastconnectiontype = MS_SHAPEFILE; 
     316  /* How many OWS (WMS/WFS) layers do we have to draw? 
     317   * Note: numOWSLayers is the number of actual layers and numOWSRequests is 
     318   * the number of HTTP requests which could be lower if multiple layers  
     319   * are merged into the same request. 
     320   */ 
     321  numOWSLayers=0; 
    334322  for(i=0; i<map->numlayers; i++) { 
    335     /* if(map->layerorder[i] == -1 || !msLayerIsVisible(map, &(map->layers[map->layerorder[i]]))) */ 
    336     if(map->layerorder[i] == -1 || !msLayerIsVisible(map, GET_LAYER(map,map->layerorder[i]))) 
    337       continue; 
    338  
    339     lp = GET_LAYER(map,map->layerorder[i]); 
     323    if(map->layerorder[i] != -1 &&  
     324       msLayerIsVisible(map, GET_LAYER(map,map->layerorder[i]))) 
     325        numOWSLayers++; 
     326  } 
     327 
     328  if (numOWSLayers > 0) { 
     329    /* Alloc and init pasOWSReqInfo... 
     330     */ 
     331    pasOWSReqInfo = (httpRequestObj *)malloc((numOWSLayers+1)*sizeof(httpRequestObj)); 
     332    if (pasOWSReqInfo == NULL) { 
     333      msSetError(MS_MEMERR, "Allocation of httpRequestObj failed.", "msDrawMap()"); 
     334      return NULL; 
     335    } 
     336    msHTTPInitRequestObj(pasOWSReqInfo, numOWSLayers+1); 
     337    msInitWmsParamsObj(&sLastWMSParams); 
     338 
     339    /* Pre-download all WMS/WFS layers in parallel before starting to draw map */ 
     340    lastconnectiontype = MS_SHAPEFILE; 
     341    for(i=0; numOWSLayers && i<map->numlayers; i++) { 
     342      if(map->layerorder[i] == -1 || !msLayerIsVisible(map, GET_LAYER(map,map->layerorder[i]))) 
     343        continue; 
     344 
     345      lp = GET_LAYER(map,map->layerorder[i]); 
    340346 
    341347#ifdef USE_WMS_LYR 
    342     if(lp->connectiontype == MS_WMS) { 
    343       if(msPrepareWMSLayerRequest(map->layerorder[i], map, lp, lastconnectiontype, &sLastWMSParams, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) { 
    344         msFreeWmsParamsObj(&sLastWMSParams); 
    345         msFreeImage(image); 
    346         msFree(pasOWSReqInfo); 
    347         return NULL; 
    348      
    349    
     348      if(lp->connectiontype == MS_WMS) { 
     349        if(msPrepareWMSLayerRequest(map->layerorder[i], map, lp, lastconnectiontype, &sLastWMSParams, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) { 
     350          msFreeWmsParamsObj(&sLastWMSParams); 
     351          msFreeImage(image); 
     352          msFree(pasOWSReqInfo); 
     353          return NULL; 
     354       
     355     
    350356#endif 
    351357 
    352358#ifdef USE_WFS_LYR 
    353     if(lp->connectiontype == MS_WFS) { 
    354       if(msPrepareWFSLayerRequest(map->layerorder[i], map, lp, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) { 
    355         msFreeWmsParamsObj(&sLastWMSParams); 
    356         msFreeImage(image); 
    357         msFree(pasOWSReqInfo); 
    358         return NULL; 
    359      
    360    
    361 #endif 
    362  
    363     lastconnectiontype = lp->connectiontype; 
    364  
     359      if(lp->connectiontype == MS_WFS) { 
     360        if(msPrepareWFSLayerRequest(map->layerorder[i], map, lp, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) { 
     361          msFreeWmsParamsObj(&sLastWMSParams); 
     362          msFreeImage(image); 
     363          msFree(pasOWSReqInfo); 
     364          return NULL; 
     365       
     366     
     367#endif 
     368 
     369      lastconnectiontype = lp->connectiontype; 
     370   
    365371 
    366372#ifdef USE_WMS_LYR 
    367373  msFreeWmsParamsObj(&sLastWMSParams); 
    368374#endif 
     375  } /* if numOWSLayers > 0 */ 
    369376 
    370377  if(numOWSRequests && msOWSExecuteRequests(pasOWSReqInfo, numOWSRequests, map, MS_TRUE) == MS_FAILURE) { 
     
    437444          msFreeImage(image); 
    438445#if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) 
    439           msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); 
    440           msFree(pasOWSReqInfo); 
     446          if (pasOWSReqInfo) { 
     447            msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); 
     448            msFree(pasOWSReqInfo); 
     449          } 
    441450#endif /* USE_WMS_LYR || USE_WFS_LYR */ 
    442451          return(NULL); 
     
    482491    msFreeImage(image); 
    483492#if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) 
    484     msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); 
    485     msFree(pasOWSReqInfo); 
     493    if (pasOWSReqInfo) { 
     494      msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); 
     495      msFree(pasOWSReqInfo); 
     496    } 
    486497#endif /* USE_WMS_LYR || USE_WFS_LYR */ 
    487498    return(NULL); 
     
    534545      msFreeImage(image); 
    535546#if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) 
    536       msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); 
    537       msFree(pasOWSReqInfo); 
     547      if (pasOWSReqInfo) { 
     548        msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); 
     549        msFree(pasOWSReqInfo); 
     550      } 
    538551#endif /* USE_WMS_LYR || USE_WFS_LYR */ 
    539552      return(NULL); 
     
    572585#if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) 
    573586  /* Cleanup WMS/WFS Request stuff */ 
    574   msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); 
    575   msFree(pasOWSReqInfo); 
     587  if (pasOWSReqInfo) { 
     588    msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); 
     589    msFree(pasOWSReqInfo); 
     590  } 
    576591#endif 
    577592