/src/gdal/ogr/ogrsf_frmts/sxf/ogrsxfdriver.cpp
Line | Count | Source |
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 | | * SPDX-License-Identifier: MIT |
14 | | ****************************************************************************/ |
15 | | |
16 | | #include "cpl_conv.h" |
17 | | #include "ogr_sxf.h" |
18 | | |
19 | | /************************************************************************/ |
20 | | /* Open() */ |
21 | | /************************************************************************/ |
22 | | |
23 | | static GDALDataset *OGRSXFDriverOpen(GDALOpenInfo *poOpenInfo) |
24 | | |
25 | 1 | { |
26 | | /* -------------------------------------------------------------------- */ |
27 | | /* Determine what sort of object this is. */ |
28 | | /* -------------------------------------------------------------------- */ |
29 | | |
30 | 1 | VSIStatBufL sStatBuf; |
31 | 1 | if (!poOpenInfo->IsExtensionEqualToCI("sxf") || |
32 | 1 | VSIStatL(poOpenInfo->pszFilename, &sStatBuf) != 0 || |
33 | 1 | !VSI_ISREG(sStatBuf.st_mode)) |
34 | 0 | return nullptr; |
35 | | |
36 | 1 | OGRSXFDataSource *poDS = new OGRSXFDataSource(); |
37 | | |
38 | 1 | if (!poDS->Open(poOpenInfo->pszFilename, poOpenInfo->eAccess == GA_Update, |
39 | 1 | poOpenInfo->papszOpenOptions)) |
40 | 1 | { |
41 | 1 | delete poDS; |
42 | 1 | poDS = nullptr; |
43 | 1 | } |
44 | | |
45 | 1 | return poDS; |
46 | 1 | } |
47 | | |
48 | | /************************************************************************/ |
49 | | /* Identify() */ |
50 | | /************************************************************************/ |
51 | | |
52 | | static int OGRSXFDriverIdentify(GDALOpenInfo *poOpenInfo) |
53 | 112k | { |
54 | 112k | if (!poOpenInfo->IsExtensionEqualToCI("sxf") || !poOpenInfo->bStatOK || |
55 | 9 | poOpenInfo->bIsDirectory) |
56 | 112k | { |
57 | 112k | return GDAL_IDENTIFY_FALSE; |
58 | 112k | } |
59 | | |
60 | 9 | if (poOpenInfo->nHeaderBytes < 4) |
61 | 1 | { |
62 | 1 | return GDAL_IDENTIFY_UNKNOWN; |
63 | 1 | } |
64 | | |
65 | 8 | if (0 != memcmp(poOpenInfo->pabyHeader, "SXF", 3)) |
66 | 8 | { |
67 | 8 | return GDAL_IDENTIFY_FALSE; |
68 | 8 | } |
69 | | |
70 | 0 | return GDAL_IDENTIFY_TRUE; |
71 | 8 | } |
72 | | |
73 | | /************************************************************************/ |
74 | | /* GRSXFDriverDelete() */ |
75 | | /************************************************************************/ |
76 | | |
77 | | static CPLErr OGRSXFDriverDelete(const char *pszName) |
78 | 0 | { |
79 | | // TODO: add more extensions if applicable |
80 | 0 | static const char *const apszExtensions[] = {"szf", "rsc", "SZF", "RSC", |
81 | 0 | nullptr}; |
82 | |
|
83 | 0 | VSIStatBufL sStatBuf; |
84 | 0 | if (VSIStatL(pszName, &sStatBuf) != 0) |
85 | 0 | { |
86 | 0 | CPLError(CE_Failure, CPLE_AppDefined, |
87 | 0 | "%s does not appear to be a valid sxf file.", pszName); |
88 | |
|
89 | 0 | return CE_Failure; |
90 | 0 | } |
91 | | |
92 | 0 | for (int iExt = 0; apszExtensions[iExt] != nullptr; iExt++) |
93 | 0 | { |
94 | 0 | const std::string osFile = |
95 | 0 | CPLResetExtensionSafe(pszName, apszExtensions[iExt]); |
96 | 0 | if (VSIStatL(osFile.c_str(), &sStatBuf) == 0) |
97 | 0 | VSIUnlink(osFile.c_str()); |
98 | 0 | } |
99 | |
|
100 | 0 | return CE_None; |
101 | 0 | } |
102 | | |
103 | | /************************************************************************/ |
104 | | /* RegisterOGRSXF() */ |
105 | | /************************************************************************/ |
106 | | void RegisterOGRSXF() |
107 | 24 | { |
108 | 24 | if (GDALGetDriverByName("SXF") != nullptr) |
109 | 0 | return; |
110 | | |
111 | 24 | GDALDriver *poDriver = new GDALDriver(); |
112 | | |
113 | 24 | poDriver->SetDescription("SXF"); |
114 | 24 | poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); |
115 | 24 | poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Storage and eXchange Format"); |
116 | 24 | poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/sxf.html"); |
117 | 24 | poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "sxf"); |
118 | 24 | poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); |
119 | 24 | poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); |
120 | 24 | poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); |
121 | 24 | poDriver->SetMetadataItem( |
122 | 24 | GDAL_DMD_OPENOPTIONLIST, |
123 | 24 | "<OpenOptionList>" |
124 | 24 | " <Option name='SXF_LAYER_FULLNAME' type='string' description='Use " |
125 | 24 | "long layer names' default='NO'/>" |
126 | 24 | " <Option name='SXF_RSC_FILENAME' type='string' description='RSC file " |
127 | 24 | "name' default=''/>" |
128 | 24 | " <Option name='SXF_SET_VERTCS' type='string' description='Layers " |
129 | 24 | "spatial reference will include vertical coordinate system description " |
130 | 24 | "if exist' default='NO'/>" |
131 | 24 | "</OpenOptionList>"); |
132 | | |
133 | 24 | poDriver->pfnOpen = OGRSXFDriverOpen; |
134 | 24 | poDriver->pfnDelete = OGRSXFDriverDelete; |
135 | 24 | poDriver->pfnIdentify = OGRSXFDriverIdentify; |
136 | | |
137 | 24 | GetGDALDriverManager()->RegisterDriver(poDriver); |
138 | 24 | } |