Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Implements OGRVFKDriver class. 5 : * Author: Martin Landa, landa.martin gmail.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2009-2018, Martin Landa <landa.martin gmail.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "gdal_frmts.h" 14 : #include "gdalplugindriverproxy.h" 15 : 16 : #include "ogrsf_frmts.h" 17 : 18 : #include "ogrvfkdrivercore.h" 19 : 20 : /************************************************************************/ 21 : /* OGRVFKDriverIdentify() */ 22 : /************************************************************************/ 23 : 24 53406 : int OGRVFKDriverIdentify(GDALOpenInfo *poOpenInfo) 25 : 26 : { 27 53406 : if (poOpenInfo->fpL == nullptr) 28 50332 : return FALSE; 29 : 30 3074 : if (poOpenInfo->nHeaderBytes >= 2 && 31 2999 : STARTS_WITH((const char *)poOpenInfo->pabyHeader, "&H")) 32 30 : return TRUE; 33 : 34 : /* valid datasource can be also SQLite DB previously created by 35 : VFK driver, the real check is done by VFKReaderSQLite */ 36 8846 : if (poOpenInfo->nHeaderBytes >= 100 && 37 3080 : STARTS_WITH((const char *)poOpenInfo->pabyHeader, "SQLite format 3") && 38 36 : !poOpenInfo->IsExtensionEqualToCI("gpkg")) 39 : { 40 : // The driver is not ready for virtual file systems 41 5 : if (STARTS_WITH(poOpenInfo->pszFilename, "/vsi")) 42 5 : return FALSE; 43 : 44 : VSIStatBufL sStat; 45 8 : if (VSIStatL(poOpenInfo->pszFilename, &sStat) == 0 && 46 4 : VSI_ISREG(sStat.st_mode)) 47 : { 48 4 : return GDAL_IDENTIFY_UNKNOWN; 49 : } 50 : } 51 : 52 3039 : return FALSE; 53 : } 54 : 55 : /************************************************************************/ 56 : /* OGRVFKDriverSetCommonMetadata() */ 57 : /************************************************************************/ 58 : 59 2109 : void OGRVFKDriverSetCommonMetadata(GDALDriver *poDriver) 60 : { 61 2109 : poDriver->SetDescription(DRIVER_NAME); 62 2109 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 63 2109 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, 64 2109 : "Czech Cadastral Exchange Data Format"); 65 2109 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "vfk"); 66 2109 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/vfk.html"); 67 2109 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 68 : 69 2109 : poDriver->SetMetadataItem( 70 : GDAL_DMD_OPENOPTIONLIST, 71 : "<OpenOptionList>" 72 : " <Option name='SUPPRESS_GEOMETRY' type='boolean' " 73 : "description='whether to suppress geometry' default='NO'/>" 74 : " <Option name='FILE_FIELD' type='boolean' description='whether to " 75 : "include VFK filename field' default='NO'/>" 76 2109 : "</OpenOptionList>"); 77 : 78 2109 : poDriver->pfnIdentify = OGRVFKDriverIdentify; 79 2109 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 80 2109 : } 81 : 82 : /************************************************************************/ 83 : /* DeclareDeferredOGRVFKPlugin() */ 84 : /************************************************************************/ 85 : 86 : #ifdef PLUGIN_FILENAME 87 2038 : void DeclareDeferredOGRVFKPlugin() 88 : { 89 2038 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 90 : { 91 283 : return; 92 : } 93 1755 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 94 : #ifdef PLUGIN_INSTALLATION_MESSAGE 95 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 96 : PLUGIN_INSTALLATION_MESSAGE); 97 : #endif 98 1755 : OGRVFKDriverSetCommonMetadata(poDriver); 99 1755 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 100 : } 101 : #endif