Changeset 13906

Show
Ignore:
Timestamp:
03/01/08 08:08:28 (4 months ago)
Author:
rouault
Message:

Fix memory usage and leaks in OGRILI2 (bug #2203)

Files:

Legend:

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

    r13354 r13906  
    102102int getGeometryTypeOfElem(DOMElement* elem) { 
    103103  int type = ILI2_STRING_TYPE; 
     104  char* pszTagName = XMLString::transcode(elem->getTagName()); 
    104105 
    105106  if (elem && elem->getNodeType() == DOMNode::ELEMENT_NODE) { 
    106     if (cmpStr(ILI2_COORD, XMLString::transcode(elem->getTagName())) == 0) { 
     107    if (cmpStr(ILI2_COORD, pszTagName) == 0) { 
    107108      type = ILI2_COORD_TYPE; 
    108     } else if (cmpStr(ILI2_ARC, XMLString::transcode(elem->getTagName())) == 0) { 
     109    } else if (cmpStr(ILI2_ARC, pszTagName) == 0) { 
    109110      type = ILI2_ARC_TYPE; 
    110     } else if (cmpStr(ILI2_POLYLINE, XMLString::transcode(elem->getTagName())) == 0) { 
     111    } else if (cmpStr(ILI2_POLYLINE, pszTagName) == 0) { 
    111112      type = ILI2_POLYLINE_TYPE; 
    112     } else if (cmpStr(ILI2_BOUNDARY, XMLString::transcode(elem->getTagName())) == 0) { 
     113    } else if (cmpStr(ILI2_BOUNDARY, pszTagName) == 0) { 
    113114      type = ILI2_BOUNDARY_TYPE; 
    114     } else if (cmpStr(ILI2_AREA, XMLString::transcode(elem->getTagName())) == 0) { 
     115    } else if (cmpStr(ILI2_AREA, pszTagName) == 0) { 
    115116      type = ILI2_AREA_TYPE; 
    116     } else if (cmpStr(ILI2_SURFACE, XMLString::transcode(elem->getTagName())) == 0) { 
     117    } else if (cmpStr(ILI2_SURFACE, pszTagName) == 0) { 
    117118      type = ILI2_AREA_TYPE; 
    118119    } 
    119120  } 
     121  XMLString::release(&pszTagName); 
    120122  return type; 
    121123} 
     
    125127 
    126128  if ((textElem != NULL) && (textElem->getNodeType() == DOMNode::TEXT_NODE)) 
    127     return CPLStrdup(XMLString::transcode(textElem->getNodeValue())); 
     129  { 
     130    char* pszNodeValue = XMLString::transcode(textElem->getNodeValue()); 
     131    char* pszRet = CPLStrdup(pszNodeValue); 
     132    XMLString::release(&pszNodeValue); 
     133    return pszRet; 
     134  } 
    128135 
    129136  return NULL; 
     
    131138 
    132139char *getREFValue(DOMElement *elem) { 
    133   return CPLStrdup(XMLString::transcode(elem->getAttribute(XMLString::transcode(ILI2_REF)))); 
     140  XMLCh* pszIli2_ref = XMLString::transcode(ILI2_REF); 
     141  char* pszREFValue = XMLString::transcode(elem->getAttribute(pszIli2_ref)); 
     142  char* pszRet = CPLStrdup(pszREFValue); 
     143  XMLString::release(&pszIli2_ref); 
     144  XMLString::release(&pszREFValue); 
     145  return pszRet; 
    134146} 
    135147 
     
    140152  DOMElement *coordElem = (DOMElement *)elem->getFirstChild(); 
    141153  while (coordElem != NULL) { 
    142     if (cmpStr("C1", XMLString::transcode(coordElem->getTagName())) == 0) 
    143       pt->setX(atof(getObjValue(coordElem))); 
    144     else if (cmpStr("C2", XMLString::transcode(coordElem->getTagName())) == 0) 
    145       pt->setY(atof(getObjValue(coordElem))); 
    146     else if (cmpStr("C3", XMLString::transcode(coordElem->getTagName())) == 0) 
    147       pt->setZ(atof(getObjValue(coordElem))); 
     154    char* pszTagName = XMLString::transcode(coordElem->getTagName()); 
     155    char* pszObjValue = getObjValue(coordElem); 
     156    if (cmpStr("C1", pszTagName) == 0) 
     157      pt->setX(atof(pszObjValue)); 
     158    else if (cmpStr("C2", pszTagName) == 0) 
     159      pt->setY(atof(pszObjValue)); 
     160    else if (cmpStr("C3", pszTagName) == 0) 
     161      pt->setZ(atof(pszObjValue)); 
     162    CPLFree(pszObjValue); 
     163    XMLString::release(&pszTagName); 
    148164    coordElem = (DOMElement *)coordElem->getNextSibling(); 
    149165  } 
     
    165181  DOMElement *arcElem = (DOMElement *)elem->getFirstChild(); 
    166182  while (arcElem != NULL) { 
    167     if (cmpStr("C1", XMLString::transcode(arcElem->getTagName())) == 0) 
    168       ptEnd->setX(atof(getObjValue(arcElem))); 
    169     else if (cmpStr("C2", XMLString::transcode(arcElem->getTagName())) == 0) 
    170       ptEnd->setY(atof(getObjValue(arcElem))); 
    171     else if (cmpStr("C3", XMLString::transcode(arcElem->getTagName())) == 0) 
    172       ptEnd->setZ(atof(getObjValue(arcElem))); 
    173     else if (cmpStr("A1", XMLString::transcode(arcElem->getTagName())) == 0) 
    174       ptOnArc->setX(atof(getObjValue(arcElem))); 
    175     else if (cmpStr("A2", XMLString::transcode(arcElem->getTagName())) == 0) 
    176       ptOnArc->setY(atof(getObjValue(arcElem))); 
    177     else if (cmpStr("A3", XMLString::transcode(arcElem->getTagName())) == 0) 
    178       ptOnArc->setZ(atof(getObjValue(arcElem))); 
    179     else if (cmpStr("R", XMLString::transcode(arcElem->getTagName())) == 0) 
    180       radius = atof(getObjValue(arcElem)); 
    181  
     183    char* pszTagName = XMLString::transcode(arcElem->getTagName()); 
     184    char* pszObjValue = getObjValue(arcElem); 
     185    if (cmpStr("C1", pszTagName) == 0) 
     186      ptEnd->setX(atof(pszObjValue)); 
     187    else if (cmpStr("C2", pszTagName) == 0) 
     188      ptEnd->setY(atof(pszObjValue)); 
     189    else if (cmpStr("C3", pszTagName) == 0) 
     190      ptEnd->setZ(atof(pszObjValue)); 
     191    else if (cmpStr("A1", pszTagName) == 0) 
     192      ptOnArc->setX(atof(pszObjValue)); 
     193    else if (cmpStr("A2", pszTagName) == 0) 
     194      ptOnArc->setY(atof(pszObjValue)); 
     195    else if (cmpStr("A3", pszTagName) == 0) 
     196      ptOnArc->setZ(atof(pszObjValue)); 
     197    else if (cmpStr("R", pszTagName) == 0) 
     198      radius = atof(pszObjValue); 
     199    CPLFree(pszObjValue); 
     200    XMLString::release(&pszTagName); 
    182201    arcElem = (DOMElement *)arcElem->getNextSibling(); 
    183202  } 
     
    194213  DOMElement *lineElem = (DOMElement *)elem->getFirstChild(); 
    195214  while (lineElem != NULL) { 
    196     if (cmpStr(ILI2_COORD, XMLString::transcode(lineElem->getTagName())) == 0) 
     215    char* pszTagName = XMLString::transcode(lineElem->getTagName()); 
     216    if (cmpStr(ILI2_COORD, pszTagName) == 0) 
    197217      ls->addPoint(getPoint(lineElem)); 
    198     else if (cmpStr(ILI2_ARC, XMLString::transcode(lineElem->getTagName())) == 0) { 
     218    else if (cmpStr(ILI2_ARC, pszTagName) == 0) { 
    199219      // end point 
    200220      OGRPoint *ptEnd = new OGRPoint(); 
     
    206226      DOMElement *arcElem = (DOMElement *)lineElem->getFirstChild(); 
    207227      while (arcElem != NULL) { 
    208         if (cmpStr("C1", XMLString::transcode(arcElem->getTagName())) == 0) 
    209           ptEnd->setX(atof(getObjValue(arcElem))); 
    210         else if (cmpStr("C2", XMLString::transcode(arcElem->getTagName())) == 0) 
    211           ptEnd->setY(atof(getObjValue(arcElem))); 
    212         else if (cmpStr("C3", XMLString::transcode(arcElem->getTagName())) == 0) 
    213           ptEnd->setZ(atof(getObjValue(arcElem))); 
    214         else if (cmpStr("A1", XMLString::transcode(arcElem->getTagName())) == 0) 
    215           ptOnArc->setX(atof(getObjValue(arcElem))); 
    216         else if (cmpStr("A2", XMLString::transcode(arcElem->getTagName())) == 0) 
    217           ptOnArc->setY(atof(getObjValue(arcElem))); 
    218         else if (cmpStr("A3", XMLString::transcode(arcElem->getTagName())) == 0) 
    219           ptOnArc->setZ(atof(getObjValue(arcElem))); 
    220         else if (cmpStr("R", XMLString::transcode(arcElem->getTagName())) == 0) 
    221           radius = atof(getObjValue(arcElem)); 
     228        char* pszTagName = XMLString::transcode(arcElem->getTagName()); 
     229        char* pszObjValue = getObjValue(arcElem); 
     230        if (cmpStr("C1", pszTagName) == 0) 
     231          ptEnd->setX(atof(pszObjValue)); 
     232        else if (cmpStr("C2", pszTagName) == 0) 
     233          ptEnd->setY(atof(pszObjValue)); 
     234        else if (cmpStr("C3", pszTagName) == 0) 
     235          ptEnd->setZ(atof(pszObjValue)); 
     236        else if (cmpStr("A1", pszTagName) == 0) 
     237          ptOnArc->setX(atof(pszObjValue)); 
     238        else if (cmpStr("A2", pszTagName) == 0) 
     239          ptOnArc->setY(atof(pszObjValue)); 
     240        else if (cmpStr("A3", pszTagName) == 0) 
     241          ptOnArc->setZ(atof(pszObjValue)); 
     242        else if (cmpStr("R", pszTagName) == 0) 
     243          radius = atof(pszObjValue); 
     244        CPLFree(pszObjValue); 
     245        XMLString::release(&pszTagName); 
    222246 
    223247        arcElem = (DOMElement *)arcElem->getNextSibling(); 
     
    230254    } /* else { // FIXME StructureValue in Polyline not yet supported 
    231255    } */ 
     256    XMLString::release(&pszTagName); 
    232257 
    233258    lineElem = (DOMElement *)lineElem->getNextSibling(); 
     
    241266  DOMElement *lineElem = (DOMElement *)elem->getFirstChild(); 
    242267  if (lineElem != NULL) 
    243     if (cmpStr(ILI2_POLYLINE, XMLString::transcode(lineElem->getTagName())) == 0) 
     268  { 
     269    char* pszTagName = XMLString::transcode(lineElem->getTagName()); 
     270    if (cmpStr(ILI2_POLYLINE, pszTagName) == 0) 
     271    { 
     272      XMLString::release(&pszTagName); 
    244273      return getLineString(lineElem); 
     274    } 
     275    XMLString::release(&pszTagName); 
     276  } 
    245277 
    246278  return new OGRLineString; 
     
    252284  DOMElement *boundaryElem = (DOMElement *)elem->getFirstChild(); // outer boundary 
    253285  while (boundaryElem != NULL) { 
    254     if (cmpStr(ILI2_BOUNDARY, XMLString::transcode(boundaryElem->getTagName())) == 0) 
     286    char* pszTagName = XMLString::transcode(boundaryElem->getTagName()); 
     287    if (cmpStr(ILI2_BOUNDARY, pszTagName) == 0) 
    255288      pg->addRing((OGRLinearRing *)getBoundary(boundaryElem)); 
    256  
     289    XMLString::release(&pszTagName); 
    257290    boundaryElem = (DOMElement *)boundaryElem->getNextSibling(); // inner boundaries 
    258291  } 
     
    266299  DOMElement *childElem = elem; 
    267300  while (childElem != NULL) { 
     301    char* pszTagName = XMLString::transcode(childElem->getTagName()); 
    268302    switch (type) { 
    269303      case ILI2_COORD_TYPE : 
    270         if (cmpStr(ILI2_COORD, XMLString::transcode(childElem->getTagName())) == 0) 
     304        if (cmpStr(ILI2_COORD, pszTagName) == 0) 
     305        { 
     306          delete gm; 
     307          XMLString::release(&pszTagName); 
    271308          return getPoint(childElem); 
     309        } 
    272310        break; 
    273311      case ILI2_ARC_TYPE : 
    274312        // is it possible here? It have to be a ARC or COORD before (getPreviousSibling) 
    275         if (cmpStr(ILI2_ARC, XMLString::transcode(childElem->getTagName())) == 0) 
     313        if (cmpStr(ILI2_ARC, pszTagName) == 0) 
     314        { 
     315          delete gm; 
     316          XMLString::release(&pszTagName); 
    276317          return getArc(childElem); 
     318        } 
    277319        break; 
    278320      case ILI2_POLYLINE_TYPE : 
    279         if (cmpStr(ILI2_POLYLINE, XMLString::transcode(childElem->getTagName())) == 0) 
     321        if (cmpStr(ILI2_POLYLINE, pszTagName) == 0) 
     322        { 
     323          delete gm; 
     324          XMLString::release(&pszTagName); 
    280325          return getLineString(childElem); 
     326        } 
    281327        break; 
    282328      case ILI2_BOUNDARY_TYPE : 
    283         if (cmpStr(ILI2_BOUNDARY, XMLString::transcode(childElem->getTagName())) == 0) 
     329        if (cmpStr(ILI2_BOUNDARY, pszTagName) == 0) 
     330        { 
     331          delete gm; 
     332          XMLString::release(&pszTagName); 
    284333          return getLineString(childElem); 
     334        } 
    285335        break; 
    286336      case ILI2_AREA_TYPE : 
    287         if ((cmpStr(ILI2_AREA, XMLString::transcode(childElem->getTagName())) == 0) || 
    288           (cmpStr(ILI2_SURFACE, XMLString::transcode(childElem->getTagName())) == 0)) 
     337        if ((cmpStr(ILI2_AREA, pszTagName) == 0) || 
     338          (cmpStr(ILI2_SURFACE, pszTagName) == 0)) 
     339        { 
     340          delete gm; 
     341          XMLString::release(&pszTagName); 
    289342          return getPolygon(childElem); 
     343        } 
    290344        break; 
    291345      default : 
    292346        if (type >= ILI2_GEOMCOLL_TYPE) { 
    293347          int subType = getGeometryTypeOfElem(childElem); //???? 
    294           gm->addGeometry(getGeometry(childElem, subType)); 
     348          gm->addGeometryDirectly(getGeometry(childElem, subType)); 
    295349        } 
    296350        break; 
    297351    } 
     352    XMLString::release(&pszTagName); 
    298353 
    299354    // GEOMCOLL 
     
    429484  for (d=depth-1; d>=0; --d) { 
    430485    if (d < depth-1) fullname += "_"; 
    431     fullname += XMLString::transcode(elements[d]->getNodeName()); 
     486    char* pszNodeName = XMLString::transcode(elements[d]->getNodeName()); 
     487    fullname += pszNodeName; 
     488    XMLString::release(&pszNodeName); 
    432489  } 
    433490  return CPLStrdup(fullname.c_str()); 
     
    448505        if (featureDef->GetFieldIndex(fName) == -1) { 
    449506          CPLDebug( "OGR_ILI", "AddFieldDefn: %s",fName ); 
    450           OGRFieldDefn *fieldDef = new OGRFieldDefn(fName, OFTString); 
    451           featureDef->AddFieldDefn(fieldDef); 
     507          OGRFieldDefn oFieldDefn(fName, OFTString); 
     508          featureDef->AddFieldDefn(&oFieldDefn); 
    452509        } 
    453510        CPLFree(fName); 
     
    475532            objVal = getREFValue(childElem); // only to try 
    476533          feature->SetField(fIndex, objVal); 
     534          CPLFree(objVal); 
    477535        } else { 
    478536          m_missAttrs.push_back(fName); 
     
    481539      } 
    482540    } else { 
    483       feature->SetGeometry(getGeometry(childElem, type)); 
     541      feature->SetGeometryDirectly(getGeometry(childElem, type)); 
    484542    } 
    485543  } 
     
    507565 
    508566    CleanupParser(); 
     567 
     568    list<OGRLayer *>::const_iterator layerIt = m_listLayer.begin(); 
     569    while (layerIt != m_listLayer.end()) { 
     570        OGRILI2Layer *tmpLayer = (OGRILI2Layer *)*layerIt; 
     571        delete tmpLayer; 
     572        layerIt++; 
     573    } 
    509574} 
    510575 
     
    652717    OGRwkbGeometryType eReqType = wkbUnknown; 
    653718    OGRILI2DataSource *poDSIn = NULL; 
    654     curLayer = new OGRILI2Layer(CPLStrdup(pszName), poSRSIn, bWriterIn, eReqType, poDSIn); 
     719    curLayer = new OGRILI2Layer(pszName, poSRSIn, bWriterIn, eReqType, poDSIn); 
    655720    m_listLayer.push_back(curLayer); 
    656721  } 
     
    660725  if (newLayer) { 
    661726    // the TID feature 
    662     OGRFieldDefn *fieldDef = new OGRFieldDefn(CPLStrdup(ILI2_TID), OFTString); 
    663     featureDef->AddFieldDefn(fieldDef); 
     727    OGRFieldDefn ofieldDefn (ILI2_TID, OFTString); 
     728    featureDef->AddFieldDefn(&ofieldDefn); 
    664729 
    665730    setFieldDefn(featureDef, elem); 
     
    671736  // the TID feature 
    672737  int fIndex = feature->GetFieldIndex(ILI2_TID); 
    673   char *fChVal = XMLString::transcode(elem->getAttribute(XMLString::transcode(ILI2_TID))); 
    674   feature->SetField(fIndex, CPLStrdup(fChVal)); 
     738  XMLCh *pszIli2_tid = XMLString::transcode(ILI2_TID); 
     739  char *fChVal = XMLString::transcode(elem->getAttribute(pszIli2_tid)); 
     740  feature->SetField(fIndex, fChVal); 
     741  XMLString::release (&pszIli2_tid); 
     742  XMLString::release (&fChVal); 
    675743 
    676744  SetFieldValues(feature, elem); 
    677745  curLayer->SetFeature(feature); 
     746   
     747  XMLString::release (&pszName); 
    678748 
    679749  return 0; 
     
    683753    return new ILI2Reader(); 
    684754} 
     755 
     756void DestroyILI2Reader(IILI2Reader* reader) 
     757{ 
     758    if (reader) 
     759        delete reader; 
     760} 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ili2reader.h

    r10645 r13906  
    5555 
    5656IILI2Reader *CreateILI2Reader(); 
     57void DestroyILI2Reader(IILI2Reader* reader); 
    5758 
    5859#endif 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ogr_ili2.h

    r10645 r13906  
    4949    OGRSpatialReference *poSRS; 
    5050    OGRFeatureDefn     *poFeatureDefn; 
    51     OGRGeometry        *poFilterGeom; 
    5251    std::list<OGRFeature *>    listFeature; 
    5352    std::list<OGRFeature *>::const_iterator listFeatureIt; 
     
    6665                       ~OGRILI2Layer(); 
    6766 
    68     OGRGeometry *       GetSpatialFilter() { return poFilterGeom; } 
    69     void                SetSpatialFilter( OGRGeometry * ); 
    70  
    7167    OGRErr              SetFeature(OGRFeature *poFeature); 
    7268     
     
    7571 
    7672    int                 GetFeatureCount( int bForce = TRUE ); 
    77     OGRErr              GetExtent(OGREnvelope *psExtent, int bForce = TRUE); 
    7873 
    7974    OGRErr              CreateFeature( OGRFeature *poFeature ); 
     
    9893     
    9994    char        *pszName; 
    100     const char  *pszModelFilename; 
    10195    IILI2Reader *poReader; 
    10296    IOM_FILE    fpTransfer;  //for writing 
    10397    IOM_BASKET  basket; 
     98 
     99    int         nLayers; 
     100    OGRILI2Layer** papoLayers; 
    104101 
    105102  public: 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ogrili2datasource.cpp

    r12773 r13906  
    5151    fpTransfer = NULL; 
    5252    basket = NULL; 
     53    nLayers = 0; 
     54    papoLayers = NULL; 
    5355} 
    5456 
     
    6062 
    6163{ 
     64    int i; 
     65 
     66    for(i=0;i<nLayers;i++) 
     67    { 
     68        delete papoLayers[i]; 
     69    } 
     70    CPLFree( papoLayers ); 
     71 
    6272    if (basket) iom_releasebasket(basket); 
    6373    if (fpTransfer) 
     
    7282   
    7383    } 
     84    DestroyILI2Reader( poReader ); 
    7485    CPLFree( pszName ); 
    7586} 
     
    92103    if( CSLCount(filenames) > 1 ) 
    93104        modelFilenames = &filenames[1]; 
    94  
    95     CSLDestroy( filenames ); 
    96105 
    97106/* -------------------------------------------------------------------- */ 
     
    106115                      pszNewName ); 
    107116 
     117        CSLDestroy( filenames ); 
    108118        return FALSE; 
    109119    } 
     
    125135        { // "www.interlis.ch/INTERLIS2.2" 
    126136            VSIFClose( fp ); 
     137            CSLDestroy( filenames ); 
    127138            return FALSE; 
    128139        } 
     
    143154                  "configured in.",  
    144155                  pszNewName ); 
     156        CSLDestroy( filenames ); 
    145157        return FALSE; 
    146158    } 
     
    160172    listLayer = poReader->GetLayers(); 
    161173 
     174    CSLDestroy( filenames ); 
     175 
    162176    return TRUE; 
    163177} 
     
    173187{ 
    174188    char **filenames = CSLTokenizeString2( pszFilename, ",", 0 ); 
    175     pszName = filenames[0]
    176     pszModelFilename = (CSLCount(filenames)>1) ? filenames[1] : NULL; 
     189    pszName = CPLStrdup(filenames[0])
     190    const char  *pszModelFilename = (CSLCount(filenames)>1) ? filenames[1] : NULL; 
    177191 
    178192    if( pszModelFilename == NULL ) 
     
    181195                  "Model file '%s' (%s) not found.",  
    182196                  pszModelFilename, pszFilename, VSIStrerror( errno ) ); 
    183         return FALSE; 
    184     } 
    185  
    186         iom_init(); 
    187  
    188         // set error listener to a iom provided one, that just  
    189         // dumps all errors to stderr 
    190         iom_seterrlistener(iom_stderrlistener); 
    191  
    192         // compile ili model 
     197        CSLDestroy(filenames); 
     198        return FALSE; 
     199    } 
     200 
     201    iom_init(); 
     202 
     203    // set error listener to a iom provided one, that just  
     204    // dumps all errors to stderr 
     205    iom_seterrlistener(iom_stderrlistener); 
     206 
     207    // compile ili model 
    193208    char *iliFiles[1] = {(char *)pszModelFilename}; 
    194        IOM_BASKET model=iom_compileIli(1,iliFiles); 
    195        if(!model){ 
     209    IOM_BASKET model=iom_compileIli(1,iliFiles); 
     210    if(!model){ 
    196211        CPLError( CE_Warning, CPLE_OpenFailed,  
    197                   "iom_compileIli .",  
    198                   pszName, VSIStrerror( errno ) ); 
    199                 iom_end(); 
    200         return FALSE; 
    201         } 
    202  
    203         // open new file 
    204         fpTransfer=iom_open(pszName,IOM_CREATE | IOM_DONTREAD,0); 
    205         if(!fpTransfer){ 
     212                    "iom_compileIli .",  
     213                    pszName, VSIStrerror( errno ) ); 
     214                iom_end(); 
     215        CSLDestroy(filenames); 
     216        return FALSE; 
     217    } 
     218 
     219    // open new file 
     220    fpTransfer=iom_open(pszName,IOM_CREATE | IOM_DONTREAD,0); 
     221    if(!fpTransfer){ 
    206222        CPLError( CE_Warning, CPLE_OpenFailed,  
    207                   "Failed to open %s.",  
    208                   pszName ); 
    209         return FALSE; 
    210         } 
    211  
    212         // set model of new file 
    213         iom_setmodel(fpTransfer,model); 
    214  
    215         iom_setheadsender(fpTransfer, pszModelFilename); 
    216  
    217         iom_setheadcomment(fpTransfer,"Created by OGR"); 
     223                    "Failed to open %s.",  
     224                    pszName ); 
     225        CSLDestroy(filenames); 
     226        return FALSE; 
     227    } 
     228 
     229    // set model of new file 
     230    iom_setmodel(fpTransfer,model); 
     231 
     232    iom_setheadsender(fpTransfer, pszModelFilename); 
     233 
     234    iom_setheadcomment(fpTransfer,"Created by OGR"); 
    218235 
    219236    // create new basket 
     
    233250    } 
    234251 
     252    CSLDestroy(filenames); 
     253 
    235254    basket=iom_newbasket(fpTransfer); 
    236255    iom_setbaskettag(basket, basketname); 
     
    250269 
    251270{ 
    252     OGRILI2Layer *poLayer = new OGRILI2Layer(CPLStrdup(pszLayerName), poSRS, TRUE, eType, this); 
     271    OGRILI2Layer *poLayer = new OGRILI2Layer(pszLayerName, poSRS, TRUE, eType, this); 
     272 
     273    nLayers ++; 
     274    papoLayers = (OGRILI2Layer**)CPLRealloc(papoLayers, sizeof(OGRILI2Layer*) * nLayers); 
     275    papoLayers[nLayers-1] = poLayer; 
     276 
    253277    return poLayer; 
    254278} 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ogrili2driver.cpp

    r10645 r13906  
    109109/************************************************************************/ 
    110110 
    111 void RegisterOGRILI2() { 
     111void RegisterOGRILI2() 
     112
    112113    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( new OGRILI2Driver ); 
    113114} 
  • trunk/gdal/ogr/ogrsf_frmts/ili/ogrili2layer.cpp

    r11251 r13906  
    4444 
    4545{ 
    46     poFilterGeom = NULL; 
    47  
    4846    if( poSRSIn == NULL ) 
    4947        poSRS = NULL; 
     
    7371        poSRS->Release(); 
    7472 
    75     if( poFilterGeom != NULL ) 
    76         delete poFilterGeom; 
    77 
    78  
    79 /************************************************************************/ 
    80 /*                          SetSpatialFilter()                          */ 
    81 /************************************************************************/ 
    82  
    83 void OGRILI2Layer::SetSpatialFilter( OGRGeometry * poGeomIn ) 
    84  
    85 
    86     if( poFilterGeom != NULL ) 
    87     { 
    88         delete poFilterGeom; 
    89         poFilterGeom = NULL; 
    90     } 
    91  
    92     if( poGeomIn != NULL ) 
    93         poFilterGeom = poGeomIn->clone(); 
    94 
     73    listFeatureIt = listFeature.begin(); 
     74    while(listFeatureIt != listFeature.end()) 
     75    { 
     76      OGRFeature *poFeature = *(listFeatureIt++); 
     77      delete poFeature; 
     78    } 
     79
     80 
    9581 
    9682/************************************************************************/ 
     
    117103OGRFeature *OGRILI2Layer::GetNextFeature() { 
    118104    OGRFeature *poFeature = NULL; 
    119     if (listFeatureIt != listFeature.end()) 
     105    while (listFeatureIt != listFeature.end()) 
    120106    { 
    121107      poFeature = *(listFeatureIt++); 
     
    134120/************************************************************************/ 
    135121 
    136 int OGRILI2Layer::GetFeatureCount( int bForce ) { 
    137   return listFeature.size(); //nTotalILI2Count; 
    138 
    139  
    140 /************************************************************************/ 
    141 /*                             GetExtent()                              */ 
    142 /************************************************************************/ 
    143  
    144 OGRErr OGRILI2Layer::GetExtent(OGREnvelope *psExtent, int bForce ) { 
    145   return OGRLayer::GetExtent( psExtent, bForce ); 
     122int OGRILI2Layer::GetFeatureCount( int bForce ) 
     123
     124    if (m_poFilterGeom == NULL && m_poAttrQuery == NULL) 
     125    { 
     126        return listFeature.size(); 
     127    } 
     128    else 
     129    { 
     130        return OGRLayer::GetFeatureCount(bForce); 
     131    } 
    146132} 
    147133