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