1 : /******************************************************************************
2 : * $Id: ogr_xlsx.h 24173 2012-03-29 21:09:52Z rouault $
3 : *
4 : * Project: XLSX Translator
5 : * Purpose: Definition of classes for OGR OpenOfficeSpreadsheet .xlsx 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 dash 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_XLSX_H_INCLUDED
31 : #define _OGR_XLSX_H_INCLUDED
32 :
33 : #include "ogrsf_frmts.h"
34 :
35 : #include "ogr_expat.h"
36 : #include "ogr_mem.h"
37 :
38 : #include <vector>
39 : #include <string>
40 : #include <map>
41 :
42 : /************************************************************************/
43 : /* OGRXLSXLayer */
44 : /************************************************************************/
45 :
46 : class OGRXLSXDataSource;
47 :
48 : class OGRXLSXLayer : public OGRMemLayer
49 106 : {
50 : int bInit;
51 : OGRXLSXDataSource* poDS;
52 : int nSheetId;
53 : void Init();
54 : int bUpdated;
55 : int bHasHeaderLine;
56 :
57 : public:
58 : OGRXLSXLayer( OGRXLSXDataSource* poDSIn,
59 : int nSheetIdIn,
60 : const char * pszName,
61 : int bUpdateIn = FALSE);
62 :
63 : int HasBeenUpdated() { return bUpdated; }
64 : void SetUpdated(int bUpdatedIn = TRUE);
65 :
66 : int GetHasHeaderLine() { return bHasHeaderLine; }
67 38 : void SetHasHeaderLine(int bIn) { bHasHeaderLine = bIn; }
68 :
69 524 : const char *GetName() { return OGRMemLayer::GetLayerDefn()->GetName(); };
70 10 : OGRwkbGeometryType GetGeomType() { return wkbNone; }
71 26 : virtual OGRSpatialReference *GetSpatialRef() { return NULL; }
72 :
73 153 : void ResetReading()
74 153 : { Init(); OGRMemLayer::ResetReading(); }
75 :
76 : /* For external usage. Mess with FID */
77 : virtual OGRFeature * GetNextFeature();
78 : virtual OGRFeature *GetFeature( long nFeatureId );
79 : virtual OGRErr SetFeature( OGRFeature *poFeature );
80 : virtual OGRErr DeleteFeature( long nFID );
81 :
82 18 : virtual OGRErr SetNextByIndex( long nIndex )
83 18 : { Init(); return OGRMemLayer::SetNextByIndex(nIndex); }
84 :
85 315 : OGRErr CreateFeature( OGRFeature *poFeature )
86 315 : { Init(); SetUpdated(); return OGRMemLayer::CreateFeature(poFeature); }
87 :
88 1456 : OGRFeatureDefn * GetLayerDefn()
89 1456 : { Init(); return OGRMemLayer::GetLayerDefn(); }
90 :
91 98 : int GetFeatureCount( int bForce )
92 98 : { Init(); return OGRMemLayer::GetFeatureCount(bForce); }
93 :
94 247 : virtual OGRErr CreateField( OGRFieldDefn *poField,
95 : int bApproxOK = TRUE )
96 247 : { Init(); SetUpdated(); return OGRMemLayer::CreateField(poField, bApproxOK); }
97 :
98 0 : virtual OGRErr DeleteField( int iField )
99 0 : { Init(); SetUpdated(); return OGRMemLayer::DeleteField(iField); }
100 :
101 0 : virtual OGRErr ReorderFields( int* panMap )
102 0 : { Init(); SetUpdated(); return OGRMemLayer::ReorderFields(panMap); }
103 :
104 14 : virtual OGRErr AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nFlags )
105 14 : { Init(); SetUpdated(); return OGRMemLayer::AlterFieldDefn(iField, poNewFieldDefn, nFlags); }
106 :
107 66 : int TestCapability( const char * pszCap )
108 66 : { Init(); return OGRMemLayer::TestCapability(pszCap); }
109 :
110 : virtual OGRErr SyncToDisk();
111 : };
112 :
113 : /************************************************************************/
114 : /* OGRXLSXDataSource */
115 : /************************************************************************/
116 : #define STACK_SIZE 5
117 :
118 : typedef enum
119 : {
120 : STATE_DEFAULT,
121 :
122 : /* for sharedString.xml */
123 : STATE_T,
124 :
125 : /* for sheet?.xml */
126 : STATE_SHEETDATA,
127 : STATE_ROW,
128 : STATE_CELL,
129 : STATE_TEXTV,
130 : } HandlerStateEnum;
131 :
132 : typedef struct
133 : {
134 : HandlerStateEnum eVal;
135 : int nBeginDepth;
136 : } HandlerState;
137 :
138 : class OGRXLSXDataSource : public OGRDataSource
139 : {
140 : char* pszName;
141 : int bUpdatable;
142 : int bUpdated;
143 :
144 : int nLayers;
145 : OGRLayer **papoLayers;
146 :
147 : void AnalyseSharedStrings(VSILFILE* fpSharedStrings);
148 : void AnalyseWorkbook(VSILFILE* fpWorkbook);
149 : void AnalyseStyles(VSILFILE* fpStyles);
150 :
151 : std::vector<std::string> apoSharedStrings;
152 : std::string osCurrentString;
153 :
154 : int bFirstLineIsHeaders;
155 : int bAutodetectTypes;
156 :
157 : XML_Parser oParser;
158 : int bStopParsing;
159 : int nWithoutEventCounter;
160 : int nDataHandlerCounter;
161 : int nCurLine;
162 : int nCurCol;
163 :
164 : OGRXLSXLayer *poCurLayer;
165 :
166 : int nStackDepth;
167 : int nDepth;
168 : HandlerState stateStack[STACK_SIZE];
169 :
170 : CPLString osValueType;
171 : CPLString osValue;
172 :
173 : std::vector<std::string> apoFirstLineValues;
174 : std::vector<std::string> apoFirstLineTypes;
175 : std::vector<std::string> apoCurLineValues;
176 : std::vector<std::string> apoCurLineTypes;
177 :
178 : int bInCellXFS;
179 : std::map<int,OGRFieldType> apoMapStyleFormats;
180 : std::vector<OGRFieldType> apoStyles;
181 :
182 : void PushState(HandlerStateEnum eVal);
183 : void startElementDefault(const char *pszName, const char **ppszAttr);
184 : void startElementTable(const char *pszName, const char **ppszAttr);
185 : void endElementTable(const char *pszName);
186 : void startElementRow(const char *pszName, const char **ppszAttr);
187 : void endElementRow(const char *pszName);
188 : void startElementCell(const char *pszName, const char **ppszAttr);
189 : void endElementCell(const char *pszName);
190 : void dataHandlerTextV(const char *data, int nLen);
191 :
192 : void DetectHeaderLine();
193 :
194 : OGRFieldType GetOGRFieldType(const char* pszValue,
195 : const char* pszValueType);
196 :
197 : void DeleteLayer( const char *pszLayerName );
198 :
199 : public:
200 : OGRXLSXDataSource();
201 : ~OGRXLSXDataSource();
202 :
203 : int Open( const char * pszFilename,
204 : VSILFILE* fpWorkbook,
205 : VSILFILE* fpSharedStrings,
206 : VSILFILE* fpStyles,
207 : int bUpdate );
208 : int Create( const char * pszName, char **papszOptions );
209 :
210 8 : virtual const char* GetName() { return pszName; }
211 :
212 : virtual int GetLayerCount();
213 : virtual OGRLayer* GetLayer( int );
214 :
215 : virtual int TestCapability( const char * );
216 :
217 : virtual OGRLayer* CreateLayer( const char * pszLayerName,
218 : OGRSpatialReference *poSRS,
219 : OGRwkbGeometryType eType,
220 : char ** papszOptions );
221 : virtual OGRErr DeleteLayer(int iLayer);
222 :
223 : virtual OGRErr SyncToDisk();
224 :
225 : void startElementCbk(const char *pszName, const char **ppszAttr);
226 : void endElementCbk(const char *pszName);
227 : void dataHandlerCbk(const char *data, int nLen);
228 :
229 : void startElementSSCbk(const char *pszName, const char **ppszAttr);
230 : void endElementSSCbk(const char *pszName);
231 : void dataHandlerSSCbk(const char *data, int nLen);
232 :
233 : void startElementWBCbk(const char *pszName, const char **ppszAttr);
234 :
235 : void startElementStylesCbk(const char *pszName, const char **ppszAttr);
236 : void endElementStylesCbk(const char *pszName);
237 :
238 : void BuildLayer(OGRXLSXLayer* poLayer, int nSheetId);
239 :
240 748 : int GetUpdatable() { return bUpdatable; }
241 3 : void SetUpdated() { bUpdated = TRUE; }
242 : };
243 :
244 : /************************************************************************/
245 : /* OGRXLSXDriver */
246 : /************************************************************************/
247 :
248 : class OGRXLSXDriver : public OGRSFDriver
249 226 : {
250 : public:
251 : ~OGRXLSXDriver();
252 :
253 : virtual const char* GetName();
254 : virtual OGRDataSource* Open( const char *, int );
255 : virtual int TestCapability( const char * );
256 :
257 : virtual OGRDataSource *CreateDataSource( const char *pszName,
258 : char ** = NULL );
259 : virtual OGRErr DeleteDataSource( const char *pszName );
260 :
261 : };
262 :
263 :
264 : #endif /* ndef _OGR_XLSX_H_INCLUDED */
|