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 20915 : Range() : poVals(nullptr), poActual(nullptr), nMaxValue(0) 56 : { 57 20915 : } 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 IGetExtent(int iGeomField, OGREnvelope *psExtent, 112 : bool bForce) override; 113 : 114 : OGRErr ISetFeature(OGRFeature *poFeature) override; 115 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 116 : OGRErr CreateField(const OGRFieldDefn *poField, 117 : int bApproxOK = TRUE) override; 118 : OGRErr DeleteField(int iField) override; 119 : OGRErr ReorderFields(int *panMap) override; 120 : OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn, 121 : int nFlags) override; 122 : OGRErr DeleteFeature(GIntBig nFID) override; 123 : 124 2 : GDALDataset *GetDataset() override 125 : { 126 2 : return m_poDS; 127 : } 128 : }; 129 : 130 : /************************************************************************/ 131 : /* OGRSelafinDataSource */ 132 : /************************************************************************/ 133 : 134 : class OGRSelafinDataSource final : public GDALDataset 135 : { 136 : private: 137 : char *pszName; 138 : OGRSelafinLayer **papoLayers; 139 : Range poRange; 140 : int nLayers; 141 : bool bUpdate; 142 : Selafin::Header *poHeader; 143 : CPLString osDefaultSelafinName; 144 : OGRSpatialReference *poSpatialRef; 145 : 146 : public: 147 : OGRSelafinDataSource(); 148 : virtual ~OGRSelafinDataSource(); 149 : int Open(const char *pszFilename, int bUpdate, int bCreate); 150 : int OpenTable(const char *pszFilename); 151 : 152 18 : int GetLayerCount() override 153 : { 154 18 : return nLayers; 155 : } 156 : 157 : OGRLayer *GetLayer(int) override; 158 : 159 : OGRLayer *ICreateLayer(const char *pszName, 160 : const OGRGeomFieldDefn *poGeomFieldDefn, 161 : CSLConstList papszOptions) override; 162 : 163 : virtual OGRErr DeleteLayer(int) override; 164 : int TestCapability(const char *) override; 165 : 166 : void SetDefaultSelafinName(const char *pszNameIn) 167 : { 168 : osDefaultSelafinName = pszNameIn; 169 : } 170 : }; 171 : 172 : #endif /* ndef OGR_SELAFIN_H_INCLUDED */