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