Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: Interlis 2 Translator 4 : * Purpose: Implements OGRILI2Layer class. 5 : * Author: Markus Schnider, Sourcepole AG 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2004, Pirmin Kalberer, Sourcepole AG 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "xercesc_headers.h" 14 : 15 : #include "cpl_conv.h" 16 : #include "ogr_ili2.h" 17 : #include "ogrsf_frmts.h" 18 : 19 : /************************************************************************/ 20 : /* Open() */ 21 : /************************************************************************/ 22 : 23 27119 : static GDALDataset *OGRILI2DriverOpen(GDALOpenInfo *poOpenInfo) 24 : 25 : { 26 27119 : if (poOpenInfo->eAccess == GA_Update || 27 26316 : (!poOpenInfo->bStatOK && 28 22386 : strchr(poOpenInfo->pszFilename, ',') == nullptr)) 29 23138 : return nullptr; 30 : 31 3981 : if (poOpenInfo->pabyHeader != nullptr) 32 : { 33 3439 : if (poOpenInfo->pabyHeader[0] != '<' || 34 236 : strstr((const char *)poOpenInfo->pabyHeader, 35 : "interlis.ch/INTERLIS2") == nullptr) 36 : { 37 3438 : return nullptr; 38 : } 39 : } 40 542 : else if (poOpenInfo->bIsDirectory) 41 488 : return nullptr; 42 : 43 55 : OGRILI2DataSource *poDS = new OGRILI2DataSource(); 44 : 45 55 : if (!poDS->Open(poOpenInfo->pszFilename, poOpenInfo->papszOpenOptions, 46 58 : TRUE) || 47 3 : poDS->GetLayerCount() == 0) 48 : { 49 52 : delete poDS; 50 52 : return nullptr; 51 : } 52 : 53 3 : return poDS; 54 : } 55 : 56 : /************************************************************************/ 57 : /* RegisterOGRILI2() */ 58 : /************************************************************************/ 59 : 60 1686 : void RegisterOGRILI2() 61 : { 62 1686 : if (GDALGetDriverByName("Interlis 2") != nullptr) 63 302 : return; 64 : 65 1384 : GDALDriver *poDriver = new GDALDriver(); 66 : 67 1384 : poDriver->SetDescription("Interlis 2"); 68 1384 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 69 1384 : poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES"); 70 1384 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); 71 1384 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Interlis 2"); 72 1384 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ili.html"); 73 1384 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "xtf xml ili"); 74 1384 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 75 1384 : poDriver->SetMetadataItem( 76 : GDAL_DMD_OPENOPTIONLIST, 77 : "<OpenOptionList>" 78 : " <Option name='MODEL' type='string' description='Filename of the " 79 : "model in IlisMeta format (.imd)'/>" 80 1384 : "</OpenOptionList>"); 81 1384 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 82 : 83 1384 : poDriver->pfnOpen = OGRILI2DriverOpen; 84 : 85 1384 : GetGDALDriverManager()->RegisterDriver(poDriver); 86 : }