1 /****************************************************************************** 2 * $Id: ogr_ods.h 28375 2015-01-30 12:06:11Z rouault $ 3 * 4 * Project: ODS Translator 5 * Purpose: Definition of classes for OGR OpenOfficeSpreadsheet .ods driver. 6 * Author: Even Rouault, even dot rouault at mines dash paris dot org 7 * 8 ****************************************************************************** 9 * Copyright (c) 2012, Even Rouault <even dot rouault at mines-paris dot org> 10 * 11 * Permission is hereby granted, free of charge, to any person obtaining a 12 * copy of this software and associated documentation files (the "Software"), 13 * to deal in the Software without restriction, including without limitation 14 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 15 * and/or sell copies of the Software, and to permit persons to whom the 16 * Software is furnished to do so, subject to the following conditions: 17 * 18 * The above copyright notice and this permission notice shall be included 19 * in all copies or substantial portions of the Software. 20 * 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 22 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 27 * DEALINGS IN THE SOFTWARE. 28 ****************************************************************************/ 29 30 #ifndef _OGR_ODS_H_INCLUDED 31 #define _OGR_ODS_H_INCLUDED 32 33 #include "ogrsf_frmts.h" 34 #include "ogr_mem.h" 35 36 #include "ogr_expat.h" 37 38 #include <vector> 39 #include <string> 40 #include <set> 41 42 /************************************************************************/ 43 /* OGRODSLayer */ 44 /************************************************************************/ 45 46 class OGRODSDataSource; 47 48 class OGRODSLayer : public OGRMemLayer 49 { 50 OGRODSDataSource* poDS; 51 int bUpdated; 52 int bHasHeaderLine; 53 54 public: 55 OGRODSLayer( OGRODSDataSource* poDSIn, 56 const char * pszName, 57 int bUpdateIn = FALSE); 58 59 void SetUpdated(int bUpdatedIn = TRUE); 60 GetHasHeaderLine()61 int GetHasHeaderLine() { return bHasHeaderLine; } SetHasHeaderLine(int bIn)62 void SetHasHeaderLine(int bIn) { bHasHeaderLine = bIn; } 63 GetName()64 const char *GetName() { return OGRMemLayer::GetLayerDefn()->GetName(); }; GetGeomType()65 OGRwkbGeometryType GetGeomType() { return wkbNone; } GetSpatialRef()66 virtual OGRSpatialReference *GetSpatialRef() { return NULL; } 67 68 /* For external usage. Mess with FID */ 69 virtual OGRFeature * GetNextFeature(); 70 virtual OGRFeature *GetFeature( GIntBig nFeatureId ); 71 virtual OGRErr ISetFeature( OGRFeature *poFeature ); 72 virtual OGRErr DeleteFeature( GIntBig nFID ); 73 74 /* For internal usage, for cell resolver */ GetNextFeatureWithoutFIDHack()75 OGRFeature * GetNextFeatureWithoutFIDHack() { return OGRMemLayer::GetNextFeature(); } SetFeatureWithoutFIDHack(OGRFeature * poFeature)76 OGRErr SetFeatureWithoutFIDHack( OGRFeature *poFeature ) { SetUpdated(); return OGRMemLayer::ISetFeature(poFeature); } 77 ICreateFeature(OGRFeature * poFeature)78 OGRErr ICreateFeature( OGRFeature *poFeature ) 79 { SetUpdated(); return OGRMemLayer::ICreateFeature(poFeature); } 80 81 virtual OGRErr CreateField( OGRFieldDefn *poField, 82 int bApproxOK = TRUE ) 83 { SetUpdated(); return OGRMemLayer::CreateField(poField, bApproxOK); } 84 DeleteField(int iField)85 virtual OGRErr DeleteField( int iField ) 86 { SetUpdated(); return OGRMemLayer::DeleteField(iField); } 87 ReorderFields(int * panMap)88 virtual OGRErr ReorderFields( int* panMap ) 89 { SetUpdated(); return OGRMemLayer::ReorderFields(panMap); } 90 AlterFieldDefn(int iField,OGRFieldDefn * poNewFieldDefn,int nFlags)91 virtual OGRErr AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nFlags ) 92 { SetUpdated(); return OGRMemLayer::AlterFieldDefn(iField, poNewFieldDefn, nFlags); } 93 94 virtual OGRErr SyncToDisk(); 95 }; 96 97 /************************************************************************/ 98 /* OGRODSDataSource */ 99 /************************************************************************/ 100 #define STACK_SIZE 5 101 102 typedef enum 103 { 104 STATE_DEFAULT, 105 STATE_TABLE, 106 STATE_ROW, 107 STATE_CELL, 108 STATE_TEXTP, 109 } HandlerStateEnum; 110 111 typedef struct 112 { 113 HandlerStateEnum eVal; 114 int nBeginDepth; 115 } HandlerState; 116 117 class OGRODSDataSource : public OGRDataSource 118 { 119 char* pszName; 120 int bUpdatable; 121 int bUpdated; 122 int bAnalysedFile; 123 124 int nLayers; 125 OGRLayer **papoLayers; 126 127 VSILFILE* fpSettings; 128 std::string osCurrentConfigTableName; 129 std::string osConfigName; 130 int nFlags; 131 std::set<std::string> osSetLayerHasSplitter; 132 void AnalyseSettings(); 133 134 VSILFILE* fpContent; 135 void AnalyseFile(); 136 137 int bFirstLineIsHeaders; 138 int bAutodetectTypes; 139 140 XML_Parser oParser; 141 int bStopParsing; 142 int nWithoutEventCounter; 143 int nDataHandlerCounter; 144 int nCurLine; 145 int nEmptyRowsAccumulated; 146 int nRowsRepeated; 147 int nCurCol; 148 int nCellsRepeated; 149 int bEndTableParsing; 150 151 OGRODSLayer *poCurLayer; 152 153 int nStackDepth; 154 int nDepth; 155 HandlerState stateStack[STACK_SIZE]; 156 157 CPLString osValueType; 158 CPLString osValue; 159 std::string osFormula; 160 161 std::vector<std::string> apoFirstLineValues; 162 std::vector<std::string> apoFirstLineTypes; 163 std::vector<std::string> apoCurLineValues; 164 std::vector<std::string> apoCurLineTypes; 165 166 void PushState(HandlerStateEnum eVal); 167 void startElementDefault(const char *pszName, const char **ppszAttr); 168 void startElementTable(const char *pszName, const char **ppszAttr); 169 void endElementTable(const char *pszName); 170 void startElementRow(const char *pszName, const char **ppszAttr); 171 void endElementRow(const char *pszName); 172 void startElementCell(const char *pszName, const char **ppszAttr); 173 void endElementCell(const char *pszName); 174 void dataHandlerTextP(const char *data, int nLen); 175 176 void DetectHeaderLine(); 177 178 OGRFieldType GetOGRFieldType(const char* pszValue, 179 const char* pszValueType); 180 181 void DeleteLayer( const char *pszLayerName ); 182 183 public: 184 OGRODSDataSource(); 185 ~OGRODSDataSource(); 186 187 int Open( const char * pszFilename, 188 VSILFILE* fpContentIn, 189 VSILFILE* fpSettingsIn, 190 int bUpdatableIn ); 191 int Create( const char * pszName, char **papszOptions ); 192 GetName()193 virtual const char* GetName() { return pszName; } 194 195 virtual int GetLayerCount(); 196 virtual OGRLayer* GetLayer( int ); 197 198 virtual int TestCapability( const char * ); 199 200 virtual OGRLayer* ICreateLayer( const char * pszLayerName, 201 OGRSpatialReference *poSRS, 202 OGRwkbGeometryType eType, 203 char ** papszOptions ); 204 virtual OGRErr DeleteLayer(int iLayer); 205 206 virtual void FlushCache(); 207 208 void startElementCbk(const char *pszName, const char **ppszAttr); 209 void endElementCbk(const char *pszName); 210 void dataHandlerCbk(const char *data, int nLen); 211 212 void startElementStylesCbk(const char *pszName, const char **ppszAttr); 213 void endElementStylesCbk(const char *pszName); 214 void dataHandlerStylesCbk(const char *data, int nLen); 215 GetUpdatable()216 int GetUpdatable() { return bUpdatable; } SetUpdated()217 void SetUpdated() { bUpdated = TRUE; } 218 }; 219 220 /************************************************************************/ 221 /* OGRODSDriver */ 222 /************************************************************************/ 223 224 class OGRODSDriver : public OGRSFDriver 225 { 226 public: 227 ~OGRODSDriver(); 228 229 virtual const char* GetName(); 230 virtual OGRDataSource* Open( const char *, int ); 231 virtual int TestCapability( const char * ); 232 233 virtual OGRDataSource *CreateDataSource( const char *pszName, 234 char ** = NULL ); 235 virtual OGRErr DeleteDataSource( const char *pszName ); 236 }; 237 238 239 #endif /* ndef _OGR_ODS_H_INCLUDED */ 240