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