/src/gdal/ogr/ogrsf_frmts/ili/ogrili2driver.cpp
Line | Count | Source |
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 | | static GDALDataset *OGRILI2DriverOpen(GDALOpenInfo *poOpenInfo) |
24 | | |
25 | 106k | { |
26 | 106k | if (poOpenInfo->pabyHeader != nullptr) |
27 | 72.6k | { |
28 | 72.6k | if (poOpenInfo->pabyHeader[0] != '<' || |
29 | 5.24k | (strstr(reinterpret_cast<char *>(poOpenInfo->pabyHeader), |
30 | 5.24k | "interlis.ch/INTERLIS2") == nullptr && |
31 | 4.76k | strstr(reinterpret_cast<char *>(poOpenInfo->pabyHeader), |
32 | 4.76k | "//www.interlis.ch/xtf/") == nullptr)) |
33 | 72.1k | { |
34 | 72.1k | return nullptr; |
35 | 72.1k | } |
36 | 72.6k | } |
37 | 33.5k | else if (poOpenInfo->bIsDirectory) |
38 | 3.02k | return nullptr; |
39 | | |
40 | 31.0k | OGRILI2DataSource *poDS = new OGRILI2DataSource(); |
41 | | |
42 | 31.0k | const bool bTestOpen = (poOpenInfo->pabyHeader == nullptr); |
43 | 31.0k | if (!poDS->Open(poOpenInfo->pszFilename, poOpenInfo->papszOpenOptions, |
44 | 31.0k | bTestOpen) || |
45 | 502 | poDS->GetLayerCount() == 0) |
46 | 30.7k | { |
47 | 30.7k | delete poDS; |
48 | 30.7k | return nullptr; |
49 | 30.7k | } |
50 | | |
51 | 226 | return poDS; |
52 | 31.0k | } |
53 | | |
54 | | /************************************************************************/ |
55 | | /* RegisterOGRILI2() */ |
56 | | /************************************************************************/ |
57 | | |
58 | | void RegisterOGRILI2() |
59 | 22 | { |
60 | 22 | if (GDALGetDriverByName("Interlis 2") != nullptr) |
61 | 0 | return; |
62 | | |
63 | 22 | GDALDriver *poDriver = new GDALDriver(); |
64 | | |
65 | 22 | poDriver->SetDescription("Interlis 2"); |
66 | 22 | poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); |
67 | 22 | poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES"); |
68 | 22 | poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); |
69 | 22 | poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Interlis 2"); |
70 | 22 | poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ili.html"); |
71 | 22 | poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "xtf xml ili"); |
72 | 22 | poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); |
73 | 22 | poDriver->SetMetadataItem( |
74 | 22 | GDAL_DMD_OPENOPTIONLIST, |
75 | 22 | "<OpenOptionList>" |
76 | 22 | " <Option name='MODEL' type='string' description='Filename of the " |
77 | 22 | "model in IlisMeta format (.imd)'/>" |
78 | 22 | "</OpenOptionList>"); |
79 | 22 | poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); |
80 | | |
81 | 22 | poDriver->pfnOpen = OGRILI2DriverOpen; |
82 | | |
83 | 22 | GetGDALDriverManager()->RegisterDriver(poDriver); |
84 | 22 | } |