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