Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OGR 4 : * Purpose: Implements OGRAVCBinDataSource class. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2002, Frank Warmerdam <warmerdam@pobox.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "ogr_avc.h" 14 : #include "cpl_conv.h" 15 : #include "cpl_string.h" 16 : 17 : /************************************************************************/ 18 : /* OGRAVCBinDataSource() */ 19 : /************************************************************************/ 20 : 21 453 : OGRAVCBinDataSource::OGRAVCBinDataSource() 22 453 : : papoLayers(nullptr), nLayers(0), psAVC(nullptr) 23 : { 24 453 : poSRS = nullptr; 25 453 : } 26 : 27 : /************************************************************************/ 28 : /* ~OGRAVCBinDataSource() */ 29 : /************************************************************************/ 30 : 31 906 : OGRAVCBinDataSource::~OGRAVCBinDataSource() 32 : 33 : { 34 453 : if (psAVC) 35 : { 36 3 : AVCE00ReadClose(psAVC); 37 3 : psAVC = nullptr; 38 : } 39 : 40 460 : for (int i = 0; i < nLayers; i++) 41 7 : delete papoLayers[i]; 42 : 43 453 : CPLFree(papoLayers); 44 906 : } 45 : 46 : /************************************************************************/ 47 : /* Open() */ 48 : /************************************************************************/ 49 : 50 453 : int OGRAVCBinDataSource::Open(const char *pszNewName, int bTestOpen) 51 : 52 : { 53 : /* -------------------------------------------------------------------- */ 54 : /* Open the source file. Suppress error reporting if we are in */ 55 : /* TestOpen mode. */ 56 : /* -------------------------------------------------------------------- */ 57 453 : if (bTestOpen) 58 453 : CPLPushErrorHandler(CPLQuietErrorHandler); 59 : 60 453 : psAVC = AVCE00ReadOpen(pszNewName); 61 : 62 453 : if (bTestOpen) 63 : { 64 453 : CPLPopErrorHandler(); 65 453 : CPLErrorReset(); 66 : } 67 : 68 453 : if (psAVC == nullptr) 69 450 : return FALSE; 70 : 71 3 : pszCoverageName = CPLStrdup(psAVC->pszCoverName); 72 : 73 : // Read SRS first 74 41 : for (int iSection = 0; iSection < psAVC->numSections; iSection++) 75 : { 76 38 : AVCE00Section *psSec = psAVC->pasSections + iSection; 77 : 78 38 : switch (psSec->eType) 79 : { 80 2 : case AVCFilePRJ: 81 : { 82 4 : AVCBinFile *hFile = AVCBinReadOpen( 83 2 : psAVC->pszCoverPath, psSec->pszFilename, psAVC->eCoverType, 84 2 : psSec->eType, psAVC->psDBCSInfo); 85 2 : if (hFile && poSRS == nullptr) 86 : { 87 2 : char **papszPRJ = AVCBinReadNextPrj(hFile); 88 : 89 2 : poSRS = new OGRSpatialReference(); 90 2 : poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); 91 2 : if (poSRS->importFromESRI(papszPRJ) != OGRERR_NONE) 92 : { 93 0 : CPLError(CE_Warning, CPLE_AppDefined, 94 : "Failed to parse PRJ section, ignoring."); 95 0 : delete poSRS; 96 0 : poSRS = nullptr; 97 : } 98 : } 99 2 : if (hFile) 100 : { 101 2 : AVCBinReadClose(hFile); 102 : } 103 : } 104 2 : break; 105 : 106 36 : default: 107 36 : break; 108 : } 109 : } 110 : 111 : /* -------------------------------------------------------------------- */ 112 : /* Create layers for the "interesting" sections of the coverage. */ 113 : /* -------------------------------------------------------------------- */ 114 : 115 3 : papoLayers = static_cast<OGRLayer **>( 116 3 : CPLCalloc(sizeof(OGRLayer *), psAVC->numSections)); 117 3 : nLayers = 0; 118 : 119 41 : for (int iSection = 0; iSection < psAVC->numSections; iSection++) 120 : { 121 38 : AVCE00Section *psSec = psAVC->pasSections + iSection; 122 : 123 38 : switch (psSec->eType) 124 : { 125 7 : case AVCFileARC: 126 : case AVCFilePAL: 127 : case AVCFileCNT: 128 : case AVCFileLAB: 129 : case AVCFileRPL: 130 : case AVCFileTXT: 131 : case AVCFileTX6: 132 7 : papoLayers[nLayers++] = new OGRAVCBinLayer(this, psSec); 133 7 : break; 134 : 135 31 : default: 136 31 : break; 137 : } 138 : } 139 : 140 3 : return nLayers > 0; 141 : } 142 : 143 : /************************************************************************/ 144 : /* TestCapability() */ 145 : /************************************************************************/ 146 : 147 0 : int OGRAVCBinDataSource::TestCapability(CPL_UNUSED const char *pszCap) 148 : { 149 0 : return FALSE; 150 : } 151 : 152 : /************************************************************************/ 153 : /* GetLayer() */ 154 : /************************************************************************/ 155 : 156 11 : OGRLayer *OGRAVCBinDataSource::GetLayer(int iLayer) 157 : 158 : { 159 11 : if (iLayer < 0 || iLayer >= nLayers) 160 0 : return nullptr; 161 : 162 11 : return papoLayers[iLayer]; 163 : }