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 55 : GeomFieldInfo() : geomTable(nullptr) 29 : { 30 55 : } 31 : 32 157 : ~GeomFieldInfo() 33 157 : { 34 157 : if (geomTable) 35 56 : geomTable->Release(); 36 157 : } 37 : 38 102 : GeomFieldInfo(const GeomFieldInfo &other) 39 102 : { 40 102 : geomTable = other.geomTable; 41 102 : if (geomTable) 42 42 : geomTable->Reference(); 43 102 : iliGeomType = other.iliGeomType; 44 102 : } 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 46 : OGRFeatureDefn *GetGeomTableDefnRef() const 61 : { 62 46 : return geomTable; 63 : } 64 : 65 14 : void SetGeomTableDefn(OGRFeatureDefn *geomTableIn) 66 : { 67 14 : CPLAssert(geomTable == nullptr); 68 14 : geomTable = geomTableIn; 69 14 : if (geomTable) 70 14 : geomTable->Reference(); 71 14 : } 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 521 : FeatureDefnInfo() : poTableDefn(nullptr) 88 : { 89 521 : } 90 : 91 592 : ~FeatureDefnInfo() 92 592 : { 93 592 : if (poTableDefn) 94 397 : poTableDefn->Release(); 95 592 : } 96 : 97 71 : FeatureDefnInfo(const FeatureDefnInfo &other) 98 71 : { 99 71 : poTableDefn = other.poTableDefn; 100 71 : if (poTableDefn) 101 71 : poTableDefn->Reference(); 102 71 : poGeomFieldInfos = other.poGeomFieldInfos; 103 71 : poStructFieldInfos = other.poStructFieldInfos; 104 71 : } 105 : 106 0 : FeatureDefnInfo &operator=(const FeatureDefnInfo &other) 107 : { 108 0 : if (this != &other) 109 : { 110 0 : if (poTableDefn) 111 0 : poTableDefn->Release(); 112 0 : poTableDefn = other.poTableDefn; 113 0 : if (poTableDefn) 114 0 : poTableDefn->Reference(); 115 0 : poGeomFieldInfos = other.poGeomFieldInfos; 116 0 : poStructFieldInfos = other.poStructFieldInfos; 117 : } 118 0 : return *this; 119 : } 120 : 121 167 : OGRFeatureDefn *GetTableDefnRef() const 122 : { 123 167 : return poTableDefn; 124 : } 125 : 126 326 : void SetTableDefn(OGRFeatureDefn *poTableDefnIn) 127 : { 128 326 : CPLAssert(poTableDefn == nullptr); 129 326 : poTableDefn = poTableDefnIn; 130 326 : if (poTableDefn) 131 326 : poTableDefn->Reference(); 132 326 : } 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 mainBasketName; 153 : CPLString mainTopicName; 154 : FeatureDefnInfos featureDefnInfos; 155 : char codeBlank; 156 : char codeUndefined; 157 : char codeContinue; 158 : 159 : public: 160 : explicit ImdReader(int iliVersion); 161 : ~ImdReader(); 162 : void ReadModel(const char *pszFilename); 163 : FeatureDefnInfo GetFeatureDefnInfo(const char *pszLayerName); 164 : }; 165 : 166 : #endif /* IMDREADER_H_INCLUDED */