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 26449 : static GDALDataset *OGRILI2DriverOpen(GDALOpenInfo *poOpenInfo) 24 : 25 : { 26 26449 : if (poOpenInfo->eAccess == GA_Update || 27 25653 : (!poOpenInfo->bStatOK && 28 21853 : strchr(poOpenInfo->pszFilename, ',') == nullptr)) 29 22592 : return nullptr; 30 : 31 3857 : if (poOpenInfo->pabyHeader != nullptr) 32 : { 33 3302 : if (poOpenInfo->pabyHeader[0] != '<' || 34 236 : strstr((const char *)poOpenInfo->pabyHeader, 35 : "interlis.ch/INTERLIS2") == nullptr) 36 : { 37 3301 : return nullptr; 38 : } 39 : } 40 555 : else if (poOpenInfo->bIsDirectory) 41 495 : return nullptr; 42 : 43 61 : OGRILI2DataSource *poDS = new OGRILI2DataSource(); 44 : 45 61 : if (!poDS->Open(poOpenInfo->pszFilename, poOpenInfo->papszOpenOptions, 46 65 : TRUE) || 47 4 : poDS->GetLayerCount() == 0) 48 : { 49 57 : delete poDS; 50 57 : return nullptr; 51 : } 52 : 53 4 : return poDS; 54 : } 55 : 56 : /************************************************************************/ 57 : /* Create() */ 58 : /************************************************************************/ 59 : 60 20 : static GDALDataset *OGRILI2DriverCreate(const char *pszName, int /* nBands */, 61 : int /* nXSize */, int /* nYSize */, 62 : GDALDataType /* eDT */, 63 : char **papszOptions) 64 : { 65 20 : OGRILI2DataSource *poDS = new OGRILI2DataSource(); 66 : 67 20 : if (!poDS->Create(pszName, papszOptions)) 68 : { 69 19 : delete poDS; 70 19 : return nullptr; 71 : } 72 : 73 1 : return poDS; 74 : } 75 : 76 : /************************************************************************/ 77 : /* RegisterOGRILI2() */ 78 : /************************************************************************/ 79 : 80 1595 : void RegisterOGRILI2() 81 : { 82 1595 : if (GDALGetDriverByName("Interlis 2") != nullptr) 83 302 : return; 84 : 85 1293 : GDALDriver *poDriver = new GDALDriver(); 86 : 87 1293 : poDriver->SetDescription("Interlis 2"); 88 1293 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 89 1293 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_LAYER, "YES"); 90 1293 : poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES"); 91 1293 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); 92 1293 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Interlis 2"); 93 1293 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ili.html"); 94 1293 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "xtf xml ili"); 95 1293 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 96 1293 : poDriver->SetMetadataItem( 97 : GDAL_DMD_OPENOPTIONLIST, 98 : "<OpenOptionList>" 99 : " <Option name='MODEL' type='string' description='Filename of the " 100 : "model in IlisMeta format (.imd)'/>" 101 1293 : "</OpenOptionList>"); 102 1293 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 103 : 104 1293 : poDriver->pfnOpen = OGRILI2DriverOpen; 105 1293 : poDriver->pfnCreate = OGRILI2DriverCreate; 106 : 107 1293 : GetGDALDriverManager()->RegisterDriver(poDriver); 108 : }