Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: Arc/Info Coverage (E00 & Binary) Reader 4 : * Purpose: Declarations for OGR wrapper classes for coverage access. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2002, Frank Warmerdam 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGR_AVC_H_INCLUDED 14 : #define OGR_AVC_H_INCLUDED 15 : 16 : #include "ogrsf_frmts.h" 17 : #include "avc.h" 18 : 19 : constexpr int SERIAL_ACCESS_FID = INT_MIN; 20 : 21 : class OGRAVCDataSource; 22 : 23 : /************************************************************************/ 24 : /* OGRAVCLayer */ 25 : /************************************************************************/ 26 : 27 : class OGRAVCLayer CPL_NON_FINAL : public OGRLayer 28 : { 29 : protected: 30 : OGRFeatureDefn *poFeatureDefn; 31 : 32 : OGRAVCDataSource *poDS; 33 : 34 : AVCFileType eSectionType; 35 : 36 : bool m_bEOF = false; 37 : 38 : int SetupFeatureDefinition(const char *pszName); 39 : bool AppendTableDefinition(AVCTableDef *psTableDef); 40 : 41 : bool MatchesSpatialFilter(void *); 42 : OGRFeature *TranslateFeature(void *); 43 : 44 : bool TranslateTableFields(OGRFeature *poFeature, int nFieldBase, 45 : AVCTableDef *psTableDef, AVCField *pasFields); 46 : 47 : public: 48 : OGRAVCLayer(AVCFileType eSectionType, OGRAVCDataSource *poDS); 49 : virtual ~OGRAVCLayer(); 50 : 51 946 : OGRFeatureDefn *GetLayerDefn() override 52 : { 53 946 : return poFeatureDefn; 54 : } 55 : 56 : virtual int TestCapability(const char *) override; 57 : }; 58 : 59 : /************************************************************************/ 60 : /* OGRAVCDataSource */ 61 : /************************************************************************/ 62 : 63 : class OGRAVCDataSource CPL_NON_FINAL : public GDALDataset 64 : { 65 : protected: 66 : bool m_bSRSFetched = false; 67 : OGRSpatialReference *poSRS; 68 : char *pszCoverageName; 69 : 70 : public: 71 : OGRAVCDataSource(); 72 : virtual ~OGRAVCDataSource(); 73 : 74 : virtual OGRSpatialReference *DSGetSpatialRef(); 75 : 76 : const char *GetCoverageName(); 77 : }; 78 : 79 : /* ==================================================================== */ 80 : /* Binary Coverage Classes */ 81 : /* ==================================================================== */ 82 : 83 : class OGRAVCBinDataSource; 84 : 85 : /************************************************************************/ 86 : /* OGRAVCBinLayer */ 87 : /************************************************************************/ 88 : 89 : class OGRAVCBinLayer final : public OGRAVCLayer 90 : { 91 : AVCE00Section *m_psSection; 92 : AVCBinFile *hFile; 93 : 94 : OGRAVCBinLayer *poArcLayer; 95 : bool bNeedReset; 96 : 97 : char szTableName[128]; 98 : AVCBinFile *hTable; 99 : int nTableBaseField; 100 : int nTableAttrIndex; 101 : 102 : int nNextFID; 103 : 104 : bool FormPolygonGeometry(OGRFeature *poFeature, AVCPal *psPAL); 105 : 106 : bool CheckSetupTable(); 107 : bool AppendTableFields(OGRFeature *poFeature); 108 : 109 : public: 110 : OGRAVCBinLayer(OGRAVCBinDataSource *poDS, AVCE00Section *psSectionIn); 111 : 112 : ~OGRAVCBinLayer(); 113 : 114 : void ResetReading() override; 115 : OGRFeature *GetNextFeature() override; 116 : OGRFeature *GetFeature(GIntBig nFID) override; 117 : 118 : int TestCapability(const char *) override; 119 : }; 120 : 121 : /************************************************************************/ 122 : /* OGRAVCBinDataSource */ 123 : /************************************************************************/ 124 : 125 : class OGRAVCBinDataSource final : public OGRAVCDataSource 126 : { 127 : OGRLayer **papoLayers; 128 : int nLayers; 129 : 130 : AVCE00ReadPtr psAVC; 131 : 132 : public: 133 : OGRAVCBinDataSource(); 134 : ~OGRAVCBinDataSource(); 135 : 136 : int Open(const char *, int bTestOpen); 137 : 138 13 : int GetLayerCount() override 139 : { 140 13 : return nLayers; 141 : } 142 : 143 : OGRLayer *GetLayer(int) override; 144 : 145 : int TestCapability(const char *) override; 146 : 147 220 : AVCE00ReadPtr GetInfo() 148 : { 149 220 : return psAVC; 150 : } 151 : }; 152 : 153 : /* ==================================================================== */ 154 : /* E00 (ASCII) Coverage Classes */ 155 : /* ==================================================================== */ 156 : 157 : /************************************************************************/ 158 : /* OGRAVCE00Layer */ 159 : /************************************************************************/ 160 : class OGRAVCE00Layer final : public OGRAVCLayer 161 : { 162 : AVCE00Section *psSection; 163 : AVCE00ReadE00Ptr psRead; 164 : OGRAVCE00Layer *poArcLayer; 165 : int nFeatureCount; 166 : bool bNeedReset; 167 : bool bLastWasSequential = false; 168 : int nNextFID; 169 : 170 : AVCE00Section *psTableSection; 171 : AVCE00ReadE00Ptr psTableRead; 172 : char *pszTableFilename; 173 : int nTablePos; 174 : int nTableBaseField; 175 : int nTableAttrIndex; 176 : 177 : bool FormPolygonGeometry(OGRFeature *poFeature, AVCPal *psPAL); 178 : 179 : public: 180 : OGRAVCE00Layer(OGRAVCDataSource *poDS, AVCE00Section *psSectionIn); 181 : 182 : ~OGRAVCE00Layer(); 183 : 184 : void ResetReading() override; 185 : OGRFeature *GetNextFeature() override; 186 : OGRFeature *GetFeature(GIntBig nFID) override; 187 : GIntBig GetFeatureCount(int bForce) override; 188 : bool CheckSetupTable(AVCE00Section *psTblSectionIn); 189 : bool AppendTableFields(OGRFeature *poFeature); 190 : }; 191 : 192 : /************************************************************************/ 193 : /* OGRAVCE00DataSource */ 194 : /************************************************************************/ 195 : 196 : class OGRAVCE00DataSource final : public OGRAVCDataSource 197 : { 198 : int nLayers; 199 : AVCE00ReadE00Ptr psE00; 200 : OGRAVCE00Layer **papoLayers; 201 : 202 : protected: 203 : int CheckAddTable(AVCE00Section *psTblSection); 204 : 205 : public: 206 : OGRAVCE00DataSource(); 207 : virtual ~OGRAVCE00DataSource(); 208 : 209 : int Open(const char *, int bTestOpen); 210 : 211 2 : AVCE00ReadE00Ptr GetInfo() 212 : { 213 2 : return psE00; 214 : } 215 : 216 13 : int GetLayerCount() override 217 : { 218 13 : return nLayers; 219 : } 220 : 221 : OGRLayer *GetLayer(int) override; 222 : int TestCapability(const char *) override; 223 : virtual OGRSpatialReference *DSGetSpatialRef() override; 224 : }; 225 : 226 : #endif /* OGR_AVC_H_INCLUDED */