Line data Source code
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 35025 : static GDALDataset *OGRNTFDriverOpen(GDALOpenInfo *poOpenInfo) 27 : 28 : { 29 35025 : if (!poOpenInfo->bStatOK) 30 27453 : return nullptr; 31 : 32 7572 : if (poOpenInfo->nHeaderBytes != 0) 33 : { 34 6748 : if (poOpenInfo->nHeaderBytes < 80) 35 346 : return nullptr; 36 6402 : const char *pszHeader = (const char *)poOpenInfo->pabyHeader; 37 6402 : if (!STARTS_WITH_CI(pszHeader, "01")) 38 6275 : return nullptr; 39 : 40 127 : int j = 0; // Used after for. 41 10287 : for (; j < 80; j++) 42 : { 43 10160 : if (pszHeader[j] == 10 || pszHeader[j] == 13) 44 : break; 45 : } 46 : 47 127 : if (j == 80 || pszHeader[j - 1] != '%') 48 127 : return nullptr; 49 : } 50 : 51 824 : OGRNTFDataSource *poDS = new OGRNTFDataSource; 52 824 : if (!poDS->Open(poOpenInfo->pszFilename, TRUE)) 53 : { 54 824 : delete poDS; 55 824 : poDS = nullptr; 56 : } 57 : 58 824 : if (poDS != nullptr && poOpenInfo->eAccess == GA_Update) 59 : { 60 0 : CPLError(CE_Failure, CPLE_OpenFailed, 61 : "NTF Driver doesn't support update."); 62 0 : delete poDS; 63 0 : poDS = nullptr; 64 : } 65 : 66 824 : return poDS; 67 : } 68 : 69 : /************************************************************************/ 70 : /* RegisterOGRNTF() */ 71 : /************************************************************************/ 72 : 73 2126 : void RegisterOGRNTF() 74 : 75 : { 76 2126 : if (GDALGetDriverByName("UK .NTF") != nullptr) 77 263 : return; 78 : 79 1863 : GDALDriver *poDriver = new GDALDriver(); 80 : 81 1863 : poDriver->SetDescription("UK .NTF"); 82 1863 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 83 1863 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "UK .NTF"); 84 1863 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ntf.html"); 85 1863 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 86 1863 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); 87 1863 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 88 : 89 1863 : poDriver->pfnOpen = OGRNTFDriverOpen; 90 : 91 1863 : GetGDALDriverManager()->RegisterDriver(poDriver); 92 : }