Coverage Report

Created: 2026-03-30 09:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}