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