LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/avc - ogravce00datasource.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 70 79 88.6 %
Date: 2024-11-21 22:18:42 Functions: 7 8 87.5 %

          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             : }

Generated by: LCOV version 1.14