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 54 : GeomFieldInfo() : geomTable(nullptr) 29 : { 30 54 : } 31 : 32 155 : ~GeomFieldInfo() 33 155 : { 34 155 : if (geomTable) 35 56 : geomTable->Release(); 36 155 : } 37 : 38 101 : GeomFieldInfo(const GeomFieldInfo &other) 39 101 : { 40 101 : geomTable = other.geomTable; 41 101 : if (geomTable) 42 42 : geomTable->Reference(); 43 101 : iliGeomType = other.iliGeomType; 44 101 : } 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 413 : FeatureDefnInfo() : poTableDefn(nullptr) 88 : { 89 413 : } 90 : 91 477 : ~FeatureDefnInfo() 92 477 : { 93 477 : if (poTableDefn) 94 323 : poTableDefn->Release(); 95 477 : } 96 : 97 64 : FeatureDefnInfo(const FeatureDefnInfo &other) 98 64 : { 99 64 : poTableDefn = other.poTableDefn; 100 64 : if (poTableDefn) 101 64 : poTableDefn->Reference(); 102 64 : poGeomFieldInfos = other.poGeomFieldInfos; 103 64 : poStructFieldInfos = other.poStructFieldInfos; 104 64 : } 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 147 : OGRFeatureDefn *GetTableDefnRef() const 122 : { 123 147 : return poTableDefn; 124 : } 125 : 126 259 : void SetTableDefn(OGRFeatureDefn *poTableDefnIn) 127 : { 128 259 : CPLAssert(poTableDefn == nullptr); 129 259 : poTableDefn = poTableDefnIn; 130 259 : if (poTableDefn) 131 259 : poTableDefn->Reference(); 132 259 : } 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 */