Line data Source code
1 : /******************************************************************************
2 : * Project: Selafin importer
3 : * Purpose: Definition of classes for OGR driver for Selafin files.
4 : * Author: François Hissel, francois.hissel@gmail.com
5 : *
6 : ******************************************************************************
7 : * Copyright (c) 2014, François Hissel <francois.hissel@gmail.com>
8 : *
9 : * SPDX-License-Identifier: MIT
10 : ****************************************************************************/
11 :
12 : #ifndef OGR_SELAFIN_H_INCLUDED
13 : #define OGR_SELAFIN_H_INCLUDED
14 :
15 : #include "io_selafin.h"
16 : #include "ogrsf_frmts.h"
17 :
18 : class OGRSelafinDataSource;
19 :
20 : typedef enum
21 : {
22 : POINTS,
23 : ELEMENTS,
24 : ALL
25 : } SelafinTypeDef;
26 :
27 : /************************************************************************/
28 : /* Range */
29 : /************************************************************************/
30 : class Range
31 : {
32 : private:
33 : typedef struct List
34 : {
35 : SelafinTypeDef eType;
36 : int nMin, nMax;
37 : List *poNext;
38 :
39 : List() : eType(POINTS), nMin(0), nMax(0), poNext(nullptr)
40 : {
41 : }
42 :
43 0 : List(SelafinTypeDef eTypeP, int nMinP, int nMaxP, List *poNextP)
44 0 : : eType(eTypeP), nMin(nMinP), nMax(nMaxP), poNext(poNextP)
45 : {
46 0 : }
47 : } List;
48 :
49 : List *poVals, *poActual;
50 : int nMaxValue;
51 : static void sortList(List *&poList, List *poEnd = nullptr);
52 : static void deleteList(List *poList);
53 :
54 : public:
55 21558 : Range() : poVals(nullptr), poActual(nullptr), nMaxValue(0)
56 : {
57 21558 : }
58 :
59 : void setRange(const char *pszStr);
60 : ~Range();
61 : void setMaxValue(int nMaxValueP);
62 : bool contains(SelafinTypeDef eType, int nValue) const;
63 : size_t getSize() const;
64 : };
65 :
66 : /************************************************************************/
67 : /* OGRSelafinLayer */
68 : /************************************************************************/
69 :
70 : class OGRSelafinLayer final : public OGRLayer
71 : {
72 : private:
73 : GDALDataset *m_poDS = nullptr;
74 : SelafinTypeDef eType;
75 : bool bUpdate;
76 : int nStepNumber;
77 : Selafin::Header *poHeader;
78 : OGRFeatureDefn *poFeatureDefn;
79 : OGRSpatialReference *poSpatialRef;
80 : GIntBig nCurrentId;
81 :
82 : public:
83 : OGRSelafinLayer(GDALDataset *poDS, const char *pszLayerNameP, int bUpdateP,
84 : const OGRSpatialReference *poSpatialRefP,
85 : Selafin::Header *poHeaderP, int nStepNumberP,
86 : SelafinTypeDef eTypeP);
87 : ~OGRSelafinLayer();
88 :
89 0 : OGRSpatialReference *GetSpatialRef() override
90 : {
91 0 : return poSpatialRef;
92 : }
93 :
94 5 : int GetStepNumber()
95 : {
96 5 : return nStepNumber;
97 : }
98 :
99 : OGRFeature *GetNextFeature() override;
100 : OGRFeature *GetFeature(GIntBig nFID) override;
101 : void ResetReading() override;
102 : OGRErr SetNextByIndex(GIntBig nIndex) override;
103 :
104 133 : OGRFeatureDefn *GetLayerDefn() override
105 : {
106 133 : return poFeatureDefn;
107 : }
108 :
109 : int TestCapability(const char *pszCap) override;
110 : GIntBig GetFeatureCount(int bForce = TRUE) override;
111 : OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override;
112 :
113 0 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
114 : int bForce) override
115 : {
116 0 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
117 : }
118 :
119 : OGRErr ISetFeature(OGRFeature *poFeature) override;
120 : OGRErr ICreateFeature(OGRFeature *poFeature) override;
121 : OGRErr CreateField(const OGRFieldDefn *poField,
122 : int bApproxOK = TRUE) override;
123 : OGRErr DeleteField(int iField) override;
124 : OGRErr ReorderFields(int *panMap) override;
125 : OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
126 : int nFlags) override;
127 : OGRErr DeleteFeature(GIntBig nFID) override;
128 :
129 2 : GDALDataset *GetDataset() override
130 : {
131 2 : return m_poDS;
132 : }
133 : };
134 :
135 : /************************************************************************/
136 : /* OGRSelafinDataSource */
137 : /************************************************************************/
138 :
139 : class OGRSelafinDataSource final : public GDALDataset
140 : {
141 : private:
142 : char *pszName;
143 : OGRSelafinLayer **papoLayers;
144 : Range poRange;
145 : int nLayers;
146 : bool bUpdate;
147 : Selafin::Header *poHeader;
148 : CPLString osDefaultSelafinName;
149 : OGRSpatialReference *poSpatialRef;
150 :
151 : public:
152 : OGRSelafinDataSource();
153 : virtual ~OGRSelafinDataSource();
154 : int Open(const char *pszFilename, int bUpdate, int bCreate);
155 : int OpenTable(const char *pszFilename);
156 :
157 18 : int GetLayerCount() override
158 : {
159 18 : return nLayers;
160 : }
161 :
162 : OGRLayer *GetLayer(int) override;
163 :
164 : OGRLayer *ICreateLayer(const char *pszName,
165 : const OGRGeomFieldDefn *poGeomFieldDefn,
166 : CSLConstList papszOptions) override;
167 :
168 : virtual OGRErr DeleteLayer(int) override;
169 : int TestCapability(const char *) override;
170 :
171 : void SetDefaultSelafinName(const char *pszNameIn)
172 : {
173 : osDefaultSelafinName = pszNameIn;
174 : }
175 : };
176 :
177 : #endif /* ndef OGR_SELAFIN_H_INCLUDED */
|