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 28379 : static GDALDataset *OGRNTFDriverOpen(GDALOpenInfo *poOpenInfo) 27 : 28 : { 29 28379 : if (!poOpenInfo->bStatOK) 30 22518 : return nullptr; 31 : 32 5861 : if (poOpenInfo->nHeaderBytes != 0) 33 : { 34 5153 : if (poOpenInfo->nHeaderBytes < 80) 35 303 : return nullptr; 36 4850 : const char *pszHeader = (const char *)poOpenInfo->pabyHeader; 37 4850 : if (!STARTS_WITH_CI(pszHeader, "01")) 38 4839 : return nullptr; 39 : 40 11 : int j = 0; // Used after for. 41 891 : for (; j < 80; j++) 42 : { 43 880 : if (pszHeader[j] == 10 || pszHeader[j] == 13) 44 : break; 45 : } 46 : 47 11 : if (j == 80 || pszHeader[j - 1] != '%') 48 11 : return nullptr; 49 : } 50 : 51 708 : OGRNTFDataSource *poDS = new OGRNTFDataSource; 52 708 : if (!poDS->Open(poOpenInfo->pszFilename, TRUE)) 53 : { 54 708 : delete poDS; 55 708 : poDS = nullptr; 56 : } 57 : 58 708 : 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 708 : return poDS; 67 : } 68 : 69 : /************************************************************************/ 70 : /* RegisterOGRNTF() */ 71 : /************************************************************************/ 72 : 73 1595 : void RegisterOGRNTF() 74 : 75 : { 76 1595 : if (GDALGetDriverByName("UK .NTF") != nullptr) 77 302 : return; 78 : 79 1293 : GDALDriver *poDriver = new GDALDriver(); 80 : 81 1293 : poDriver->SetDescription("UK .NTF"); 82 1293 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 83 1293 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "UK .NTF"); 84 1293 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ntf.html"); 85 1293 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 86 1293 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); 87 1293 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 88 : 89 1293 : poDriver->pfnOpen = OGRNTFDriverOpen; 90 : 91 1293 : GetGDALDriverManager()->RegisterDriver(poDriver); 92 : }