Line data Source code
1 : /****************************************************************************** 2 : * $Id$ 3 : * 4 : * Project: PDS Translator 5 : * Purpose: Definition of classes for OGR .pdstable driver. 6 : * Author: Even Rouault, even dot rouault at spatialys.com 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 2010, Even Rouault <even dot rouault at spatialys.com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #ifndef OGR_PDS_H_INCLUDED 15 : #define OGR_PDS_H_INCLUDED 16 : 17 : #include "ogrsf_frmts.h" 18 : #include "nasakeywordhandler.h" 19 : 20 : namespace OGRPDS 21 : { 22 : 23 : /************************************************************************/ 24 : /* OGRPDSLayer */ 25 : /************************************************************************/ 26 : 27 : typedef enum 28 : { 29 : ASCII_REAL, 30 : ASCII_INTEGER, 31 : CHARACTER, 32 : MSB_INTEGER, 33 : MSB_UNSIGNED_INTEGER, 34 : IEEE_REAL, 35 : } FieldFormat; 36 : 37 : typedef struct 38 : { 39 : int nStartByte; 40 : int nByteCount; 41 : FieldFormat eFormat; 42 : int nItemBytes; 43 : int nItems; 44 : } FieldDesc; 45 : 46 : class OGRPDSLayer final : public OGRLayer, 47 : public OGRGetNextFeatureThroughRaw<OGRPDSLayer> 48 : { 49 : OGRFeatureDefn *poFeatureDefn; 50 : 51 : std::string osTableID; 52 : VSILFILE *fpPDS; 53 : int nRecords; 54 : int nStartBytes; 55 : int nRecordSize; 56 : GByte *pabyRecord; 57 : int nNextFID; 58 : int nLongitudeIndex; 59 : int nLatitudeIndex; 60 : 61 : FieldDesc *pasFieldDesc; 62 : 63 : void ReadStructure(const std::string &osStructureFilename); 64 : OGRFeature *GetNextRawFeature(); 65 : 66 : CPL_DISALLOW_COPY_ASSIGN(OGRPDSLayer) 67 : 68 : public: 69 : OGRPDSLayer(const std::string &osTableID, const char *pszLayerName, 70 : VSILFILE *fp, const std::string &osLabelFilename, 71 : const std::string &osStructureFilename, int nRecords, 72 : int nStartBytes, int nRecordSize, GByte *pabyRecord, 73 : bool bIsASCII); 74 : virtual ~OGRPDSLayer(); 75 : 76 : virtual void ResetReading() override; 77 2 : DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(OGRPDSLayer) 78 : 79 1 : virtual OGRFeatureDefn *GetLayerDefn() override 80 : { 81 1 : return poFeatureDefn; 82 : } 83 : 84 : virtual int TestCapability(const char *) override; 85 : 86 : virtual GIntBig GetFeatureCount(int bForce = TRUE) override; 87 : 88 : virtual OGRFeature *GetFeature(GIntBig nFID) override; 89 : 90 : virtual OGRErr SetNextByIndex(GIntBig nIndex) override; 91 : }; 92 : 93 : } // namespace OGRPDS 94 : 95 : /************************************************************************/ 96 : /* OGRPDSDataSource */ 97 : /************************************************************************/ 98 : 99 : class OGRPDSDataSource final : public GDALDataset 100 : { 101 : OGRLayer **papoLayers; 102 : int nLayers; 103 : 104 : NASAKeywordHandler oKeywords; 105 : 106 : CPLString osTempResult; 107 : const char *GetKeywordSub(const char *pszPath, int iSubscript, 108 : const char *pszDefault); 109 : 110 : bool LoadTable(const char *pszFilename, int nRecordSize, 111 : CPLString osTableID); 112 : 113 : public: 114 : OGRPDSDataSource(); 115 : virtual ~OGRPDSDataSource(); 116 : 117 : int Open(const char *pszFilename); 118 : 119 3 : virtual int GetLayerCount() override 120 : { 121 3 : return nLayers; 122 : } 123 : 124 : virtual OGRLayer *GetLayer(int) override; 125 : 126 : static void CleanString(CPLString &osInput); 127 : }; 128 : 129 : #endif /* ndef OGR_PDS_H_INCLUDED */