Changeset 13902

Show
Ignore:
Timestamp:
02/29/08 17:26:44 (4 months ago)
Author:
rouault
Message:

Fix #2203

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/ogr/ogrsf_frmts/ili/ili1reader.cpp

    r13716 r13902  
    7272 
    7373ILI1Reader::~ILI1Reader() { 
     74 int i; 
    7475 if (fpItf) VSIFClose( fpItf ); 
     76 
     77 for(i=0;i<nLayers;i++) 
     78     delete papoLayers[i]; 
     79 CPLFree(papoLayers); 
     80 
     81 for(i=0;i<nAreaLayers;i++) 
     82 { 
     83     delete papoAreaLayers[i]; 
     84     delete papoAreaLineLayers[i]; 
     85 } 
     86 CPLFree(papoAreaLayers); 
     87 CPLFree(papoAreaLineLayers); 
     88 
     89 for(i=0;i<nSurfaceLayers;i++) 
     90 { 
     91     delete papoSurfaceLayers[i]; 
     92     delete papoSurfacePolyLayers[i]; 
     93 } 
     94 CPLFree(papoSurfaceLayers); 
     95 CPLFree(papoSurfacePolyLayers); 
    7596} 
    7697 
     
    268289    const char *firsttok = NULL; 
    269290    const char *pszLine; 
    270     const char *topic = NULL; 
     291    char *topic = NULL; 
    271292    int ret = TRUE; 
    272293 
     
    302323      else if (EQUAL(firsttok, "TOPI")) 
    303324      { 
     325        CPLFree(topic); 
    304326        topic = CPLStrdup(CSLGetField(tokens, 1)); 
    305327      } 
     
    330352      else if (EQUAL(firsttok, "ENDE")) 
    331353      { 
     354        CSLDestroy(tokens); 
     355        CPLFree(topic); 
    332356        JoinSurfaceLayers(); 
    333357        PolygonizeAreaLayers(); 
     
    340364 
    341365      CSLDestroy(tokens); 
    342     } 
     366      tokens = NULL; 
     367    } 
     368 
     369    CSLDestroy(tokens); 
     370    CPLFree(topic); 
     371 
    343372    return ret; 
    344373} 
     
    513542 
    514543    OGRFeatureDefn *featureDef = curLayer->GetLayerDefn(); 
    515     OGRFieldDefn *fieldDef = NULL; 
    516544    OGRFeature *feature = NULL; 
    517545 
     
    546574            for (fIndex=1; fIndex<CSLCount(tokens); fIndex++) 
    547575            { 
    548               fieldDef = new OGRFieldDefn(CPLStrdup("Field00"), OFTString)
    549               *(char *)(fieldDef->GetNameRef()+strlen(fieldDef->GetNameRef())-2) = '0'+fIndex/10
    550               *(char *)(fieldDef->GetNameRef()+strlen(fieldDef->GetNameRef())-1) = '0'+fIndex%10
    551               featureDef->AddFieldDefn(fieldDef); 
     576              char szFieldName[32]
     577              sprintf(szFieldName, "Field%02d", fIndex)
     578              OGRFieldDefn oFieldDefn(szFieldName, OFTString)
     579              featureDef->AddFieldDefn(&oFieldDefn); 
    552580            } 
    553581          } 
     
    561589            if (!EQUAL(tokens[fIndex], "@")) { 
    562590              //CPLDebug( "OGR_ILI", "Adding Field %d: %s", fieldno, tokens[fIndex]); 
    563               feature->SetField(fieldno, CPLStrdup(tokens[fIndex])); 
     591              feature->SetField(fieldno, tokens[fIndex]); 
    564592              if (featureDef->GetFieldDefn(fieldno)->GetType() == OFTReal 
    565593                  && fieldno > 0 
     
    733761 
    734762{ 
     763    nLayers++; 
     764 
    735765    papoLayers = (OGRILI1Layer **) 
    736         CPLRealloc( papoLayers, sizeof(void*) * ++nLayers ); 
     766        CPLRealloc( papoLayers, sizeof(void*) * nLayers ); 
    737767 
    738768    papoLayers[nLayers-1] = poNewLayer; 
     
    844874      pszLine = CPLReadLine( fpItf ); 
    845875      conttok = CSLTokenizeString2( pszLine, " ", CSLT_PRESERVEESCAPES ); 
    846       if (!conttok || !EQUAL(conttok[0], "CONT")) break; 
     876      if (!conttok || !EQUAL(conttok[0], "CONT")) 
     877      { 
     878          CSLDestroy(conttok); 
     879          break; 
     880      } 
    847881 
    848882      //append 
     
    860894    return new ILI1Reader(); 
    861895} 
     896 
     897void DestroyILI1Reader(IILI1Reader* reader) 
     898{ 
     899    if (reader) 
     900        delete reader; 
     901} 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ili1reader.h

    r10645 r13902  
    4848 
    4949IILI1Reader *CreateILI1Reader(); 
     50void DestroyILI1Reader(IILI1Reader* reader); 
    5051 
    5152#endif 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ogr_ili1.h

    r11343 r13902  
    4747    OGRSpatialReference *poSRS; 
    4848    OGRFeatureDefn      *poFeatureDefn; 
    49     OGRGeometry         *poFilterGeom; 
    5049 
    5150    int                 nFeatures; 
     
    6665                       ~OGRILI1Layer(); 
    6766 
    68     OGRGeometry *       GetSpatialFilter() { return poFilterGeom; } 
    69     void                SetSpatialFilter( OGRGeometry * ); 
    70  
    7167    OGRErr              AddFeature(OGRFeature *poFeature); 
    7268     
     
    7773 
    7874    int                 GetFeatureCount( int bForce = TRUE ); 
    79     OGRErr              GetExtent(OGREnvelope *psExtent, int bForce = TRUE); 
    8075 
    8176    OGRErr              CreateFeature( OGRFeature *poFeature ); 
     
    10297    FILE       *fpTransfer; 
    10398    char       *pszTopic; 
     99    int         nLayers; 
     100    OGRILI1Layer** papoLayers; 
    104101 
    105102  public: 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ogrili1datasource.cpp

    r13066 r13902  
    5252    fpTransfer = NULL; 
    5353    pszTopic = NULL; 
     54    nLayers = 0; 
     55    papoLayers = NULL; 
    5456} 
    5557 
     
    6163 
    6264{ 
     65    int i; 
     66 
     67    for(i=0;i<nLayers;i++) 
     68    { 
     69        delete papoLayers[i]; 
     70    } 
     71    CPLFree( papoLayers ); 
     72 
    6373    CPLFree( pszName ); 
     74    CPLFree( pszTopic ); 
     75    DestroyILI1Reader( poReader ); 
    6476    if( fpTransfer ) 
    6577    { 
     
    267279        VSIFPrintf( fpTransfer, "TOPI %s\n", pszTopic ); 
    268280      } 
     281      else 
     282      { 
     283        CPLFree(topic); 
     284      } 
    269285    } 
    270286    else if (pszTopic == NULL) 
     
    274290    } 
    275291    VSIFPrintf( fpTransfer, "TABL %s\n", table ); 
    276     OGRILI1Layer *poLayer = new OGRILI1Layer(CPLStrdup(table), poSRS, TRUE, eType, this); 
     292 
     293    OGRILI1Layer *poLayer = new OGRILI1Layer(table, poSRS, TRUE, eType, this); 
     294 
     295    nLayers ++; 
     296    papoLayers = (OGRILI1Layer**)CPLRealloc(papoLayers, sizeof(OGRILI1Layer*) * nLayers); 
     297    papoLayers[nLayers-1] = poLayer; 
     298     
    277299    return poLayer; 
    278300} 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ogrili1layer.cpp

    r13066 r13902  
    4444 
    4545{ 
    46     poFilterGeom = NULL; 
    47  
    4846    if( poSRSIn == NULL ) 
    4947        poSRS = NULL; 
     
    6967 
    7068OGRILI1Layer::~OGRILI1Layer() 
    71  
    72 
     69
     70    int i; 
     71 
     72    for(i=0;i<nFeatures;i++) 
     73    { 
     74        delete papoFeatures[i]; 
     75    } 
     76    CPLFree(papoFeatures); 
     77 
    7378    if( poFeatureDefn ) 
    7479        poFeatureDefn->Release(); 
     
    7681    if( poSRS != NULL ) 
    7782        poSRS->Release(); 
    78  
    79     if( poFilterGeom != NULL ) 
    80         delete poFilterGeom; 
    81 
    82  
    83 /************************************************************************/ 
    84 /*                          SetSpatialFilter()                          */ 
    85 /************************************************************************/ 
    86  
    87 void OGRILI1Layer::SetSpatialFilter( OGRGeometry * poGeomIn ) 
    88  
    89 
    90     if( poFilterGeom != NULL ) 
    91     { 
    92         delete poFilterGeom; 
    93         poFilterGeom = NULL; 
    94     } 
    95  
    96     if( poGeomIn != NULL ) 
    97         poFilterGeom = poGeomIn->clone(); 
    98 
    99  
    100 OGRErr OGRILI1Layer::AddFeature (OGRFeature *poFeature) { 
     83
     84 
     85 
     86OGRErr OGRILI1Layer::AddFeature (OGRFeature *poFeature) 
     87
     88    nFeatures++; 
     89 
    10190    papoFeatures = (OGRFeature **) 
    102         CPLRealloc( papoFeatures, sizeof(void*) * ++nFeatures ); 
     91        CPLRealloc( papoFeatures, sizeof(void*) * nFeatures ); 
    10392 
    10493    papoFeatures[nFeatures-1] = poFeature; 
     
    119108/************************************************************************/ 
    120109 
    121 OGRFeature *OGRILI1Layer::GetNextFeature() { 
    122     OGRFeature *poFeature = GetNextFeatureRef(); 
    123     return poFeature ? poFeature->Clone() : NULL; 
     110OGRFeature *OGRILI1Layer::GetNextFeature() 
     111
     112    OGRFeature *poFeature; 
     113 
     114    while(nFeatureIdx < nFeatures) 
     115    { 
     116        poFeature = GetNextFeatureRef(); 
     117        if (poFeature) 
     118            return poFeature->Clone(); 
     119    } 
     120    return NULL; 
    124121} 
    125122 
     
    162159/************************************************************************/ 
    163160 
    164 int OGRILI1Layer::GetFeatureCount( int bForce ) { 
    165     return nFeatures; 
    166 
    167  
    168 /************************************************************************/ 
    169 /*                             GetExtent()                              */ 
    170 /************************************************************************/ 
    171  
    172 OGRErr OGRILI1Layer::GetExtent(OGREnvelope *psExtent, int bForce ) { 
    173   return OGRLayer::GetExtent( psExtent, bForce ); 
     161int OGRILI1Layer::GetFeatureCount( int bForce ) 
     162
     163    if (m_poFilterGeom == NULL && m_poAttrQuery == NULL) 
     164    { 
     165        return nFeatures; 
     166    } 
     167    else 
     168    { 
     169        return OGRLayer::GetFeatureCount(bForce); 
     170    } 
    174171} 
    175172