Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OGR 4 : * Purpose: Implements OGRAVCE00DataSource class. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * James Flemer <jflemer@alum.rpi.edu> 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 2002, Frank Warmerdam <warmerdam@pobox.com> 10 : * Copyright (c) 2006, James Flemer <jflemer@alum.rpi.edu> 11 : * 12 : * SPDX-License-Identifier: MIT 13 : ****************************************************************************/ 14 : 15 : #include "ogr_avc.h" 16 : #include "cpl_conv.h" 17 : #include "cpl_string.h" 18 : 19 : /************************************************************************/ 20 : /* OGRAVCE00DataSource() */ 21 : /************************************************************************/ 22 : 23 4 : OGRAVCE00DataSource::OGRAVCE00DataSource() 24 4 : : nLayers(0), psE00(nullptr), papoLayers(nullptr) 25 : { 26 4 : } 27 : 28 : /************************************************************************/ 29 : /* ~OGRAVCE00DataSource() */ 30 : /************************************************************************/ 31 : 32 8 : OGRAVCE00DataSource::~OGRAVCE00DataSource() 33 : 34 : { 35 4 : if (psE00) 36 : { 37 3 : AVCE00ReadCloseE00(psE00); 38 3 : psE00 = nullptr; 39 : } 40 : 41 11 : for (int i = 0; i < nLayers; i++) 42 7 : delete papoLayers[i]; 43 : 44 4 : CPLFree(papoLayers); 45 8 : } 46 : 47 : /************************************************************************/ 48 : /* Open() */ 49 : /************************************************************************/ 50 : 51 4 : int OGRAVCE00DataSource::Open(const char *pszNewName, int bTestOpen) 52 : 53 : { 54 : /* -------------------------------------------------------------------- */ 55 : /* Open the source file. Suppress error reporting if we are in */ 56 : /* TestOpen mode. */ 57 : /* -------------------------------------------------------------------- */ 58 4 : bool bCompressed = false; 59 : 60 4 : if (bTestOpen) 61 4 : CPLPushErrorHandler(CPLQuietErrorHandler); 62 : 63 4 : psE00 = AVCE00ReadOpenE00(pszNewName); 64 : 65 5 : if (CPLGetLastErrorNo() == CPLE_OpenFailed && 66 1 : strstr(CPLGetLastErrorMsg(), "compressed E00") != nullptr) 67 : { 68 1 : bCompressed = true; 69 : } 70 : 71 4 : if (bTestOpen) 72 : { 73 4 : CPLPopErrorHandler(); 74 4 : CPLErrorReset(); 75 : } 76 : 77 4 : if (psE00 == nullptr) 78 : { 79 1 : if (bCompressed) 80 : { 81 1 : CPLError(CE_Failure, CPLE_OpenFailed, 82 : "This looks like a compressed E00 file and cannot be " 83 : "processed directly. You may need to uncompress it " 84 : "first using the E00compr library or the e00conv " 85 : "program."); 86 : } 87 1 : return FALSE; 88 : } 89 : 90 : /* pszCoverageName = CPLStrdup( psE00->pszCoverName ); */ 91 3 : pszCoverageName = CPLStrdup(pszNewName); 92 : 93 : /* -------------------------------------------------------------------- */ 94 : /* Create layers for the "interesting" sections of the coverage. */ 95 : /* -------------------------------------------------------------------- */ 96 3 : papoLayers = static_cast<OGRAVCE00Layer **>( 97 3 : CPLCalloc(sizeof(OGRAVCE00Layer *), psE00->numSections)); 98 3 : nLayers = 0; 99 : 100 24 : for (int iSection = 0; iSection < psE00->numSections; iSection++) 101 : { 102 21 : AVCE00Section *psSec = psE00->pasSections + iSection; 103 : 104 21 : switch (psSec->eType) 105 : { 106 7 : case AVCFileARC: 107 : case AVCFilePAL: 108 : case AVCFileCNT: 109 : case AVCFileLAB: 110 : case AVCFileRPL: 111 : case AVCFileTXT: 112 7 : papoLayers[nLayers++] = new OGRAVCE00Layer(this, psSec); 113 7 : break; 114 : 115 0 : case AVCFileTX6: 116 0 : break; 117 : 118 12 : case AVCFileTABLE: 119 12 : CheckAddTable(psSec); 120 12 : break; 121 : 122 2 : case AVCFilePRJ: 123 : { 124 : #if 0 125 : poSRS = new OGRSpatialReference(); 126 : poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); 127 : AVCE00File *hFile 128 : = AVCE00ReadOpen( psE00->pszCoverPath, 129 : psSec->pszFilename, 130 : psE00->eCoverType, 131 : psSec->eType, 132 : psE00->psDBCSInfo); 133 : if( hFile && poSRS == NULL ) 134 : { 135 : char **papszPRJ = AVCE00ReadNextPrj( hFile ); 136 : 137 : poSRS = new OGRSpatialReference(); 138 : poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); 139 : if( poSRS->importFromESRI( papszPRJ ) != OGRERR_NONE ) 140 : { 141 : CPLError( CE_Warning, CPLE_AppDefined, 142 : "Failed to parse PRJ section, ignoring." ); 143 : delete poSRS; 144 : poSRS = NULL; 145 : } 146 : AVCE00ReadClose( hFile ); 147 : } 148 : #endif 149 : } 150 2 : break; 151 : 152 21 : default:; 153 : } 154 : } 155 : 156 3 : return nLayers > 0; 157 : } 158 : 159 12 : int OGRAVCE00DataSource::CheckAddTable(AVCE00Section *psTblSection) 160 : { 161 12 : int nCount = 0; 162 43 : for (int i = 0; i < nLayers; ++i) 163 : { 164 31 : if (papoLayers[i]->CheckSetupTable(psTblSection)) 165 3 : ++nCount; 166 : } 167 12 : return nCount; 168 : } 169 : 170 : /************************************************************************/ 171 : /* TestCapability() */ 172 : /************************************************************************/ 173 : 174 0 : int OGRAVCE00DataSource::TestCapability(const char * /* pszCap */) 175 : { 176 0 : return FALSE; 177 : } 178 : 179 : /************************************************************************/ 180 : /* GetLayer() */ 181 : /************************************************************************/ 182 : 183 11 : OGRLayer *OGRAVCE00DataSource::GetLayer(int iLayer) 184 : 185 : { 186 11 : if (iLayer < 0 || iLayer >= nLayers) 187 0 : return nullptr; 188 : 189 11 : return papoLayers[iLayer]; 190 : } 191 : 192 : /************************************************************************/ 193 : /* GetSpatialRef() */ 194 : /************************************************************************/ 195 7 : OGRSpatialReference *OGRAVCE00DataSource::DSGetSpatialRef() 196 : { 197 7 : if (m_bSRSFetched) 198 4 : return poSRS; 199 3 : m_bSRSFetched = true; 200 3 : if (psE00 == nullptr) 201 0 : return nullptr; 202 : 203 13 : for (int iSection = 0; iSection < psE00->numSections; iSection++) 204 : { 205 12 : AVCE00Section *psSec = psE00->pasSections + iSection; 206 12 : if (psSec->eType == AVCFilePRJ) 207 : { 208 2 : AVCE00ReadGotoSectionE00(psE00, psSec, 0); 209 2 : void *obj = AVCE00ReadNextObjectE00(psE00); 210 2 : if (psE00->hParseInfo->eFileType == AVCFilePRJ) 211 : { 212 2 : char **pszPRJ = static_cast<char **>(obj); 213 2 : if (pszPRJ) 214 : { 215 2 : poSRS = new OGRSpatialReference(); 216 2 : poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); 217 2 : if (poSRS->importFromESRI(pszPRJ) != OGRERR_NONE) 218 : { 219 0 : CPLError(CE_Warning, CPLE_AppDefined, 220 : "Failed to parse PRJ section, ignoring."); 221 0 : delete poSRS; 222 0 : poSRS = nullptr; 223 : } 224 : } 225 : } 226 2 : break; 227 : } 228 : } 229 : 230 3 : return poSRS; 231 : }