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