Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Private definitions within the OGR GMT driver. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2007, Frank Warmerdam <warmerdam@pobox.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGRGMT_H_INCLUDED 14 : #define OGRGMT_H_INCLUDED 15 : 16 : #include "ogrsf_frmts.h" 17 : #include "ogr_api.h" 18 : #include "cpl_string.h" 19 : 20 : /************************************************************************/ 21 : /* OGRGmtLayer */ 22 : /************************************************************************/ 23 : 24 : class OGRGmtLayer final : public OGRLayer, 25 : public OGRGetNextFeatureThroughRaw<OGRGmtLayer> 26 : { 27 : GDALDataset *m_poDS = nullptr; 28 : OGRSpatialReference *m_poSRS = nullptr; 29 : OGRFeatureDefn *poFeatureDefn; 30 : 31 : int iNextFID; 32 : 33 : bool bUpdate; 34 : bool bHeaderComplete; 35 : 36 : bool bRegionComplete; 37 : OGREnvelope sRegion; 38 : vsi_l_offset nRegionOffset; 39 : 40 : VSILFILE *m_fp = nullptr; 41 : 42 : bool ReadLine(); 43 : CPLString osLine; 44 : char **papszKeyedValues; 45 : 46 : bool ScanAheadForHole(); 47 : bool NextIsFeature(); 48 : 49 : OGRFeature *GetNextRawFeature(); 50 : 51 : OGRErr WriteGeometry(OGRGeometryH hGeom, bool bHaveAngle); 52 : OGRErr CompleteHeader(OGRGeometry *); 53 : 54 : public: 55 : bool bValidFile; 56 : 57 : OGRGmtLayer(GDALDataset *poDS, const char *pszFilename, VSILFILE *fp, 58 : const OGRSpatialReference *poSRS, int bUpdate); 59 : virtual ~OGRGmtLayer(); 60 : 61 : void ResetReading() override; 62 50 : DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRGmtLayer) 63 : 64 352 : OGRFeatureDefn *GetLayerDefn() override 65 : { 66 352 : return poFeatureDefn; 67 : } 68 : 69 : OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; 70 : 71 0 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, 72 : int bForce) override 73 : { 74 0 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce); 75 : } 76 : 77 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 78 : 79 : virtual OGRErr CreateField(const OGRFieldDefn *poField, 80 : int bApproxOK = TRUE) override; 81 : 82 : int TestCapability(const char *) override; 83 : 84 17 : GDALDataset *GetDataset() override 85 : { 86 17 : return m_poDS; 87 : } 88 : }; 89 : 90 : /************************************************************************/ 91 : /* OGRGmtDataSource */ 92 : /************************************************************************/ 93 : 94 : class OGRGmtDataSource final : public GDALDataset 95 : { 96 : OGRGmtLayer **papoLayers; 97 : int nLayers; 98 : 99 : bool bUpdate; 100 : 101 : public: 102 : OGRGmtDataSource(); 103 : virtual ~OGRGmtDataSource(); 104 : 105 : int Open(const char *pszFilename, VSILFILE *fp, 106 : const OGRSpatialReference *poSRS, int bUpdate); 107 : 108 3 : int GetLayerCount() override 109 : { 110 3 : return nLayers; 111 : } 112 : 113 : OGRLayer *GetLayer(int) override; 114 : 115 : OGRLayer *ICreateLayer(const char *pszName, 116 : const OGRGeomFieldDefn *poGeomFieldDefn, 117 : CSLConstList papszOptions) override; 118 : int TestCapability(const char *) override; 119 : }; 120 : 121 : #endif /* ndef OGRGMT_H_INCLUDED */