LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/vdv - ogr_vdv.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 19 19 100.0 %
Date: 2025-09-10 17:48:50 Functions: 7 7 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  VDV Translator
       4             :  * Purpose:  Implements OGRVDVDriver.
       5             :  * Author:   Even Rouault, even.rouault at spatialys.com
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2015, Even Rouault <even.rouault at spatialys.com>
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #ifndef OGR_VDV_H_INCLUDED
      14             : #define OGR_VDV_H_INCLUDED
      15             : 
      16             : #include "ogrsf_frmts.h"
      17             : #include <vector>
      18             : #include <map>
      19             : #include <mutex>
      20             : #include <utility>
      21             : 
      22             : class OGRVDVDataSource;
      23             : 
      24             : /************************************************************************/
      25             : /*                        OGRIDFDataSource                              */
      26             : /************************************************************************/
      27             : 
      28             : class OGRIDFDataSource final : public GDALDataset
      29             : {
      30             :     CPLString m_osFilename{};
      31             :     VSILFILE *m_fpL = nullptr;
      32             :     mutable bool m_bHasParsed = false;
      33             :     mutable GDALDataset *m_poTmpDS = nullptr;
      34             :     mutable bool m_bDestroyTmpDS = false;
      35             :     mutable std::mutex m_oMutex{};
      36             : 
      37             :     std::pair<GDALDataset *, bool> Parse() const;
      38             : 
      39             :   public:
      40             :     explicit OGRIDFDataSource(const char *pszFilename, VSILFILE *fpL);
      41             :     ~OGRIDFDataSource() override;
      42             : 
      43             :     int GetLayerCount() const override;
      44             :     const OGRLayer *GetLayer(int) const override;
      45             :     int TestCapability(const char *pszCap) const override;
      46             : };
      47             : 
      48             : /************************************************************************/
      49             : /*                          OGRVDVLayer                                 */
      50             : /************************************************************************/
      51             : 
      52             : class OGRVDVLayer final : public OGRLayer
      53             : {
      54             :     GDALDataset *m_poDS = nullptr;
      55             :     VSILFILE *m_fpL;
      56             :     bool m_bOwnFP;
      57             :     bool m_bRecodeFromLatin1;
      58             :     vsi_l_offset m_nStartOffset;
      59             :     vsi_l_offset m_nCurOffset;
      60             :     GIntBig m_nTotalFeatureCount;
      61             :     GIntBig m_nFID;
      62             :     OGRFeatureDefn *m_poFeatureDefn;
      63             :     bool m_bEOF;
      64             :     int m_iLongitudeVDV452;
      65             :     int m_iLatitudeVDV452;
      66             : 
      67             :   public:
      68             :     OGRVDVLayer(GDALDataset *poDS, const CPLString &osTableName, VSILFILE *fpL,
      69             :                 bool bOwnFP, bool bRecodeFromLatin1, vsi_l_offset nStartOffset);
      70             :     ~OGRVDVLayer() override;
      71             : 
      72             :     void ResetReading() override;
      73             :     OGRFeature *GetNextFeature() override;
      74             :     GIntBig GetFeatureCount(int bForce) override;
      75             : 
      76        1404 :     const OGRFeatureDefn *GetLayerDefn() const override
      77             :     {
      78        1404 :         return m_poFeatureDefn;
      79             :     }
      80             : 
      81             :     int TestCapability(const char *pszCap) const override;
      82             : 
      83           4 :     GDALDataset *GetDataset() override
      84             :     {
      85           4 :         return m_poDS;
      86             :     }
      87             : 
      88          70 :     void SetFeatureCount(GIntBig nTotalFeatureCount)
      89             :     {
      90          70 :         m_nTotalFeatureCount = nTotalFeatureCount;
      91          70 :     }
      92             : };
      93             : 
      94             : class OGRVDV452Field
      95             : {
      96             :   public:
      97             :     CPLString osEnglishName;
      98             :     CPLString osGermanName;
      99             :     CPLString osType;
     100             :     int nWidth;
     101             : 
     102        1617 :     OGRVDV452Field() : nWidth(0)
     103             :     {
     104        1617 :     }
     105             : };
     106             : 
     107             : class OGRVDV452Table
     108             : {
     109             :   public:
     110             :     CPLString osEnglishName;
     111             :     CPLString osGermanName;
     112             :     std::vector<OGRVDV452Field> aosFields;
     113             : };
     114             : 
     115             : class OGRVDV452Tables
     116             : {
     117             :   public:
     118             :     std::vector<OGRVDV452Table *> aosTables;
     119             :     std::map<CPLString, OGRVDV452Table *> oMapEnglish;
     120             :     std::map<CPLString, OGRVDV452Table *> oMapGerman;
     121             : 
     122         119 :     OGRVDV452Tables()
     123         119 :     {
     124         119 :     }
     125             : 
     126         119 :     ~OGRVDV452Tables()
     127         119 :     {
     128         357 :         for (size_t i = 0; i < aosTables.size(); i++)
     129         238 :             delete aosTables[i];
     130         119 :     }
     131             : };
     132             : 
     133             : /************************************************************************/
     134             : /*                          OGRVDVWriterLayer                           */
     135             : /************************************************************************/
     136             : 
     137             : class OGRVDVWriterLayer final : public OGRLayer
     138             : {
     139             :     OGRVDVDataSource *m_poDS;
     140             :     OGRFeatureDefn *m_poFeatureDefn;
     141             :     bool m_bWritePossible;
     142             :     VSILFILE *m_fpL;
     143             :     bool m_bOwnFP;
     144             :     GIntBig m_nFeatureCount;
     145             :     OGRVDV452Table *m_poVDV452Table;
     146             :     CPLString m_osVDV452Lang;
     147             :     bool m_bProfileStrict;
     148             :     int m_iLongitudeVDV452;
     149             :     int m_iLatitudeVDV452;
     150             : 
     151             :     bool WriteSchemaIfNeeded();
     152             : 
     153             :   public:
     154             :     OGRVDVWriterLayer(OGRVDVDataSource *poDS, const char *pszName,
     155             :                       VSILFILE *fpL, bool bOwnFP,
     156             :                       OGRVDV452Table *poVDV452Table = nullptr,
     157             :                       const CPLString &osVDV452Lang = "",
     158             :                       bool bProfileStrict = false);
     159             :     ~OGRVDVWriterLayer() override;
     160             : 
     161             :     void ResetReading() override;
     162             :     OGRFeature *GetNextFeature() override;
     163             : 
     164             :     using OGRLayer::GetLayerDefn;
     165             : 
     166         511 :     const OGRFeatureDefn *GetLayerDefn() const override
     167             :     {
     168         511 :         return m_poFeatureDefn;
     169             :     }
     170             : 
     171             :     int TestCapability(const char *pszCap) const override;
     172             :     virtual OGRErr CreateField(const OGRFieldDefn *poFieldDefn,
     173             :                                int bApproxOK = TRUE) override;
     174             :     OGRErr ICreateFeature(OGRFeature *poFeature) override;
     175             :     GIntBig GetFeatureCount(int bForce = TRUE) override;
     176             : 
     177             :     GDALDataset *GetDataset() override;
     178             : 
     179             :     void StopAsCurrentLayer();
     180             : };
     181             : 
     182             : /************************************************************************/
     183             : /*                        OGRVDVDataSource                              */
     184             : /************************************************************************/
     185             : 
     186             : class OGRVDVDataSource final : public GDALDataset
     187             : {
     188             :     CPLString m_osFilename;
     189             :     VSILFILE *m_fpL;
     190             :     bool m_bUpdate;
     191             :     bool m_bSingleFile;
     192             :     bool m_bNew;
     193             :     mutable bool m_bLayersDetected;
     194             :     mutable int m_nLayerCount;
     195             :     mutable OGRLayer **m_papoLayers;
     196             :     OGRVDVWriterLayer *m_poCurrentWriterLayer;
     197             :     bool m_bMustWriteEof;
     198             :     bool m_bVDV452Loaded;
     199             :     OGRVDV452Tables m_oVDV452Tables;
     200             :     mutable std::mutex m_oMutex{};
     201             : 
     202             :     void DetectLayers() const;
     203             : 
     204             :   public:
     205             :     OGRVDVDataSource(const char *pszFilename, VSILFILE *fpL, bool bUpdate,
     206             :                      bool bSingleFile, bool bNew);
     207             :     ~OGRVDVDataSource() override;
     208             : 
     209             :     int GetLayerCount() const override;
     210             :     const OGRLayer *GetLayer(int) const override;
     211             : 
     212             :     OGRLayer *ICreateLayer(const char *pszName,
     213             :                            const OGRGeomFieldDefn *poGeomFieldDefn,
     214             :                            CSLConstList papszOptions) override;
     215             : 
     216             :     int TestCapability(const char *pszCap) const override;
     217             : 
     218             :     void SetCurrentWriterLayer(OGRVDVWriterLayer *poLayer);
     219             : 
     220             :     static GDALDataset *Open(GDALOpenInfo *poOpenInfo);
     221             :     static GDALDataset *Create(const char *pszName, int /*nXSize*/,
     222             :                                int /*nYSize*/, int /*nBands*/,
     223             :                                GDALDataType /*eType*/, char **papszOptions);
     224             : };
     225             : 
     226             : #endif /* ndef OGR_VDV_H_INCLUDED */

Generated by: LCOV version 1.14