Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: SVG Translator 4 : * Purpose: Definition of classes for OGR .svg driver. 5 : * Author: Even Rouault, even dot rouault at spatialys.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2011-2013, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGR_SVG_H_INCLUDED 14 : #define OGR_SVG_H_INCLUDED 15 : 16 : #include "ogrsf_frmts.h" 17 : 18 : #ifdef HAVE_EXPAT 19 : #include "ogr_expat.h" 20 : #endif 21 : 22 : class OGRSVGDataSource; 23 : 24 : typedef enum 25 : { 26 : SVG_POINTS, 27 : SVG_LINES, 28 : SVG_POLYGONS, 29 : } SVGGeometryType; 30 : 31 : constexpr int PARSER_BUF_SIZE = 8192; 32 : 33 : /************************************************************************/ 34 : /* OGRSVGLayer */ 35 : /************************************************************************/ 36 : 37 : class OGRSVGLayer final : public OGRLayer 38 : { 39 : OGRFeatureDefn *poFeatureDefn; 40 : OGRSpatialReference *poSRS; 41 : #ifdef HAVE_EXPAT 42 : OGRSVGDataSource *poDS; 43 : #endif 44 : CPLString osLayerName; 45 : 46 : SVGGeometryType svgGeomType; 47 : 48 : int nTotalFeatures; 49 : int nNextFID; 50 : VSILFILE *fpSVG; // Large file API. 51 : 52 : #ifdef HAVE_EXPAT 53 : XML_Parser oParser; 54 : XML_Parser oSchemaParser; 55 : #endif 56 : char *pszSubElementValue; 57 : int nSubElementValueLen; 58 : int iCurrentField; 59 : 60 : OGRFeature *poFeature; 61 : OGRFeature **ppoFeatureTab; 62 : int nFeatureTabLength; 63 : int nFeatureTabIndex; 64 : 65 : int depthLevel; 66 : int interestingDepthLevel; 67 : bool inInterestingElement; 68 : 69 : bool bStopParsing; 70 : #ifdef HAVE_EXPAT 71 : int nWithoutEventCounter; 72 : int nDataHandlerCounter; 73 : 74 : OGRSVGLayer *poCurLayer; 75 : #endif 76 : 77 : private: 78 : void LoadSchema(); 79 : 80 : public: 81 : OGRSVGLayer(const char *pszFilename, const char *layerName, 82 : SVGGeometryType svgGeomType, OGRSVGDataSource *poDS); 83 : virtual ~OGRSVGLayer(); 84 : 85 : virtual void ResetReading() override; 86 : virtual OGRFeature *GetNextFeature() override; 87 : 88 6 : virtual const char *GetName() override 89 : { 90 6 : return osLayerName.c_str(); 91 : } 92 : 93 : virtual OGRwkbGeometryType GetGeomType() override; 94 : 95 : virtual GIntBig GetFeatureCount(int bForce = TRUE) override; 96 : 97 : virtual OGRFeatureDefn *GetLayerDefn() override; 98 : 99 : virtual int TestCapability(const char *) override; 100 : 101 : #ifdef HAVE_EXPAT 102 : void startElementCbk(const char *pszName, const char **ppszAttr); 103 : void endElementCbk(const char *pszName); 104 : void dataHandlerCbk(const char *data, int nLen); 105 : 106 : void startElementLoadSchemaCbk(const char *pszName, const char **ppszAttr); 107 : void endElementLoadSchemaCbk(const char *pszName); 108 : void dataHandlerLoadSchemaCbk(const char *data, int nLen); 109 : #endif 110 : }; 111 : 112 : /************************************************************************/ 113 : /* OGRSVGDataSource */ 114 : /************************************************************************/ 115 : 116 : typedef enum 117 : { 118 : SVG_VALIDITY_UNKNOWN, 119 : SVG_VALIDITY_INVALID, 120 : SVG_VALIDITY_VALID 121 : } OGRSVGValidity; 122 : 123 : class OGRSVGDataSource final : public GDALDataset 124 : { 125 : OGRSVGLayer **papoLayers; 126 : int nLayers; 127 : 128 : #ifdef HAVE_EXPAT 129 : OGRSVGValidity eValidity; 130 : int bIsCloudmade; 131 : XML_Parser oCurrentParser; 132 : int nDataHandlerCounter; 133 : #endif 134 : 135 : public: 136 : OGRSVGDataSource(); 137 : virtual ~OGRSVGDataSource(); 138 : 139 : int Open(const char *pszFilename); 140 : 141 11 : virtual int GetLayerCount() override 142 : { 143 11 : return nLayers; 144 : } 145 : 146 : virtual OGRLayer *GetLayer(int) override; 147 : 148 : #ifdef HAVE_EXPAT 149 : void startElementValidateCbk(const char *pszName, const char **ppszAttr); 150 : void dataHandlerValidateCbk(const char *data, int nLen); 151 : #endif 152 : }; 153 : 154 : #endif /* ndef OGR_SVG_H_INCLUDED */