Coverage Report

Created: 2025-12-31 08:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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 */