Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: SXF Translator
4 : * Purpose: Definition of classes for OGR SXF driver.
5 : * Author: Ben Ahmed Daho Ali, bidandou(at)yahoo(dot)fr
6 : * Dmitry Baryshnikov, polimax@mail.ru
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2011, Ben Ahmed Daho Ali
10 : * Copyright (c) 2013, NextGIS
11 : * Copyright (c) 2014, Even Rouault <even dot rouault at spatialys.com>
12 : *
13 : * Permission is hereby granted, free of charge, to any person obtaining a
14 : * copy of this software and associated documentation files (the "Software"),
15 : * to deal in the Software without restriction, including without limitation
16 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 : * and/or sell copies of the Software, and to permit persons to whom the
18 : * Software is furnished to do so, subject to the following conditions:
19 : *
20 : * The above copyright notice and this permission notice shall be included
21 : * in all copies or substantial portions of the Software.
22 : *
23 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 : * DEALINGS IN THE SOFTWARE.
30 : ****************************************************************************/
31 :
32 : #include "cpl_conv.h"
33 : #include "ogr_sxf.h"
34 :
35 : extern "C" void RegisterOGRSXF();
36 :
37 : /************************************************************************/
38 : /* ~OGRSXFDriver() */
39 : /************************************************************************/
40 :
41 1698 : OGRSXFDriver::~OGRSXFDriver()
42 : {
43 1698 : }
44 :
45 : /************************************************************************/
46 : /* Open() */
47 : /************************************************************************/
48 :
49 6 : GDALDataset *OGRSXFDriver::Open(GDALOpenInfo *poOpenInfo)
50 :
51 : {
52 : /* -------------------------------------------------------------------- */
53 : /* Determine what sort of object this is. */
54 : /* -------------------------------------------------------------------- */
55 :
56 : VSIStatBufL sStatBuf;
57 6 : if (!EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "sxf") ||
58 12 : VSIStatL(poOpenInfo->pszFilename, &sStatBuf) != 0 ||
59 6 : !VSI_ISREG(sStatBuf.st_mode))
60 0 : return nullptr;
61 :
62 6 : OGRSXFDataSource *poDS = new OGRSXFDataSource();
63 :
64 6 : if (!poDS->Open(poOpenInfo->pszFilename, poOpenInfo->eAccess == GA_Update,
65 6 : poOpenInfo->papszOpenOptions))
66 : {
67 1 : delete poDS;
68 1 : poDS = nullptr;
69 : }
70 :
71 6 : return poDS;
72 : }
73 :
74 : /************************************************************************/
75 : /* Identify() */
76 : /************************************************************************/
77 :
78 42010 : int OGRSXFDriver::Identify(GDALOpenInfo *poOpenInfo)
79 : {
80 42010 : if (!EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "sxf") ||
81 42010 : !poOpenInfo->bStatOK || poOpenInfo->bIsDirectory)
82 : {
83 42004 : return GDAL_IDENTIFY_FALSE;
84 : }
85 :
86 6 : if (poOpenInfo->nHeaderBytes < 4)
87 : {
88 0 : return GDAL_IDENTIFY_UNKNOWN;
89 : }
90 :
91 6 : if (0 != memcmp(poOpenInfo->pabyHeader, "SXF", 3))
92 : {
93 0 : return GDAL_IDENTIFY_FALSE;
94 : }
95 :
96 6 : return GDAL_IDENTIFY_TRUE;
97 : }
98 :
99 : /************************************************************************/
100 : /* DeleteDataSource() */
101 : /************************************************************************/
102 :
103 0 : CPLErr OGRSXFDriver::DeleteDataSource(const char *pszName)
104 : {
105 : // TODO: add more extensions if aplicable
106 : static const char *const apszExtensions[] = {"szf", "rsc", "SZF", "RSC",
107 : nullptr};
108 :
109 : VSIStatBufL sStatBuf;
110 0 : if (VSIStatL(pszName, &sStatBuf) != 0)
111 : {
112 0 : CPLError(CE_Failure, CPLE_AppDefined,
113 : "%s does not appear to be a valid sxf file.", pszName);
114 :
115 0 : return CE_Failure;
116 : }
117 :
118 0 : for (int iExt = 0; apszExtensions[iExt] != nullptr; iExt++)
119 : {
120 0 : const char *pszFile = CPLResetExtension(pszName, apszExtensions[iExt]);
121 0 : if (VSIStatL(pszFile, &sStatBuf) == 0)
122 0 : VSIUnlink(pszFile);
123 : }
124 :
125 0 : return CE_None;
126 : }
127 :
128 : /************************************************************************/
129 : /* RegisterOGRSXF() */
130 : /************************************************************************/
131 1509 : void RegisterOGRSXF()
132 : {
133 1509 : if (GDALGetDriverByName("SXF") != nullptr)
134 295 : return;
135 :
136 1214 : OGRSXFDriver *poDriver = new OGRSXFDriver;
137 :
138 1214 : poDriver->SetDescription("SXF");
139 1214 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES");
140 1214 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Storage and eXchange Format");
141 1214 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/sxf.html");
142 1214 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "sxf");
143 1214 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
144 1214 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES");
145 1214 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE");
146 1214 : poDriver->SetMetadataItem(
147 : GDAL_DMD_OPENOPTIONLIST,
148 : "<OpenOptionList>"
149 : " <Option name='SXF_LAYER_FULLNAME' type='string' description='Use "
150 : "long layer names' default='NO'/>"
151 : " <Option name='SXF_RSC_FILENAME' type='string' description='RSC file "
152 : "name' default=''/>"
153 : " <Option name='SXF_SET_VERTCS' type='string' description='Layers "
154 : "spatial reference will include vertical coordinate system description "
155 : "if exist' default='NO'/>"
156 1214 : "</OpenOptionList>");
157 :
158 1214 : poDriver->pfnOpen = OGRSXFDriver::Open;
159 1214 : poDriver->pfnDelete = OGRSXFDriver::DeleteDataSource;
160 1214 : poDriver->pfnIdentify = OGRSXFDriver::Identify;
161 :
162 1214 : GetGDALDriverManager()->RegisterDriver(poDriver);
163 : }
|