/src/gdal/ogr/ogrsf_frmts/jml/ogr_jml.h
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: JML .jml Translator |
4 | | * Purpose: Definition of classes for OGR JML driver. |
5 | | * Author: Even Rouault, even dot rouault at spatialys dot com |
6 | | * |
7 | | ****************************************************************************** |
8 | | * Copyright (c) 2014, Even Rouault <even dot rouault at spatialys dot com> |
9 | | * |
10 | | * SPDX-License-Identifier: MIT |
11 | | ****************************************************************************/ |
12 | | |
13 | | #ifndef OGR_JML_H_INCLUDED |
14 | | #define OGR_JML_H_INCLUDED |
15 | | |
16 | | #include "ogrsf_frmts.h" |
17 | | #include "ogr_p.h" |
18 | | |
19 | | #ifdef HAVE_EXPAT |
20 | | #include "ogr_expat.h" |
21 | | #endif |
22 | | |
23 | | #include <vector> |
24 | | |
25 | | class OGRJMLDataset; |
26 | | |
27 | | #ifdef HAVE_EXPAT |
28 | | |
29 | | /************************************************************************/ |
30 | | /* OGRJMLColumn */ |
31 | | /************************************************************************/ |
32 | | |
33 | | class OGRJMLColumn |
34 | | { |
35 | | public: |
36 | | CPLString osName; |
37 | | CPLString osType; |
38 | | CPLString osElementName; |
39 | | CPLString osAttributeName; |
40 | | CPLString osAttributeValue; |
41 | | bool bIsBody; /* if false: attribute */ |
42 | | |
43 | 1.52k | OGRJMLColumn() : bIsBody(false) |
44 | 1.52k | { |
45 | 1.52k | } |
46 | | }; |
47 | | |
48 | | /************************************************************************/ |
49 | | /* OGRJMLLayer */ |
50 | | /************************************************************************/ |
51 | | |
52 | | class OGRJMLLayer final : public OGRLayer |
53 | | { |
54 | | GDALDataset *m_poDS = nullptr; |
55 | | OGRFeatureDefn *poFeatureDefn; |
56 | | |
57 | | int nNextFID; |
58 | | VSILFILE *fp; |
59 | | bool bHasReadSchema; |
60 | | |
61 | | struct XMLParserDeleter |
62 | | { |
63 | | void operator()(XML_Parser parser) |
64 | 2.02k | { |
65 | 2.02k | if (parser) |
66 | 2.02k | XML_ParserFree(parser); |
67 | 2.02k | } |
68 | | }; |
69 | | |
70 | | std::unique_ptr<XML_ParserStruct, XMLParserDeleter> poParser{}; |
71 | | |
72 | | int currentDepth; |
73 | | bool bStopParsing; |
74 | | int nWithoutEventCounter; |
75 | | int nDataHandlerCounter; |
76 | | |
77 | | bool bAccumulateElementValue; |
78 | | char *pszElementValue; |
79 | | int nElementValueLen; |
80 | | int nElementValueAlloc; |
81 | | |
82 | | OGRFeature *poFeature; |
83 | | OGRFeature **ppoFeatureTab; |
84 | | int nFeatureTabLength; |
85 | | int nFeatureTabIndex; |
86 | | |
87 | | bool bSchemaFinished; |
88 | | int nJCSGMLInputTemplateDepth; |
89 | | int nCollectionElementDepth; |
90 | | int nFeatureCollectionDepth; |
91 | | CPLString osCollectionElement; |
92 | | int nFeatureElementDepth; |
93 | | CPLString osFeatureElement; |
94 | | int nGeometryElementDepth; |
95 | | CPLString osGeometryElement; |
96 | | int nColumnDepth; |
97 | | int nNameDepth; |
98 | | int nTypeDepth; |
99 | | int nAttributeElementDepth; |
100 | | int iAttr; |
101 | | int iRGBField; |
102 | | CPLString osSRSName; |
103 | | |
104 | | OGRJMLColumn oCurColumn; |
105 | | std::vector<OGRJMLColumn> aoColumns; |
106 | | |
107 | | void AddStringToElementValue(const char *data, int nLen); |
108 | | void StopAccumulate(); |
109 | | |
110 | | void LoadSchema(); |
111 | | |
112 | | public: |
113 | | OGRJMLLayer(const char *pszLayerName, OGRJMLDataset *poDS, VSILFILE *fp); |
114 | | ~OGRJMLLayer() override; |
115 | | |
116 | | const char *GetName() const override |
117 | 140 | { |
118 | 140 | return poFeatureDefn->GetName(); |
119 | 140 | } |
120 | | |
121 | | void ResetReading() override; |
122 | | OGRFeature *GetNextFeature() override; |
123 | | |
124 | | const OGRFeatureDefn *GetLayerDefn() const override; |
125 | | |
126 | | int TestCapability(const char *) const override; |
127 | | |
128 | | GDALDataset *GetDataset() override |
129 | 0 | { |
130 | 0 | return m_poDS; |
131 | 0 | } |
132 | | |
133 | | void startElementCbk(const char *pszName, const char **ppszAttr); |
134 | | void endElementCbk(const char *pszName); |
135 | | void dataHandlerCbk(const char *data, int nLen); |
136 | | |
137 | | void startElementLoadSchemaCbk(const char *pszName, const char **ppszAttr); |
138 | | void endElementLoadSchemaCbk(const char *pszName); |
139 | | }; |
140 | | |
141 | | #endif /* HAVE_EXPAT */ |
142 | | |
143 | | /************************************************************************/ |
144 | | /* OGRJMLWriterLayer */ |
145 | | /************************************************************************/ |
146 | | |
147 | | class OGRJMLWriterLayer final : public OGRLayer |
148 | | { |
149 | | OGRJMLDataset *poDS; |
150 | | OGRFeatureDefn *poFeatureDefn; |
151 | | VSILFILE *fp; |
152 | | bool bFeaturesWritten; |
153 | | bool bAddRGBField; |
154 | | bool bAddOGRStyleField; |
155 | | bool bClassicGML; |
156 | | int nNextFID; |
157 | | CPLString osSRSAttr; |
158 | | OGREnvelope sLayerExtent; |
159 | | vsi_l_offset nBBoxOffset; |
160 | | |
161 | | void WriteColumnDeclaration(const char *pszName, const char *pszType); |
162 | | |
163 | | public: |
164 | | OGRJMLWriterLayer(const char *pszLayerName, OGRSpatialReference *poSRS, |
165 | | OGRJMLDataset *poDSIn, VSILFILE *fp, bool bAddRGBField, |
166 | | bool bAddOGRStyleField, bool bClassicGML); |
167 | | ~OGRJMLWriterLayer() override; |
168 | | |
169 | | void ResetReading() override |
170 | 0 | { |
171 | 0 | } |
172 | | |
173 | | OGRFeature *GetNextFeature() override |
174 | 0 | { |
175 | 0 | return nullptr; |
176 | 0 | } |
177 | | |
178 | | OGRErr ICreateFeature(OGRFeature *poFeature) override; |
179 | | OGRErr CreateField(const OGRFieldDefn *poField, int bApproxOK) override; |
180 | | |
181 | | const OGRFeatureDefn *GetLayerDefn() const override |
182 | 299k | { |
183 | 299k | return poFeatureDefn; |
184 | 299k | } |
185 | | |
186 | | int TestCapability(const char *) const override; |
187 | | |
188 | | GDALDataset *GetDataset() override; |
189 | | }; |
190 | | |
191 | | /************************************************************************/ |
192 | | /* OGRJMLDataset */ |
193 | | /************************************************************************/ |
194 | | |
195 | | class OGRJMLDataset final : public GDALDataset |
196 | | { |
197 | | OGRLayer *poLayer; |
198 | | |
199 | | VSILFILE *fp; /* Virtual file API */ |
200 | | bool bWriteMode; |
201 | | |
202 | | public: |
203 | | OGRJMLDataset(); |
204 | | ~OGRJMLDataset() override; |
205 | | |
206 | | int GetLayerCount() const override |
207 | 3.89k | { |
208 | 3.89k | return poLayer != nullptr ? 1 : 0; |
209 | 3.89k | } |
210 | | |
211 | | const OGRLayer *GetLayer(int) const override; |
212 | | |
213 | | OGRLayer *ICreateLayer(const char *pszName, |
214 | | const OGRGeomFieldDefn *poGeomFieldDefn, |
215 | | CSLConstList papszOptions) override; |
216 | | |
217 | | int TestCapability(const char *) const override; |
218 | | |
219 | | static int Identify(GDALOpenInfo *poOpenInfo); |
220 | | static GDALDataset *Open(GDALOpenInfo *poOpenInfo); |
221 | | static GDALDataset *Create(const char *pszFilename, int nBands, int nXSize, |
222 | | int nYSize, GDALDataType eDT, |
223 | | CSLConstList papszOptions); |
224 | | }; |
225 | | |
226 | | #endif /* ndef OGR_JML_H_INCLUDED */ |