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 : #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 1404 : const OGRFeatureDefn *GetLayerDefn() const override 77 : { 78 1404 : return m_poFeatureDefn; 79 : } 80 : 81 : int TestCapability(const char *pszCap) const override; 82 : 83 4 : GDALDataset *GetDataset() override 84 : { 85 4 : return m_poDS; 86 : } 87 : 88 70 : void SetFeatureCount(GIntBig nTotalFeatureCount) 89 : { 90 70 : m_nTotalFeatureCount = nTotalFeatureCount; 91 70 : } 92 : }; 93 : 94 : class OGRVDV452Field 95 : { 96 : public: 97 : CPLString osEnglishName; 98 : CPLString osGermanName; 99 : CPLString osType; 100 : int nWidth; 101 : 102 1617 : OGRVDV452Field() : nWidth(0) 103 : { 104 1617 : } 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 119 : OGRVDV452Tables() 123 119 : { 124 119 : } 125 : 126 119 : ~OGRVDV452Tables() 127 119 : { 128 357 : for (size_t i = 0; i < aosTables.size(); i++) 129 238 : delete aosTables[i]; 130 119 : } 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 511 : const OGRFeatureDefn *GetLayerDefn() const override 167 : { 168 511 : return m_poFeatureDefn; 169 : } 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 */