OGRAVCE00Layer::~OGRAVCE00Layer() { if (psRead) { AVCE00ReadCloseE00(psRead); psRead = NULL; } if (psTableRead) { AVCE00ReadCloseE00(psTableRead); psTableRead = NULL; } if (pszTableFilename) { CPLFree(pszTableFilename); pszTableFilename = NULL; } }
OGRAVCE00DataSource::~OGRAVCE00DataSource() { if( psE00 ) { AVCE00ReadCloseE00( psE00 ); psE00 = NULL; } CPLFree( pszName ); for( int i = 0; i < nLayers; i++ ) delete papoLayers[i]; CPLFree( papoLayers ); }
int OGRAVCE00Layer::AppendTableFields( OGRFeature *poFeature ) { if (psTableRead == NULL) return FALSE; /* -------------------------------------------------------------------- */ /* Open the table if it is currently closed. */ /* -------------------------------------------------------------------- */ if (psTableRead == NULL) { psTableRead = AVCE00ReadOpenE00(pszTableFilename); if (psTableRead == NULL) return FALSE; /* advance to the specified line number */ if (AVCE00ReadGotoSectionE00(psTableRead, psTableSection, 0) != 0) { AVCE00ReadCloseE00(psTableRead); psTableRead = NULL; return FALSE; } nTablePos = 0; } /* -------------------------------------------------------------------- */ /* Read the info record. */ /* */ /* We usually assume the FID of the feature is the key but in a */ /* polygon coverage we need to use the PolyId attribute of LAB */ /* features to lookup the related attributes. In this case */ /* nTableAttrIndex will already be setup to refer to the */ /* PolyId field. */ /* -------------------------------------------------------------------- */ int nRecordId; void *hRecord; if( nTableAttrIndex == -1 ) nRecordId = (int) poFeature->GetFID(); else nRecordId = poFeature->GetFieldAsInteger( nTableAttrIndex ); if (nRecordId <= nTablePos) { if (AVCE00ReadGotoSectionE00(psTableRead, psTableSection, 0) != 0) return FALSE; nTablePos = 0; } do { hRecord = AVCE00ReadNextObjectE00(psTableRead); ++nTablePos; } while (NULL != hRecord && nTablePos < nRecordId); if( hRecord == NULL ) return FALSE; /* -------------------------------------------------------------------- */ /* Translate it. */ /* -------------------------------------------------------------------- */ return TranslateTableFields( poFeature, nTableBaseField, psTableRead->hParseInfo->hdr.psTableDef, (AVCField *) hRecord ); }
int OGRAVCE00Layer::CheckSetupTable(AVCE00Section *psTblSectionIn) { if (psTableRead) return FALSE; const char *pszTableType = NULL; switch (eSectionType) { case AVCFileARC: pszTableType = ".AAT"; break; case AVCFilePAL: case AVCFileLAB: pszTableType = ".PAT"; break; default: break; } /* -------------------------------------------------------------------- */ /* Is the table type found anywhere in the section pszName? Do */ /* a case insensitive check. */ /* -------------------------------------------------------------------- */ if( pszTableType == NULL ) return FALSE; int iCheckOff; for( iCheckOff = 0; psTblSectionIn->pszName[iCheckOff] != '\0'; iCheckOff++ ) { if( EQUALN(psTblSectionIn->pszName + iCheckOff, pszTableType, strlen(pszTableType) ) ) break; } if( psTblSectionIn->pszName[iCheckOff] == '\0' ) return FALSE; psTableSection = psTblSectionIn; /* -------------------------------------------------------------------- */ /* Try opening the table. */ /* -------------------------------------------------------------------- */ psTableRead = AVCE00ReadOpenE00(psTblSectionIn->pszFilename); if (psTableRead == NULL) return FALSE; /* advance to the specified line number */ if (AVCE00ReadGotoSectionE00(psTableRead, psTableSection, 0) != 0) { AVCE00ReadCloseE00(psTableRead); psTableRead = NULL; return FALSE; } AVCE00ReadNextObjectE00(psTableRead); bNeedReset = 1; pszTableFilename = CPLStrdup(psTblSectionIn->pszFilename); nTableBaseField = poFeatureDefn->GetFieldCount(); if (eSectionType == AVCFileLAB) { AVCE00ReadE00Ptr psInfo = ((OGRAVCE00DataSource *) poDS)->GetInfo(); for( int iSection = 0; iSection < psInfo->numSections; iSection++ ) { if( psInfo->pasSections[iSection].eType == AVCFilePAL ) nTableAttrIndex = poFeatureDefn->GetFieldIndex( "PolyId" ); } } /* -------------------------------------------------------------------- */ /* Setup attributes. */ /* -------------------------------------------------------------------- */ AppendTableDefinition( psTableRead->hParseInfo->hdr.psTableDef ); /* -------------------------------------------------------------------- */ /* Close table so we don't have to many files open at once. */ /* -------------------------------------------------------------------- */ /* AVCE00ReadCloseE00( psTableRead ); */ return TRUE; }