1 : /******************************************************************************
2 : * $Id: ogrsf_frmts.h 23554 2011-12-12 18:10:25Z rouault $
3 : *
4 : * Project: OpenGIS Simple Features Reference Implementation
5 : * Purpose: Classes related to format registration, and file opening.
6 : * Author: Frank Warmerdam, warmerda@home.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 1999, Les Technologies SoftMap Inc.
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 _OGRSF_FRMTS_H_INCLUDED
31 : #define _OGRSF_FRMTS_H_INCLUDED
32 :
33 : #include "ogr_feature.h"
34 : #include "ogr_featurestyle.h"
35 :
36 : /**
37 : * \file ogrsf_frmts.h
38 : *
39 : * Classes related to registration of format support, and opening datasets.
40 : */
41 :
42 : class OGRLayerAttrIndex;
43 : class OGRSFDriver;
44 :
45 : /************************************************************************/
46 : /* OGRLayer */
47 : /************************************************************************/
48 :
49 : /**
50 : * This class represents a layer of simple features, with access methods.
51 : *
52 : */
53 :
54 : class CPL_DLL OGRLayer
55 : {
56 : protected:
57 : int m_bFilterIsEnvelope;
58 : OGRGeometry *m_poFilterGeom;
59 : OGREnvelope m_sFilterEnvelope;
60 :
61 : int FilterGeometry( OGRGeometry * );
62 : int InstallFilter( OGRGeometry * );
63 :
64 : public:
65 : OGRLayer();
66 : virtual ~OGRLayer();
67 :
68 : virtual OGRGeometry *GetSpatialFilter();
69 : virtual void SetSpatialFilter( OGRGeometry * );
70 : virtual void SetSpatialFilterRect( double dfMinX, double dfMinY,
71 : double dfMaxX, double dfMaxY );
72 :
73 : virtual OGRErr SetAttributeFilter( const char * );
74 :
75 : virtual void ResetReading() = 0;
76 : virtual OGRFeature *GetNextFeature() = 0;
77 : virtual OGRErr SetNextByIndex( long nIndex );
78 : virtual OGRFeature *GetFeature( long nFID );
79 : virtual OGRErr SetFeature( OGRFeature *poFeature );
80 : virtual OGRErr CreateFeature( OGRFeature *poFeature );
81 : virtual OGRErr DeleteFeature( long nFID );
82 :
83 : virtual const char *GetName();
84 : virtual OGRwkbGeometryType GetGeomType();
85 : virtual OGRFeatureDefn *GetLayerDefn() = 0;
86 :
87 0 : virtual OGRSpatialReference *GetSpatialRef() { return NULL; }
88 :
89 : virtual int GetFeatureCount( int bForce = TRUE );
90 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE);
91 :
92 : virtual int TestCapability( const char * ) = 0;
93 :
94 : virtual const char *GetInfo( const char * );
95 :
96 : virtual OGRErr CreateField( OGRFieldDefn *poField,
97 : int bApproxOK = TRUE );
98 : virtual OGRErr DeleteField( int iField );
99 : virtual OGRErr ReorderFields( int* panMap );
100 : virtual OGRErr AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nFlags );
101 :
102 : virtual OGRErr SyncToDisk();
103 :
104 : virtual OGRStyleTable *GetStyleTable();
105 : virtual void SetStyleTableDirectly( OGRStyleTable *poStyleTable );
106 :
107 : virtual void SetStyleTable(OGRStyleTable *poStyleTable);
108 :
109 : virtual OGRErr StartTransaction();
110 : virtual OGRErr CommitTransaction();
111 : virtual OGRErr RollbackTransaction();
112 :
113 : virtual const char *GetFIDColumn();
114 : virtual const char *GetGeometryColumn();
115 :
116 : virtual OGRErr SetIgnoredFields( const char **papszFields );
117 :
118 : int Reference();
119 : int Dereference();
120 : int GetRefCount() const;
121 :
122 : GIntBig GetFeaturesRead();
123 :
124 : /* non virtual : conveniency wrapper for ReorderFields() */
125 : OGRErr ReorderField( int iOldFieldPos, int iNewFieldPos );
126 :
127 : int AttributeFilterEvaluationNeedsGeometry();
128 :
129 : /* consider these private */
130 : OGRErr InitializeIndexSupport( const char * );
131 330 : OGRLayerAttrIndex *GetIndex() { return m_poAttrIndex; }
132 :
133 : protected:
134 : OGRStyleTable *m_poStyleTable;
135 : OGRFeatureQuery *m_poAttrQuery;
136 : OGRLayerAttrIndex *m_poAttrIndex;
137 :
138 : int m_nRefCount;
139 :
140 : GIntBig m_nFeaturesRead;
141 : };
142 :
143 :
144 : /************************************************************************/
145 : /* OGRDataSource */
146 : /************************************************************************/
147 :
148 : /**
149 : * This class represents a data source. A data source potentially
150 : * consists of many layers (OGRLayer). A data source normally consists
151 : * of one, or a related set of files, though the name doesn't have to be
152 : * a real item in the file system.
153 : *
154 : * When an OGRDataSource is destroyed, all it's associated OGRLayers objects
155 : * are also destroyed.
156 : */
157 :
158 : class CPL_DLL OGRDataSource
159 : {
160 : friend class OGRSFDriverRegistrar;
161 :
162 : void *m_hMutex;
163 :
164 : public:
165 :
166 : OGRDataSource();
167 : virtual ~OGRDataSource();
168 : static void DestroyDataSource( OGRDataSource * );
169 :
170 : virtual const char *GetName() = 0;
171 :
172 : virtual int GetLayerCount() = 0;
173 : virtual OGRLayer *GetLayer(int) = 0;
174 : virtual OGRLayer *GetLayerByName(const char *);
175 : virtual OGRErr DeleteLayer(int);
176 :
177 : virtual int TestCapability( const char * ) = 0;
178 :
179 : virtual OGRLayer *CreateLayer( const char *pszName,
180 : OGRSpatialReference *poSpatialRef = NULL,
181 : OGRwkbGeometryType eGType = wkbUnknown,
182 : char ** papszOptions = NULL );
183 : virtual OGRLayer *CopyLayer( OGRLayer *poSrcLayer,
184 : const char *pszNewName,
185 : char **papszOptions = NULL );
186 :
187 : virtual OGRStyleTable *GetStyleTable();
188 : virtual void SetStyleTableDirectly( OGRStyleTable *poStyleTable );
189 :
190 : virtual void SetStyleTable(OGRStyleTable *poStyleTable);
191 :
192 : virtual OGRLayer * ExecuteSQL( const char *pszStatement,
193 : OGRGeometry *poSpatialFilter,
194 : const char *pszDialect );
195 : virtual void ReleaseResultSet( OGRLayer * poResultsSet );
196 :
197 : virtual OGRErr SyncToDisk();
198 :
199 : int Reference();
200 : int Dereference();
201 : int GetRefCount() const;
202 : int GetSummaryRefCount() const;
203 : OGRErr Release();
204 :
205 : OGRSFDriver *GetDriver() const;
206 : void SetDriver( OGRSFDriver *poDriver );
207 :
208 : protected:
209 :
210 : OGRErr ProcessSQLCreateIndex( const char * );
211 : OGRErr ProcessSQLDropIndex( const char * );
212 : OGRErr ProcessSQLDropTable( const char * );
213 : OGRErr ProcessSQLAlterTableAddColumn( const char * );
214 : OGRErr ProcessSQLAlterTableDropColumn( const char * );
215 : OGRErr ProcessSQLAlterTableAlterColumn( const char * );
216 : OGRErr ProcessSQLAlterTableRenameColumn( const char * );
217 :
218 : OGRStyleTable *m_poStyleTable;
219 : int m_nRefCount;
220 : OGRSFDriver *m_poDriver;
221 : };
222 :
223 : /************************************************************************/
224 : /* OGRSFDriver */
225 : /************************************************************************/
226 :
227 : /**
228 : * Represents an operational format driver.
229 : *
230 : * One OGRSFDriver derived class will normally exist for each file format
231 : * registered for use, regardless of whether a file has or will be opened.
232 : * The list of available drivers is normally managed by the
233 : * OGRSFDriverRegistrar.
234 : */
235 :
236 : class CPL_DLL OGRSFDriver
237 0 : {
238 : public:
239 : virtual ~OGRSFDriver();
240 :
241 : virtual const char *GetName() = 0;
242 :
243 : virtual OGRDataSource *Open( const char *pszName, int bUpdate=FALSE ) = 0;
244 :
245 : virtual int TestCapability( const char * ) = 0;
246 :
247 : virtual OGRDataSource *CreateDataSource( const char *pszName,
248 : char ** = NULL );
249 : virtual OGRErr DeleteDataSource( const char *pszName );
250 :
251 : virtual OGRDataSource *CopyDataSource( OGRDataSource *poSrcDS,
252 : const char *pszNewName,
253 : char **papszOptions = NULL );
254 : };
255 :
256 :
257 : /************************************************************************/
258 : /* OGRSFDriverRegistrar */
259 : /************************************************************************/
260 :
261 : /**
262 : * Singleton manager for OGRSFDriver instances that will be used to try
263 : * and open datasources. Normally the registrar is populated with
264 : * standard drivers using the OGRRegisterAll() function and does not need
265 : * to be directly accessed. The driver registrar and all registered drivers
266 : * may be cleaned up on shutdown using OGRCleanupAll().
267 : */
268 :
269 : class CPL_DLL OGRSFDriverRegistrar
270 : {
271 : int nDrivers;
272 : OGRSFDriver **papoDrivers;
273 :
274 : OGRSFDriverRegistrar();
275 :
276 : int nOpenDSCount;
277 : char **papszOpenDSRawName;
278 : OGRDataSource **papoOpenDS;
279 : OGRSFDriver **papoOpenDSDriver;
280 : GIntBig *panOpenDSPID;
281 :
282 : public:
283 :
284 : ~OGRSFDriverRegistrar();
285 :
286 : static OGRSFDriverRegistrar *GetRegistrar();
287 : static OGRDataSource *Open( const char *pszName, int bUpdate=FALSE,
288 : OGRSFDriver ** ppoDriver = NULL );
289 :
290 : OGRDataSource *OpenShared( const char *pszName, int bUpdate=FALSE,
291 : OGRSFDriver ** ppoDriver = NULL );
292 : OGRErr ReleaseDataSource( OGRDataSource * );
293 :
294 : void RegisterDriver( OGRSFDriver * poDriver );
295 : void DeregisterDriver( OGRSFDriver * poDriver );
296 :
297 : int GetDriverCount( void );
298 : OGRSFDriver *GetDriver( int iDriver );
299 : OGRSFDriver *GetDriverByName( const char * );
300 :
301 : int GetOpenDSCount() { return nOpenDSCount; }
302 : OGRDataSource *GetOpenDS( int );
303 :
304 : void AutoLoadDrivers();
305 : };
306 :
307 : /* -------------------------------------------------------------------- */
308 : /* Various available registration methods. */
309 : /* -------------------------------------------------------------------- */
310 : CPL_C_START
311 : void CPL_DLL OGRRegisterAll();
312 :
313 : void CPL_DLL RegisterOGRFileGDB();
314 : void CPL_DLL RegisterOGRShape();
315 : void CPL_DLL RegisterOGRNTF();
316 : void CPL_DLL RegisterOGRFME();
317 : void CPL_DLL RegisterOGRSDTS();
318 : void CPL_DLL RegisterOGRTiger();
319 : void CPL_DLL RegisterOGRS57();
320 : void CPL_DLL RegisterOGRTAB();
321 : void CPL_DLL RegisterOGRMIF();
322 : void CPL_DLL RegisterOGROGDI();
323 : void CPL_DLL RegisterOGRODBC();
324 : void CPL_DLL RegisterOGRPG();
325 : void CPL_DLL RegisterOGRMSSQLSpatial();
326 : void CPL_DLL RegisterOGRMySQL();
327 : void CPL_DLL RegisterOGROCI();
328 : void CPL_DLL RegisterOGRDGN();
329 : void CPL_DLL RegisterOGRGML();
330 : void CPL_DLL RegisterOGRLIBKML();
331 : void CPL_DLL RegisterOGRKML();
332 : void CPL_DLL RegisterOGRGeoJSON();
333 : void CPL_DLL RegisterOGRAVCBin();
334 : void CPL_DLL RegisterOGRAVCE00();
335 : void CPL_DLL RegisterOGRREC();
336 : void CPL_DLL RegisterOGRMEM();
337 : void CPL_DLL RegisterOGRVRT();
338 : void CPL_DLL RegisterOGRDODS();
339 : void CPL_DLL RegisterOGRSQLite();
340 : void CPL_DLL RegisterOGRCSV();
341 : void CPL_DLL RegisterOGRILI1();
342 : void CPL_DLL RegisterOGRILI2();
343 : void CPL_DLL RegisterOGRGRASS();
344 : void CPL_DLL RegisterOGRPGeo();
345 : void CPL_DLL RegisterOGRDXFDWG();
346 : void CPL_DLL RegisterOGRDXF();
347 : void CPL_DLL RegisterOGRDWG();
348 : void CPL_DLL RegisterOGRSDE();
349 : void CPL_DLL RegisterOGRIDB();
350 : void CPL_DLL RegisterOGRGMT();
351 : void CPL_DLL RegisterOGRBNA();
352 : void CPL_DLL RegisterOGRGPX();
353 : void CPL_DLL RegisterOGRGeoconcept();
354 : void CPL_DLL RegisterOGRIngres();
355 : void CPL_DLL RegisterOGRPCIDSK();
356 : void CPL_DLL RegisterOGRXPlane();
357 : void CPL_DLL RegisterOGRNAS();
358 : void CPL_DLL RegisterOGRGeoRSS();
359 : void CPL_DLL RegisterOGRGTM();
360 : void CPL_DLL RegisterOGRVFK();
361 : void CPL_DLL RegisterOGRPGDump();
362 : void CPL_DLL RegisterOGRGPSBabel();
363 : void CPL_DLL RegisterOGRSUA();
364 : void CPL_DLL RegisterOGROpenAir();
365 : void CPL_DLL RegisterOGRPDS();
366 : void CPL_DLL RegisterOGRWFS();
367 : void CPL_DLL RegisterOGRSOSI();
368 : void CPL_DLL RegisterOGRHTF();
369 : void CPL_DLL RegisterOGRAeronavFAA();
370 : void CPL_DLL RegisterOGRGeomedia();
371 : void CPL_DLL RegisterOGRMDB();
372 : void CPL_DLL RegisterOGREDIGEO();
373 : void CPL_DLL RegisterOGRGFT();
374 : void CPL_DLL RegisterOGRSVG();
375 : void CPL_DLL RegisterOGRCouchDB();
376 : void CPL_DLL RegisterOGRIdrisi();
377 : void CPL_DLL RegisterOGRARCGEN();
378 : void CPL_DLL RegisterOGRSEGUKOOA();
379 : void CPL_DLL RegisterOGRSEGY();
380 : void CPL_DLL RegisterOGRXLS();
381 : CPL_C_END
382 :
383 :
384 : #endif /* ndef _OGRSF_FRMTS_H_INCLUDED */
|