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 */