LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/ili - imdreader.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 54 55 98.2 %
Date: 2025-01-18 12:42:00 Functions: 11 11 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  Interlis 1/2 Translator
       4             :  * Purpose:  IlisMeta model reader.
       5             :  * Author:   Pirmin Kalberer, Sourcepole AG
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2014, Pirmin Kalberer, Sourcepole AG
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #ifndef IMDREADER_H_INCLUDED
      14             : #define IMDREADER_H_INCLUDED
      15             : 
      16             : #include "cpl_vsi.h"
      17             : #include "cpl_error.h"
      18             : #include "ogr_feature.h"
      19             : #include <list>
      20             : #include <map>
      21             : 
      22             : class GeomFieldInfo
      23             : {
      24             :     OGRFeatureDefn *geomTable; /* separate geometry table for Ili 1 */
      25             :   public:
      26             :     CPLString iliGeomType;
      27             : 
      28          74 :     GeomFieldInfo() : geomTable(nullptr)
      29             :     {
      30          74 :     }
      31             : 
      32         208 :     ~GeomFieldInfo()
      33         208 :     {
      34         208 :         if (geomTable)
      35          63 :             geomTable->Release();
      36         208 :     }
      37             : 
      38         134 :     GeomFieldInfo(const GeomFieldInfo &other)
      39         134 :     {
      40         134 :         geomTable = other.geomTable;
      41         134 :         if (geomTable)
      42          47 :             geomTable->Reference();
      43         134 :         iliGeomType = other.iliGeomType;
      44         134 :     }
      45             : 
      46             :     GeomFieldInfo &operator=(const GeomFieldInfo &other)
      47             :     {
      48             :         if (this != &other)
      49             :         {
      50             :             if (geomTable)
      51             :                 geomTable->Release();
      52             :             geomTable = other.geomTable;
      53             :             if (geomTable)
      54             :                 geomTable->Reference();
      55             :             iliGeomType = other.iliGeomType;
      56             :         }
      57             :         return *this;
      58             :     }
      59             : 
      60          50 :     OGRFeatureDefn *GetGeomTableDefnRef() const
      61             :     {
      62          50 :         return geomTable;
      63             :     }
      64             : 
      65          16 :     void SetGeomTableDefn(OGRFeatureDefn *geomTableIn)
      66             :     {
      67          16 :         CPLAssert(geomTable == nullptr);
      68          16 :         geomTable = geomTableIn;
      69          16 :         if (geomTable)
      70          16 :             geomTable->Reference();
      71          16 :     }
      72             : };
      73             : 
      74             : typedef std::map<CPLString, GeomFieldInfo>
      75             :     GeomFieldInfos; /* key: geom field name, value: ILI geom field info */
      76             : typedef std::map<CPLString, CPLString>
      77             :     StructFieldInfos; /* key: struct field name, value: struct table */
      78             : 
      79             : class FeatureDefnInfo
      80             : {
      81             :     OGRFeatureDefn *poTableDefn;
      82             : 
      83             :   public:
      84             :     GeomFieldInfos poGeomFieldInfos;
      85             :     StructFieldInfos poStructFieldInfos;
      86             : 
      87         660 :     FeatureDefnInfo() : poTableDefn(nullptr)
      88             :     {
      89         660 :     }
      90             : 
      91         746 :     ~FeatureDefnInfo()
      92         746 :     {
      93         746 :         if (poTableDefn)
      94         475 :             poTableDefn->Release();
      95         746 :     }
      96             : 
      97          86 :     FeatureDefnInfo(const FeatureDefnInfo &other)
      98          86 :     {
      99          86 :         poTableDefn = other.poTableDefn;
     100          86 :         if (poTableDefn)
     101          86 :             poTableDefn->Reference();
     102          86 :         poGeomFieldInfos = other.poGeomFieldInfos;
     103          86 :         poStructFieldInfos = other.poStructFieldInfos;
     104          86 :     }
     105             : 
     106           4 :     FeatureDefnInfo &operator=(const FeatureDefnInfo &other)
     107             :     {
     108           4 :         if (this != &other)
     109             :         {
     110           4 :             if (poTableDefn)
     111           0 :                 poTableDefn->Release();
     112           4 :             poTableDefn = other.poTableDefn;
     113           4 :             if (poTableDefn)
     114           4 :                 poTableDefn->Reference();
     115           4 :             poGeomFieldInfos = other.poGeomFieldInfos;
     116           4 :             poStructFieldInfos = other.poStructFieldInfos;
     117             :         }
     118           4 :         return *this;
     119             :     }
     120             : 
     121         209 :     OGRFeatureDefn *GetTableDefnRef() const
     122             :     {
     123         209 :         return poTableDefn;
     124             :     }
     125             : 
     126         385 :     void SetTableDefn(OGRFeatureDefn *poTableDefnIn)
     127             :     {
     128         385 :         CPLAssert(poTableDefn == nullptr);
     129         385 :         poTableDefn = poTableDefnIn;
     130         385 :         if (poTableDefn)
     131         385 :             poTableDefn->Reference();
     132         385 :     }
     133             : };
     134             : 
     135             : typedef std::list<FeatureDefnInfo> FeatureDefnInfos;
     136             : 
     137             : class IliModelInfo
     138             : {
     139             :   public:
     140             :     CPLString name;
     141             :     CPLString version;
     142             :     CPLString uri;
     143             : };
     144             : 
     145             : typedef std::list<IliModelInfo> IliModelInfos;
     146             : 
     147             : class ImdReader
     148             : {
     149             :   public:           // TODO(schwehr): Private?
     150             :     int iliVersion; /* 1 or 2 */
     151             :     IliModelInfos modelInfos;
     152             :     CPLString mainModelName;
     153             :     CPLString mainBasketName;
     154             :     CPLString mainTopicName;
     155             :     FeatureDefnInfos featureDefnInfos;
     156             :     char codeBlank;
     157             :     char codeUndefined;
     158             :     char codeContinue;
     159             : 
     160             :   public:
     161             :     explicit ImdReader(int iliVersion);
     162             :     ~ImdReader();
     163             :     void ReadModel(const char *pszFilename);
     164             :     FeatureDefnInfo GetFeatureDefnInfo(const char *pszLayerName);
     165             : };
     166             : 
     167             : #endif /* IMDREADER_H_INCLUDED */

Generated by: LCOV version 1.14