Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: JML .jml Translator 4 : * Purpose: Definition of classes for OGR JML driver. 5 : * Author: Even Rouault, even dot rouault at spatialys dot com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2014, Even Rouault <even dot rouault at spatialys dot com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGR_JML_H_INCLUDED 14 : #define OGR_JML_H_INCLUDED 15 : 16 : #include "ogrsf_frmts.h" 17 : #include "ogr_p.h" 18 : 19 : #ifdef HAVE_EXPAT 20 : #include "ogr_expat.h" 21 : #endif 22 : 23 : #include <vector> 24 : 25 : class OGRJMLDataset; 26 : 27 : #ifdef HAVE_EXPAT 28 : 29 : /************************************************************************/ 30 : /* OGRJMLColumn */ 31 : /************************************************************************/ 32 : 33 : class OGRJMLColumn 34 : { 35 : public: 36 : CPLString osName; 37 : CPLString osType; 38 : CPLString osElementName; 39 : CPLString osAttributeName; 40 : CPLString osAttributeValue; 41 : bool bIsBody; /* if false: attribute */ 42 : 43 42 : OGRJMLColumn() : bIsBody(false) 44 : { 45 42 : } 46 : }; 47 : 48 : /************************************************************************/ 49 : /* OGRJMLLayer */ 50 : /************************************************************************/ 51 : 52 : class OGRJMLLayer final : public OGRLayer 53 : { 54 : GDALDataset *m_poDS = nullptr; 55 : OGRFeatureDefn *poFeatureDefn; 56 : 57 : int nNextFID; 58 : VSILFILE *fp; 59 : bool bHasReadSchema; 60 : 61 : XML_Parser oParser; 62 : 63 : int currentDepth; 64 : bool bStopParsing; 65 : int nWithoutEventCounter; 66 : int nDataHandlerCounter; 67 : 68 : bool bAccumulateElementValue; 69 : char *pszElementValue; 70 : int nElementValueLen; 71 : int nElementValueAlloc; 72 : 73 : OGRFeature *poFeature; 74 : OGRFeature **ppoFeatureTab; 75 : int nFeatureTabLength; 76 : int nFeatureTabIndex; 77 : 78 : bool bSchemaFinished; 79 : int nJCSGMLInputTemplateDepth; 80 : int nCollectionElementDepth; 81 : int nFeatureCollectionDepth; 82 : CPLString osCollectionElement; 83 : int nFeatureElementDepth; 84 : CPLString osFeatureElement; 85 : int nGeometryElementDepth; 86 : CPLString osGeometryElement; 87 : int nColumnDepth; 88 : int nNameDepth; 89 : int nTypeDepth; 90 : int nAttributeElementDepth; 91 : int iAttr; 92 : int iRGBField; 93 : CPLString osSRSName; 94 : 95 : OGRJMLColumn oCurColumn; 96 : std::vector<OGRJMLColumn> aoColumns; 97 : 98 : void AddStringToElementValue(const char *data, int nLen); 99 : void StopAccumulate(); 100 : 101 : void LoadSchema(); 102 : 103 : public: 104 : OGRJMLLayer(const char *pszLayerName, OGRJMLDataset *poDS, VSILFILE *fp); 105 : ~OGRJMLLayer(); 106 : 107 28 : const char *GetName() override 108 : { 109 28 : return poFeatureDefn->GetName(); 110 : } 111 : 112 : void ResetReading() override; 113 : OGRFeature *GetNextFeature() override; 114 : 115 : OGRFeatureDefn *GetLayerDefn() override; 116 : 117 : int TestCapability(const char *) override; 118 : 119 1 : GDALDataset *GetDataset() override 120 : { 121 1 : return m_poDS; 122 : } 123 : 124 : void startElementCbk(const char *pszName, const char **ppszAttr); 125 : void endElementCbk(const char *pszName); 126 : void dataHandlerCbk(const char *data, int nLen); 127 : 128 : void startElementLoadSchemaCbk(const char *pszName, const char **ppszAttr); 129 : void endElementLoadSchemaCbk(const char *pszName); 130 : }; 131 : 132 : #endif /* HAVE_EXPAT */ 133 : 134 : /************************************************************************/ 135 : /* OGRJMLWriterLayer */ 136 : /************************************************************************/ 137 : 138 : class OGRJMLWriterLayer final : public OGRLayer 139 : { 140 : OGRJMLDataset *poDS; 141 : OGRFeatureDefn *poFeatureDefn; 142 : VSILFILE *fp; 143 : bool bFeaturesWritten; 144 : bool bAddRGBField; 145 : bool bAddOGRStyleField; 146 : bool bClassicGML; 147 : int nNextFID; 148 : CPLString osSRSAttr; 149 : OGREnvelope sLayerExtent; 150 : vsi_l_offset nBBoxOffset; 151 : 152 : void WriteColumnDeclaration(const char *pszName, const char *pszType); 153 : 154 : public: 155 : OGRJMLWriterLayer(const char *pszLayerName, OGRSpatialReference *poSRS, 156 : OGRJMLDataset *poDSIn, VSILFILE *fp, bool bAddRGBField, 157 : bool bAddOGRStyleField, bool bClassicGML); 158 : ~OGRJMLWriterLayer(); 159 : 160 17 : void ResetReading() override 161 : { 162 17 : } 163 : 164 17 : OGRFeature *GetNextFeature() override 165 : { 166 17 : return nullptr; 167 : } 168 : 169 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 170 : OGRErr CreateField(const OGRFieldDefn *poField, int bApproxOK) override; 171 : 172 309 : OGRFeatureDefn *GetLayerDefn() override 173 : { 174 309 : return poFeatureDefn; 175 : } 176 : 177 : int TestCapability(const char *) override; 178 : 179 : GDALDataset *GetDataset() override; 180 : }; 181 : 182 : /************************************************************************/ 183 : /* OGRJMLDataset */ 184 : /************************************************************************/ 185 : 186 : class OGRJMLDataset final : public GDALDataset 187 : { 188 : OGRLayer *poLayer; 189 : 190 : VSILFILE *fp; /* Virtual file API */ 191 : bool bWriteMode; 192 : 193 : public: 194 : OGRJMLDataset(); 195 : ~OGRJMLDataset(); 196 : 197 31 : int GetLayerCount() override 198 : { 199 31 : return poLayer != nullptr ? 1 : 0; 200 : } 201 : 202 : OGRLayer *GetLayer(int) override; 203 : 204 : OGRLayer *ICreateLayer(const char *pszName, 205 : const OGRGeomFieldDefn *poGeomFieldDefn, 206 : CSLConstList papszOptions) override; 207 : 208 : int TestCapability(const char *) override; 209 : 210 : static int Identify(GDALOpenInfo *poOpenInfo); 211 : static GDALDataset *Open(GDALOpenInfo *poOpenInfo); 212 : static GDALDataset *Create(const char *pszFilename, int nBands, int nXSize, 213 : int nYSize, GDALDataType eDT, 214 : char **papszOptions); 215 : }; 216 : 217 : #endif /* ndef OGR_JML_H_INCLUDED */