Line data Source code
1 : /****************************************************************************** 2 : * $Id $ 3 : * 4 : * Project: GeoRSS Translator 5 : * Purpose: Definition of classes for OGR GeoRSS driver. 6 : * Author: Even Rouault, even dot rouault at spatialys.com 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 2008-2010, Even Rouault <even dot rouault at spatialys.com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ****************************************************************************/ 13 : 14 : #ifndef OGR_GEORSS_H_INCLUDED 15 : #define OGR_GEORSS_H_INCLUDED 16 : 17 : #include "ogrsf_frmts.h" 18 : #include "ogr_p.h" 19 : #include "cpl_hash_set.h" 20 : 21 : #ifdef HAVE_EXPAT 22 : #include "ogr_expat.h" 23 : #endif 24 : 25 : constexpr int PARSER_BUF_SIZE = 8192; 26 : 27 : class OGRGeoRSSDataSource; 28 : 29 : typedef enum 30 : { 31 : GEORSS_ATOM, 32 : GEORSS_RSS, 33 : GEORSS_RSS_RDF, 34 : } OGRGeoRSSFormat; 35 : 36 : typedef enum 37 : { 38 : GEORSS_GML, 39 : GEORSS_SIMPLE, 40 : GEORSS_W3C_GEO 41 : } OGRGeoRSSGeomDialect; 42 : 43 : /************************************************************************/ 44 : /* OGRGeoRSSLayer */ 45 : /************************************************************************/ 46 : 47 : class OGRGeoRSSLayer final : public OGRLayer 48 : { 49 : OGRFeatureDefn *poFeatureDefn; 50 : OGRSpatialReference *poSRS; 51 : OGRGeoRSSDataSource *poDS; 52 : OGRGeoRSSFormat eFormat; 53 : 54 : bool bWriteMode; 55 : int nTotalFeatureCount; 56 : 57 : // TODO(schwehr): Remove eof? 58 : bool eof; 59 : int nNextFID; 60 : VSILFILE *fpGeoRSS; /* Large file API */ 61 : bool bHasReadSchema; 62 : #ifdef HAVE_EXPAT 63 : XML_Parser oParser; 64 : XML_Parser oSchemaParser; 65 : #endif 66 : OGRGeometry *poGlobalGeom; 67 : bool bStopParsing; 68 : bool bInFeature; 69 : bool hasFoundLat; 70 : bool hasFoundLon; 71 : #ifdef HAVE_EXPAT 72 : double latVal; 73 : double lonVal; 74 : #endif 75 : char *pszSubElementName; 76 : char *pszSubElementValue; 77 : int nSubElementValueLen; 78 : #ifdef HAVE_EXPAT 79 : int iCurrentField; 80 : #endif 81 : bool bInSimpleGeometry; 82 : bool bInGMLGeometry; 83 : bool bInGeoLat; 84 : bool bInGeoLong; 85 : #ifdef HAVE_EXPAT 86 : bool bFoundGeom; 87 : bool bSameSRS; 88 : #endif 89 : OGRwkbGeometryType eGeomType; 90 : char *pszGMLSRSName; 91 : bool bInTagWithSubTag; 92 : char *pszTagWithSubTag; 93 : int currentDepth; 94 : int featureDepth; 95 : int geometryDepth; 96 : #ifdef HAVE_EXPAT 97 : OGRFieldDefn *currentFieldDefn; 98 : int nWithoutEventCounter; 99 : int nDataHandlerCounter; 100 : #endif 101 : CPLHashSet *setOfFoundFields; 102 : 103 : OGRFeature *poFeature; 104 : OGRFeature **ppoFeatureTab; 105 : int nFeatureTabLength; 106 : int nFeatureTabIndex; 107 : 108 : private: 109 : #ifdef HAVE_EXPAT 110 : void AddStrToSubElementValue(const char *pszStr); 111 : #endif 112 : bool IsStandardField(const char *pszName); 113 : 114 : public: 115 : OGRGeoRSSLayer(const char *pszFilename, const char *layerName, 116 : OGRGeoRSSDataSource *poDS, OGRSpatialReference *poSRSIn, 117 : bool bWriteMode = false); 118 : ~OGRGeoRSSLayer() override; 119 : 120 : void ResetReading() override; 121 : OGRFeature *GetNextFeature() override; 122 : 123 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 124 : OGRErr CreateField(const OGRFieldDefn *poField, int bApproxOK) override; 125 : 126 : OGRFeatureDefn *GetLayerDefn() override; 127 : 128 : int TestCapability(const char *) override; 129 : 130 : GIntBig GetFeatureCount(int bForce) override; 131 : 132 : GDALDataset *GetDataset() override; 133 : 134 : void LoadSchema(); 135 : 136 : #ifdef HAVE_EXPAT 137 : void startElementCbk(const char *pszName, const char **ppszAttr); 138 : void endElementCbk(const char *pszName); 139 : void dataHandlerCbk(const char *data, int nLen); 140 : 141 : void startElementLoadSchemaCbk(const char *pszName, const char **ppszAttr); 142 : void endElementLoadSchemaCbk(const char *pszName); 143 : void dataHandlerLoadSchemaCbk(const char *data, int nLen); 144 : #endif 145 : }; 146 : 147 : /************************************************************************/ 148 : /* OGRGeoRSSDataSource */ 149 : /************************************************************************/ 150 : 151 : typedef enum 152 : { 153 : GEORSS_VALIDITY_UNKNOWN, 154 : GEORSS_VALIDITY_INVALID, 155 : GEORSS_VALIDITY_VALID 156 : } OGRGeoRSSValidity; 157 : 158 : class OGRGeoRSSDataSource final : public GDALDataset 159 : { 160 : OGRGeoRSSLayer **papoLayers; 161 : int nLayers; 162 : 163 : /* Export related */ 164 : VSILFILE *fpOutput; /* Virtual file API */ 165 : 166 : #ifdef HAVE_EXPAT 167 : OGRGeoRSSValidity validity; 168 : #endif 169 : OGRGeoRSSFormat eFormat; 170 : OGRGeoRSSGeomDialect eGeomDialect; 171 : bool bUseExtensions; 172 : bool bWriteHeaderAndFooter; 173 : #ifdef HAVE_EXPAT 174 : XML_Parser oCurrentParser; 175 : int nDataHandlerCounter; 176 : #endif 177 : 178 : public: 179 : OGRGeoRSSDataSource(); 180 : ~OGRGeoRSSDataSource() override; 181 : 182 : int Open(const char *pszFilename, int bUpdate); 183 : 184 : int Create(const char *pszFilename, char **papszOptions); 185 : 186 3 : int GetLayerCount() override 187 : { 188 3 : return nLayers; 189 : } 190 : 191 : OGRLayer *GetLayer(int) override; 192 : 193 : OGRLayer *ICreateLayer(const char *pszName, 194 : const OGRGeomFieldDefn *poGeomFieldDefn, 195 : CSLConstList papszOptions) override; 196 : int TestCapability(const char *) override; 197 : 198 95 : VSILFILE *GetOutputFP() 199 : { 200 95 : return fpOutput; 201 : } 202 : 203 68 : OGRGeoRSSFormat GetFormat() 204 : { 205 68 : return eFormat; 206 : } 207 : 208 95 : OGRGeoRSSGeomDialect GetGeomDialect() 209 : { 210 95 : return eGeomDialect; 211 : } 212 : 213 99 : bool GetUseExtensions() 214 : { 215 99 : return bUseExtensions; 216 : } 217 : 218 : #ifdef HAVE_EXPAT 219 : void startElementValidateCbk(const char *pszName, const char **ppszAttr); 220 : void dataHandlerValidateCbk(const char *data, int nLen); 221 : #endif 222 : }; 223 : 224 : #endif /* ndef _OGR_GeoRSS_H_INCLUDED */