Line data Source code
1 : /******************************************************************************
2 : * $Id$
3 : *
4 : * Project: VDV Translator
5 : * Purpose: Implements OGRVDVDriver.
6 : * Author: Even Rouault, even.rouault at spatialys.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2015, Even Rouault <even.rouault at spatialys.com>
10 : *
11 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #ifndef OGR_VDV_H_INCLUDED
31 : #define OGR_VDV_H_INCLUDED
32 :
33 : #include "ogrsf_frmts.h"
34 : #include <vector>
35 : #include <map>
36 :
37 : class OGRVDVDataSource;
38 :
39 : /************************************************************************/
40 : /* OGRIDFDataSource */
41 : /************************************************************************/
42 :
43 : class OGRIDFDataSource final : public GDALDataset
44 : {
45 : CPLString m_osFilename;
46 : VSILFILE *m_fpL;
47 : bool m_bHasParsed;
48 : GDALDataset *m_poTmpDS;
49 : bool m_bDestroyTmpDS = false;
50 :
51 : void Parse();
52 :
53 : public:
54 : explicit OGRIDFDataSource(const char *pszFilename, VSILFILE *fpL);
55 : virtual ~OGRIDFDataSource();
56 :
57 : virtual int GetLayerCount() override;
58 : virtual OGRLayer *GetLayer(int) override;
59 : virtual int TestCapability(const char *pszCap) override;
60 : };
61 :
62 : /************************************************************************/
63 : /* OGRVDVLayer */
64 : /************************************************************************/
65 :
66 : class OGRVDVLayer final : public OGRLayer
67 : {
68 : GDALDataset *m_poDS = nullptr;
69 : VSILFILE *m_fpL;
70 : bool m_bOwnFP;
71 : bool m_bRecodeFromLatin1;
72 : vsi_l_offset m_nStartOffset;
73 : vsi_l_offset m_nCurOffset;
74 : GIntBig m_nTotalFeatureCount;
75 : GIntBig m_nFID;
76 : OGRFeatureDefn *m_poFeatureDefn;
77 : bool m_bEOF;
78 : int m_iLongitudeVDV452;
79 : int m_iLatitudeVDV452;
80 :
81 : public:
82 : OGRVDVLayer(GDALDataset *poDS, const CPLString &osTableName, VSILFILE *fpL,
83 : bool bOwnFP, bool bRecodeFromLatin1, vsi_l_offset nStartOffset);
84 : virtual ~OGRVDVLayer();
85 :
86 : virtual void ResetReading() override;
87 : virtual OGRFeature *GetNextFeature() override;
88 : virtual GIntBig GetFeatureCount(int bForce) override;
89 :
90 1468 : virtual OGRFeatureDefn *GetLayerDefn() override
91 : {
92 1468 : return m_poFeatureDefn;
93 : }
94 :
95 : virtual int TestCapability(const char *pszCap) override;
96 :
97 4 : GDALDataset *GetDataset() override
98 : {
99 4 : return m_poDS;
100 : }
101 :
102 70 : void SetFeatureCount(GIntBig nTotalFeatureCount)
103 : {
104 70 : m_nTotalFeatureCount = nTotalFeatureCount;
105 70 : }
106 : };
107 :
108 : class OGRVDV452Field
109 : {
110 : public:
111 : CPLString osEnglishName;
112 : CPLString osGermanName;
113 : CPLString osType;
114 : int nWidth;
115 :
116 1617 : OGRVDV452Field() : nWidth(0)
117 : {
118 1617 : }
119 : };
120 :
121 : class OGRVDV452Table
122 : {
123 : public:
124 : CPLString osEnglishName;
125 : CPLString osGermanName;
126 : std::vector<OGRVDV452Field> aosFields;
127 : };
128 :
129 : class OGRVDV452Tables
130 : {
131 : public:
132 : std::vector<OGRVDV452Table *> aosTables;
133 : std::map<CPLString, OGRVDV452Table *> oMapEnglish;
134 : std::map<CPLString, OGRVDV452Table *> oMapGerman;
135 :
136 119 : OGRVDV452Tables()
137 119 : {
138 119 : }
139 :
140 119 : ~OGRVDV452Tables()
141 119 : {
142 357 : for (size_t i = 0; i < aosTables.size(); i++)
143 238 : delete aosTables[i];
144 119 : }
145 : };
146 :
147 : /************************************************************************/
148 : /* OGRVDVWriterLayer */
149 : /************************************************************************/
150 :
151 : class OGRVDVWriterLayer final : public OGRLayer
152 : {
153 : OGRVDVDataSource *m_poDS;
154 : OGRFeatureDefn *m_poFeatureDefn;
155 : bool m_bWritePossible;
156 : VSILFILE *m_fpL;
157 : bool m_bOwnFP;
158 : GIntBig m_nFeatureCount;
159 : OGRVDV452Table *m_poVDV452Table;
160 : CPLString m_osVDV452Lang;
161 : bool m_bProfileStrict;
162 : int m_iLongitudeVDV452;
163 : int m_iLatitudeVDV452;
164 :
165 : bool WriteSchemaIfNeeded();
166 :
167 : public:
168 : OGRVDVWriterLayer(OGRVDVDataSource *poDS, const char *pszName,
169 : VSILFILE *fpL, bool bOwnFP,
170 : OGRVDV452Table *poVDV452Table = nullptr,
171 : const CPLString &osVDV452Lang = "",
172 : bool bProfileStrict = false);
173 : virtual ~OGRVDVWriterLayer();
174 :
175 : virtual void ResetReading() override;
176 : virtual OGRFeature *GetNextFeature() override;
177 :
178 511 : virtual OGRFeatureDefn *GetLayerDefn() override
179 : {
180 511 : return m_poFeatureDefn;
181 : }
182 :
183 : virtual int TestCapability(const char *pszCap) override;
184 : virtual OGRErr CreateField(const OGRFieldDefn *poFieldDefn,
185 : int bApproxOK = TRUE) override;
186 : virtual OGRErr ICreateFeature(OGRFeature *poFeature) override;
187 : virtual GIntBig GetFeatureCount(int bForce = TRUE) override;
188 :
189 : GDALDataset *GetDataset() override;
190 :
191 : void StopAsCurrentLayer();
192 : };
193 :
194 : /************************************************************************/
195 : /* OGRVDVDataSource */
196 : /************************************************************************/
197 :
198 : class OGRVDVDataSource final : public GDALDataset
199 : {
200 : CPLString m_osFilename;
201 : VSILFILE *m_fpL;
202 : bool m_bUpdate;
203 : bool m_bSingleFile;
204 : bool m_bNew;
205 : bool m_bLayersDetected;
206 : int m_nLayerCount;
207 : OGRLayer **m_papoLayers;
208 : OGRVDVWriterLayer *m_poCurrentWriterLayer;
209 : bool m_bMustWriteEof;
210 : bool m_bVDV452Loaded;
211 : OGRVDV452Tables m_oVDV452Tables;
212 :
213 : void DetectLayers();
214 :
215 : public:
216 : OGRVDVDataSource(const char *pszFilename, VSILFILE *fpL, bool bUpdate,
217 : bool bSingleFile, bool bNew);
218 : virtual ~OGRVDVDataSource();
219 :
220 : virtual int GetLayerCount() override;
221 : virtual OGRLayer *GetLayer(int) override;
222 :
223 : OGRLayer *ICreateLayer(const char *pszName,
224 : const OGRGeomFieldDefn *poGeomFieldDefn,
225 : CSLConstList papszOptions) override;
226 :
227 : virtual int TestCapability(const char *pszCap) override;
228 :
229 : void SetCurrentWriterLayer(OGRVDVWriterLayer *poLayer);
230 :
231 : static GDALDataset *Open(GDALOpenInfo *poOpenInfo);
232 : static GDALDataset *Create(const char *pszName, int /*nXSize*/,
233 : int /*nYSize*/, int /*nBands*/,
234 : GDALDataType /*eType*/, char **papszOptions);
235 : };
236 :
237 : #endif /* ndef OGR_VDV_H_INCLUDED */
|