LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/avc - ogravcbindatasource.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 54 60 90.0 %
Date: 2024-11-21 22:18:42 Functions: 5 6 83.3 %

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

Generated by: LCOV version 1.14