/src/gdal/ogr/ogrsf_frmts/vdv/ogr_vdv.h
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: VDV Translator |
4 | | * Purpose: Implements OGRVDVDriver. |
5 | | * Author: Even Rouault, even.rouault at spatialys.com |
6 | | * |
7 | | ****************************************************************************** |
8 | | * Copyright (c) 2015, Even Rouault <even.rouault at spatialys.com> |
9 | | * |
10 | | * SPDX-License-Identifier: MIT |
11 | | ****************************************************************************/ |
12 | | |
13 | | #ifndef OGR_VDV_H_INCLUDED |
14 | | #define OGR_VDV_H_INCLUDED |
15 | | |
16 | | #include "ogrsf_frmts.h" |
17 | | #include <vector> |
18 | | #include <map> |
19 | | #include <mutex> |
20 | | #include <utility> |
21 | | |
22 | | class OGRVDVDataSource; |
23 | | |
24 | | /************************************************************************/ |
25 | | /* OGRIDFDataSource */ |
26 | | /************************************************************************/ |
27 | | |
28 | | class OGRIDFDataSource final : public GDALDataset |
29 | | { |
30 | | CPLString m_osFilename{}; |
31 | | VSILFILE *m_fpL = nullptr; |
32 | | mutable bool m_bHasParsed = false; |
33 | | mutable GDALDataset *m_poTmpDS = nullptr; |
34 | | mutable bool m_bDestroyTmpDS = false; |
35 | | mutable std::mutex m_oMutex{}; |
36 | | |
37 | | std::pair<GDALDataset *, bool> Parse() const; |
38 | | |
39 | | public: |
40 | | explicit OGRIDFDataSource(const char *pszFilename, VSILFILE *fpL); |
41 | | ~OGRIDFDataSource() override; |
42 | | |
43 | | int GetLayerCount() const override; |
44 | | const OGRLayer *GetLayer(int) const override; |
45 | | int TestCapability(const char *pszCap) const override; |
46 | | }; |
47 | | |
48 | | /************************************************************************/ |
49 | | /* OGRVDVLayer */ |
50 | | /************************************************************************/ |
51 | | |
52 | | class OGRVDVLayer final : public OGRLayer |
53 | | { |
54 | | GDALDataset *m_poDS = nullptr; |
55 | | VSILFILE *m_fpL; |
56 | | bool m_bOwnFP; |
57 | | bool m_bRecodeFromLatin1; |
58 | | vsi_l_offset m_nStartOffset; |
59 | | vsi_l_offset m_nCurOffset; |
60 | | GIntBig m_nTotalFeatureCount; |
61 | | GIntBig m_nFID; |
62 | | OGRFeatureDefn *m_poFeatureDefn; |
63 | | bool m_bEOF; |
64 | | int m_iLongitudeVDV452; |
65 | | int m_iLatitudeVDV452; |
66 | | |
67 | | public: |
68 | | OGRVDVLayer(GDALDataset *poDS, const CPLString &osTableName, VSILFILE *fpL, |
69 | | bool bOwnFP, bool bRecodeFromLatin1, vsi_l_offset nStartOffset); |
70 | | ~OGRVDVLayer() override; |
71 | | |
72 | | void ResetReading() override; |
73 | | OGRFeature *GetNextFeature() override; |
74 | | GIntBig GetFeatureCount(int bForce) override; |
75 | | |
76 | | const OGRFeatureDefn *GetLayerDefn() const override |
77 | 194k | { |
78 | 194k | return m_poFeatureDefn; |
79 | 194k | } |
80 | | |
81 | | int TestCapability(const char *pszCap) const override; |
82 | | |
83 | | GDALDataset *GetDataset() override |
84 | 0 | { |
85 | 0 | return m_poDS; |
86 | 0 | } |
87 | | |
88 | | void SetFeatureCount(GIntBig nTotalFeatureCount) |
89 | 180k | { |
90 | 180k | m_nTotalFeatureCount = nTotalFeatureCount; |
91 | 180k | } |
92 | | }; |
93 | | |
94 | | class OGRVDV452Field |
95 | | { |
96 | | public: |
97 | | CPLString osEnglishName; |
98 | | CPLString osGermanName; |
99 | | CPLString osType; |
100 | | int nWidth; |
101 | | |
102 | 0 | OGRVDV452Field() : nWidth(0) |
103 | 0 | { |
104 | 0 | } |
105 | | }; |
106 | | |
107 | | class OGRVDV452Table |
108 | | { |
109 | | public: |
110 | | CPLString osEnglishName; |
111 | | CPLString osGermanName; |
112 | | std::vector<OGRVDV452Field> aosFields; |
113 | | }; |
114 | | |
115 | | class OGRVDV452Tables |
116 | | { |
117 | | public: |
118 | | std::vector<OGRVDV452Table *> aosTables; |
119 | | std::map<CPLString, OGRVDV452Table *> oMapEnglish; |
120 | | std::map<CPLString, OGRVDV452Table *> oMapGerman; |
121 | | |
122 | | OGRVDV452Tables() |
123 | 2.37k | { |
124 | 2.37k | } |
125 | | |
126 | | ~OGRVDV452Tables() |
127 | 2.37k | { |
128 | 2.37k | for (size_t i = 0; i < aosTables.size(); i++) |
129 | 0 | delete aosTables[i]; |
130 | 2.37k | } |
131 | | }; |
132 | | |
133 | | /************************************************************************/ |
134 | | /* OGRVDVWriterLayer */ |
135 | | /************************************************************************/ |
136 | | |
137 | | class OGRVDVWriterLayer final : public OGRLayer |
138 | | { |
139 | | OGRVDVDataSource *m_poDS; |
140 | | OGRFeatureDefn *m_poFeatureDefn; |
141 | | bool m_bWritePossible; |
142 | | VSILFILE *m_fpL; |
143 | | bool m_bOwnFP; |
144 | | GIntBig m_nFeatureCount; |
145 | | OGRVDV452Table *m_poVDV452Table; |
146 | | CPLString m_osVDV452Lang; |
147 | | bool m_bProfileStrict; |
148 | | int m_iLongitudeVDV452; |
149 | | int m_iLatitudeVDV452; |
150 | | |
151 | | bool WriteSchemaIfNeeded(); |
152 | | |
153 | | public: |
154 | | OGRVDVWriterLayer(OGRVDVDataSource *poDS, const char *pszName, |
155 | | VSILFILE *fpL, bool bOwnFP, |
156 | | OGRVDV452Table *poVDV452Table = nullptr, |
157 | | const CPLString &osVDV452Lang = "", |
158 | | bool bProfileStrict = false); |
159 | | ~OGRVDVWriterLayer() override; |
160 | | |
161 | | void ResetReading() override; |
162 | | OGRFeature *GetNextFeature() override; |
163 | | |
164 | | using OGRLayer::GetLayerDefn; |
165 | | |
166 | | const OGRFeatureDefn *GetLayerDefn() const override |
167 | 24.5k | { |
168 | 24.5k | return m_poFeatureDefn; |
169 | 24.5k | } |
170 | | |
171 | | int TestCapability(const char *pszCap) const override; |
172 | | virtual OGRErr CreateField(const OGRFieldDefn *poFieldDefn, |
173 | | int bApproxOK = TRUE) override; |
174 | | OGRErr ICreateFeature(OGRFeature *poFeature) override; |
175 | | GIntBig GetFeatureCount(int bForce = TRUE) override; |
176 | | |
177 | | GDALDataset *GetDataset() override; |
178 | | |
179 | | void StopAsCurrentLayer(); |
180 | | }; |
181 | | |
182 | | /************************************************************************/ |
183 | | /* OGRVDVDataSource */ |
184 | | /************************************************************************/ |
185 | | |
186 | | class OGRVDVDataSource final : public GDALDataset |
187 | | { |
188 | | CPLString m_osFilename; |
189 | | VSILFILE *m_fpL; |
190 | | bool m_bUpdate; |
191 | | bool m_bSingleFile; |
192 | | bool m_bNew; |
193 | | mutable bool m_bLayersDetected; |
194 | | mutable int m_nLayerCount; |
195 | | mutable OGRLayer **m_papoLayers; |
196 | | OGRVDVWriterLayer *m_poCurrentWriterLayer; |
197 | | bool m_bMustWriteEof; |
198 | | bool m_bVDV452Loaded; |
199 | | OGRVDV452Tables m_oVDV452Tables; |
200 | | mutable std::mutex m_oMutex{}; |
201 | | |
202 | | void DetectLayers() const; |
203 | | |
204 | | public: |
205 | | OGRVDVDataSource(const char *pszFilename, VSILFILE *fpL, bool bUpdate, |
206 | | bool bSingleFile, bool bNew); |
207 | | ~OGRVDVDataSource() override; |
208 | | |
209 | | int GetLayerCount() const override; |
210 | | const OGRLayer *GetLayer(int) const override; |
211 | | |
212 | | OGRLayer *ICreateLayer(const char *pszName, |
213 | | const OGRGeomFieldDefn *poGeomFieldDefn, |
214 | | CSLConstList papszOptions) override; |
215 | | |
216 | | int TestCapability(const char *pszCap) const override; |
217 | | |
218 | | void SetCurrentWriterLayer(OGRVDVWriterLayer *poLayer); |
219 | | |
220 | | static GDALDataset *Open(GDALOpenInfo *poOpenInfo); |
221 | | static GDALDataset *Create(const char *pszName, int /*nXSize*/, |
222 | | int /*nYSize*/, int /*nBands*/, |
223 | | GDALDataType /*eType*/, char **papszOptions); |
224 | | }; |
225 | | |
226 | | #endif /* ndef OGR_VDV_H_INCLUDED */ |