1 : /******************************************************************************
2 : * $Id: ogr_wfs.h 23702 2012-01-05 00:02:12Z rouault $
3 : *
4 : * Project: WFS Translator
5 : * Purpose: Definition of classes for OGR WFS driver.
6 : * Author: Even Rouault, even dot rouault at mines dash paris dot org
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2010, 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_WFS_H_INCLUDED
31 : #define _OGR_WFS_H_INCLUDED
32 :
33 : #include <vector>
34 : #include <set>
35 : #include <map>
36 :
37 : #include "cpl_minixml.h"
38 : #include "ogrsf_frmts.h"
39 : #include "gmlreader.h"
40 : #include "cpl_http.h"
41 :
42 : CPLXMLNode* WFSFindNode(CPLXMLNode* psXML, const char* pszRootName);
43 : CPLString WFS_TurnSQLFilterToOGCFilter( const char * pszFilter,
44 : int nVersion,
45 : int bPropertyIsNotEqualToSupported,
46 : int bUseFeatureId,
47 : int bGmlObjectIdNeedsGMLPrefix,
48 : int* pbOutNeedsNullCheck );
49 :
50 : const char* FindSubStringInsensitive(const char* pszStr,
51 : const char* pszSubStr);
52 :
53 : /************************************************************************/
54 : /* OGRWFSLayer */
55 : /************************************************************************/
56 :
57 : class OGRWFSDataSource;
58 :
59 : class OGRWFSLayer : public OGRLayer
60 : {
61 : OGRWFSDataSource* poDS;
62 :
63 : OGRFeatureDefn* poFeatureDefn;
64 : int bGotApproximateLayerDefn;
65 : GMLFeatureClass* poGMLFeatureClass;
66 :
67 : int bAxisOrderAlreadyInverted;
68 : OGRSpatialReference *poSRS;
69 :
70 : char* pszBaseURL;
71 : char* pszName;
72 : char* pszNS;
73 : char* pszNSVal;
74 :
75 : OGRDataSource *poBaseDS;
76 : OGRLayer *poBaseLayer;
77 : int bHasFetched;
78 : int bReloadNeeded;
79 :
80 : CPLString osGeometryColumnName;
81 : OGRwkbGeometryType eGeomType;
82 : int nFeatures;
83 :
84 : CPLString MakeGetFeatureURL(int nMaxFeatures, int bRequestHits);
85 : OGRDataSource* FetchGetFeature(int nMaxFeatures);
86 : OGRFeatureDefn* DescribeFeatureType();
87 : int ExecuteGetFeatureResultTypeHits();
88 :
89 : double dfMinX, dfMinY, dfMaxX, dfMaxY;
90 : int bHasExtents;
91 :
92 : OGRGeometry *poFetchedFilterGeom;
93 :
94 : CPLString osSQLWhere;
95 : CPLString osWFSWhere;
96 :
97 : CPLString osTargetNamespace;
98 : CPLString GetDescribeFeatureTypeURL(int bWithNS);
99 :
100 : int nExpectedInserts;
101 : CPLString osGlobalInsert;
102 : std::vector<CPLString> aosFIDList;
103 :
104 : int bInTransaction;
105 :
106 : CPLString GetPostHeader();
107 :
108 : int bUseFeatureIdAtLayerLevel;
109 :
110 : int bPagingActive;
111 : int nPagingStartIndex;
112 : int nFeatureRead;
113 : int nFeatureCountRequested;
114 :
115 : OGRFeatureDefn* BuildLayerDefnFromFeatureClass(GMLFeatureClass* poClass);
116 :
117 : char *pszRequiredOutputFormat;
118 : char *pszRequiredOutputFormatURL;
119 :
120 : CPLString osFieldToSort;
121 : int bAscFlag;
122 :
123 : public:
124 : OGRWFSLayer(OGRWFSDataSource* poDS,
125 : OGRSpatialReference* poSRS,
126 : int bAxisOrderAlreadyInverted,
127 : const char* pszBaseURL,
128 : const char* pszName,
129 : const char* pszNS,
130 : const char* pszNSVal);
131 :
132 : ~OGRWFSLayer();
133 :
134 : OGRWFSLayer* Clone();
135 :
136 :
137 9064 : const char *GetName() { return pszName; }
138 :
139 : virtual void ResetReading();
140 : virtual OGRFeature* GetNextFeature();
141 : virtual OGRFeature* GetFeature(long nFID);
142 :
143 : virtual OGRFeatureDefn * GetLayerDefn();
144 :
145 0 : virtual const char *GetGeometryColumn() { return osGeometryColumnName; }
146 :
147 : virtual int TestCapability( const char * );
148 :
149 : virtual OGRSpatialReference *GetSpatialRef();
150 :
151 : virtual void SetSpatialFilter( OGRGeometry * );
152 :
153 : virtual OGRErr SetAttributeFilter( const char * );
154 :
155 : virtual int GetFeatureCount( int bForce = TRUE );
156 :
157 : void SetExtents(double dfMinX, double dfMinY, double dfMaxX, double dfMaxY);
158 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE);
159 :
160 : virtual OGRErr CreateFeature( OGRFeature *poFeature );
161 : virtual OGRErr SetFeature( OGRFeature *poFeature );
162 : virtual OGRErr DeleteFeature( long nFID );
163 :
164 : virtual OGRErr StartTransaction();
165 : virtual OGRErr CommitTransaction();
166 : virtual OGRErr RollbackTransaction();
167 :
168 248 : int HasLayerDefn() { return poFeatureDefn != NULL; }
169 :
170 : OGRFeatureDefn* ParseSchema(CPLXMLNode* psSchema);
171 : OGRFeatureDefn* BuildLayerDefn(OGRFeatureDefn* poSrcFDefn = NULL);
172 :
173 : OGRErr DeleteFromFilter( CPLString osOGCFilter );
174 :
175 0 : const std::vector<CPLString>& GetLastInsertedFIDList() { return aosFIDList; }
176 :
177 : const char *GetShortName();
178 :
179 : void SetRequiredOutputFormat(const char* pszRequiredOutputFormatIn);
180 :
181 : const char *GetRequiredOutputFormat() { return pszRequiredOutputFormat; };
182 166 : const char *GetRequiredOutputFormatURL() { return pszRequiredOutputFormatURL; };
183 :
184 : void SetOrderBy(const char* pszFieldToSort, int bAscFlag);
185 2 : int HasGotApproximateLayerDefn() { GetLayerDefn(); return bGotApproximateLayerDefn; }
186 : };
187 :
188 : /************************************************************************/
189 : /* OGRWFSDataSource */
190 : /************************************************************************/
191 :
192 : class OGRWFSDataSource : public OGRDataSource
193 : {
194 : char* pszName;
195 : int bRewriteFile;
196 : CPLXMLNode* psFileXML;
197 :
198 : OGRWFSLayer** papoLayers;
199 : int nLayers;
200 : std::map<OGRLayer*, OGRLayer*> oMap;
201 :
202 : int bUpdate;
203 :
204 : int bGetFeatureSupportHits;
205 : CPLString osVersion;
206 : int bNeedNAMESPACE;
207 : int bHasMinOperators;
208 : int bHasNullCheck;
209 : int bPropertyIsNotEqualToSupported;
210 : int bUseFeatureId;
211 : int bGmlObjectIdNeedsGMLPrefix;
212 : int bRequiresEnvelopeSpatialFilter;
213 : int DetectRequiresEnvelopeSpatialFilter(CPLXMLNode* psRoot);
214 :
215 : int bTransactionSupport;
216 : char** papszIdGenMethods;
217 : int DetectTransactionSupport(CPLXMLNode* psRoot);
218 :
219 : CPLString osBaseURL;
220 : CPLString osPostTransactionURL;
221 :
222 : CPLXMLNode* LoadFromFile( const char * pszFilename );
223 :
224 : int bUseHttp10;
225 :
226 : char** papszHttpOptions;
227 :
228 : int bPagingAllowed;
229 : int nPageSize;
230 :
231 : int bIsGEOSERVER;
232 :
233 : int bLoadMultipleLayerDefn;
234 : std::set<CPLString> aoSetAlreadyTriedLayers;
235 :
236 : CPLString osLayerMetadataCSV;
237 : CPLString osLayerMetadataTmpFileName;
238 : OGRDataSource *poLayerMetadataDS;
239 : OGRLayer *poLayerMetadataLayer;
240 :
241 : CPLString osGetCapabilities;
242 : OGRDataSource *poLayerGetCapabilitiesDS;
243 : OGRLayer *poLayerGetCapabilitiesLayer;
244 :
245 : int bKeepLayerNamePrefix;
246 :
247 : CPLHTTPResult* SendGetCapabilities(const char* pszBaseURL,
248 : CPLString& osTypeName);
249 :
250 : int GetLayerIndex(const char* pszName);
251 :
252 : public:
253 : OGRWFSDataSource();
254 : ~OGRWFSDataSource();
255 :
256 : int Open( const char * pszFilename,
257 : int bUpdate );
258 :
259 18 : virtual const char* GetName() { return pszName; }
260 :
261 6 : virtual int GetLayerCount() { return nLayers; }
262 : virtual OGRLayer* GetLayer( int );
263 : virtual OGRLayer* GetLayerByName(const char* pszLayerName);
264 :
265 : virtual int TestCapability( const char * );
266 :
267 : virtual OGRLayer * ExecuteSQL( const char *pszSQLCommand,
268 : OGRGeometry *poSpatialFilter,
269 : const char *pszDialect );
270 : virtual void ReleaseResultSet( OGRLayer * poResultsSet );
271 :
272 6 : int UpdateMode() { return bUpdate; }
273 6 : int SupportTransactions() { return bTransactionSupport; }
274 0 : void DisableSupportHits() { bGetFeatureSupportHits = FALSE; }
275 26 : int GetFeatureSupportHits() { return bGetFeatureSupportHits; }
276 124 : const char *GetVersion() { return osVersion.c_str(); }
277 :
278 : int IsOldDeegree(const char* pszErrorString);
279 26 : int GetNeedNAMESPACE() { return bNeedNAMESPACE; }
280 34 : int HasMinOperators() { return bHasMinOperators; }
281 0 : int HasNullCheck() { return bHasNullCheck; }
282 14 : int UseFeatureId() { return bUseFeatureId; }
283 2 : int RequiresEnvelopeSpatialFilter() { return bRequiresEnvelopeSpatialFilter; }
284 0 : void SetGmlObjectIdNeedsGMLPrefix() { bGmlObjectIdNeedsGMLPrefix = TRUE; }
285 26 : int DoesGmlObjectIdNeedGMLPrefix() { return bGmlObjectIdNeedsGMLPrefix; }
286 :
287 2 : void SetPropertyIsNotEqualToUnSupported() { bPropertyIsNotEqualToSupported = FALSE; }
288 26 : int PropertyIsNotEqualToSupported() { return bPropertyIsNotEqualToSupported; }
289 :
290 : CPLString GetPostTransactionURL();
291 :
292 : void SaveLayerSchema(const char* pszLayerName, CPLXMLNode* psSchema);
293 :
294 : CPLHTTPResult* HTTPFetch( const char* pszURL, char** papszOptions );
295 :
296 36 : int IsPagingAllowed() { return bPagingAllowed; }
297 0 : int GetPageSize() { return nPageSize; }
298 :
299 : void LoadMultipleLayerDefn(const char* pszLayerName,
300 : char* pszNS, char* pszNSVal);
301 :
302 90 : int GetKeepLayerNamePrefix() { return bKeepLayerNamePrefix; }
303 : };
304 :
305 : /************************************************************************/
306 : /* OGRWFSDriver */
307 : /************************************************************************/
308 :
309 : class OGRWFSDriver : public OGRSFDriver
310 389 : {
311 : public:
312 : ~OGRWFSDriver();
313 :
314 : virtual const char* GetName();
315 : virtual OGRDataSource* Open( const char *, int );
316 : virtual int TestCapability( const char * );
317 : };
318 :
319 :
320 : #endif /* ndef _OGR_WFS_H_INCLUDED */
|