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