/src/gdal/ogr/ogrsf_frmts/ntf/ogrntfdriver.cpp
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: UK NTF Reader |
4 | | * Purpose: Implements OGRNTFDriver |
5 | | * Author: Frank Warmerdam, warmerdam@pobox.com |
6 | | * |
7 | | ****************************************************************************** |
8 | | * Copyright (c) 1999, Frank Warmerdam |
9 | | * |
10 | | * SPDX-License-Identifier: MIT |
11 | | ****************************************************************************/ |
12 | | |
13 | | #include "ntf.h" |
14 | | #include "cpl_conv.h" |
15 | | |
16 | | /************************************************************************/ |
17 | | /* ==================================================================== */ |
18 | | /* OGRNTFDriver */ |
19 | | /* ==================================================================== */ |
20 | | /************************************************************************/ |
21 | | |
22 | | /************************************************************************/ |
23 | | /* Open() */ |
24 | | /************************************************************************/ |
25 | | |
26 | | static GDALDataset *OGRNTFDriverOpen(GDALOpenInfo *poOpenInfo) |
27 | | |
28 | 198k | { |
29 | 198k | if (!poOpenInfo->bStatOK) |
30 | 45.1k | return nullptr; |
31 | | |
32 | 153k | if (poOpenInfo->nHeaderBytes != 0) |
33 | 140k | { |
34 | 140k | if (poOpenInfo->nHeaderBytes < 80) |
35 | 5.22k | return nullptr; |
36 | 135k | const char *pszHeader = (const char *)poOpenInfo->pabyHeader; |
37 | 135k | if (!STARTS_WITH_CI(pszHeader, "01")) |
38 | 134k | return nullptr; |
39 | | |
40 | 695 | int j = 0; // Used after for. |
41 | 51.6k | for (; j < 80; j++) |
42 | 51.1k | { |
43 | 51.1k | if (pszHeader[j] == 10 || pszHeader[j] == 13) |
44 | 198 | break; |
45 | 51.1k | } |
46 | | |
47 | 695 | if (j == 80 || pszHeader[j - 1] != '%') |
48 | 688 | return nullptr; |
49 | 695 | } |
50 | | |
51 | 12.6k | OGRNTFDataSource *poDS = new OGRNTFDataSource; |
52 | 12.6k | if (!poDS->Open(poOpenInfo->pszFilename, TRUE)) |
53 | 12.6k | { |
54 | 12.6k | delete poDS; |
55 | 12.6k | poDS = nullptr; |
56 | 12.6k | } |
57 | | |
58 | 12.6k | if (poDS != nullptr && poOpenInfo->eAccess == GA_Update) |
59 | 0 | { |
60 | 0 | CPLError(CE_Failure, CPLE_OpenFailed, |
61 | 0 | "NTF Driver doesn't support update."); |
62 | 0 | delete poDS; |
63 | 0 | poDS = nullptr; |
64 | 0 | } |
65 | | |
66 | 12.6k | return poDS; |
67 | 153k | } |
68 | | |
69 | | /************************************************************************/ |
70 | | /* RegisterOGRNTF() */ |
71 | | /************************************************************************/ |
72 | | |
73 | | void RegisterOGRNTF() |
74 | | |
75 | 24 | { |
76 | 24 | if (GDALGetDriverByName("UK .NTF") != nullptr) |
77 | 0 | return; |
78 | | |
79 | 24 | GDALDriver *poDriver = new GDALDriver(); |
80 | | |
81 | 24 | poDriver->SetDescription("UK .NTF"); |
82 | 24 | poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); |
83 | 24 | poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "UK .NTF"); |
84 | 24 | poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ntf.html"); |
85 | 24 | poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); |
86 | 24 | poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); |
87 | 24 | poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); |
88 | | |
89 | 24 | poDriver->pfnOpen = OGRNTFDriverOpen; |
90 | | |
91 | 24 | GetGDALDriverManager()->RegisterDriver(poDriver); |
92 | 24 | } |