Coverage Report

Created: 2026-05-16 08:20

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
113k
{
26
113k
    if (poOpenInfo->pabyHeader != nullptr)
27
76.3k
    {
28
76.3k
        if (poOpenInfo->pabyHeader[0] != '<' ||
29
5.67k
            (strstr(reinterpret_cast<char *>(poOpenInfo->pabyHeader),
30
5.67k
                    "interlis.ch/INTERLIS2") == nullptr &&
31
5.17k
             strstr(reinterpret_cast<char *>(poOpenInfo->pabyHeader),
32
5.17k
                    "//www.interlis.ch/xtf/") == nullptr))
33
75.8k
        {
34
75.8k
            return nullptr;
35
75.8k
        }
36
76.3k
    }
37
36.8k
    else if (poOpenInfo->bIsDirectory)
38
3.62k
        return nullptr;
39
40
33.7k
    OGRILI2DataSource *poDS = new OGRILI2DataSource();
41
42
33.7k
    const bool bTestOpen = (poOpenInfo->pabyHeader == nullptr);
43
33.7k
    if (!poDS->Open(poOpenInfo->pszFilename, poOpenInfo->papszOpenOptions,
44
33.7k
                    bTestOpen) ||
45
529
        poDS->GetLayerCount() == 0)
46
33.5k
    {
47
33.5k
        delete poDS;
48
33.5k
        return nullptr;
49
33.5k
    }
50
51
222
    return poDS;
52
33.7k
}
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
}