Coverage Report

Created: 2025-12-31 08:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/ogr/ogrsf_frmts/cad/ogrcaddriver.cpp
Line
Count
Source
1
/*******************************************************************************
2
 *  Project: OGR CAD Driver
3
 *  Purpose: Implements driver based on libopencad
4
 *  Author: Alexandr Borzykh, mush3d at gmail.com
5
 *  Author: Dmitry Baryshnikov, polimax@mail.ru
6
 *  Language: C++
7
 *******************************************************************************
8
 *  The MIT License (MIT)
9
 *
10
 *  Copyright (c) 2016 Alexandr Borzykh
11
 *  Copyright (c) 2016, NextGIS
12
 *
13
 * SPDX-License-Identifier: MIT
14
 *******************************************************************************/
15
#include "ogr_cad.h"
16
#include "vsilfileio.h"
17
#include "ogrcaddrivercore.h"
18
19
/************************************************************************/
20
/*                           OGRCADDriverOpen()                         */
21
/************************************************************************/
22
23
static GDALDataset *OGRCADDriverOpen(GDALOpenInfo *poOpenInfo)
24
7.01k
{
25
7.01k
    long nSubRasterLayer = -1;
26
7.01k
    long nSubRasterFID = -1;
27
28
7.01k
    CADFileIO *pFileIO;
29
7.01k
    if (STARTS_WITH_CI(poOpenInfo->pszFilename, "CAD:"))
30
0
    {
31
0
        char **papszTokens =
32
0
            CSLTokenizeString2(poOpenInfo->pszFilename, ":", 0);
33
0
        int nTokens = CSLCount(papszTokens);
34
0
        if (nTokens < 4)
35
0
        {
36
0
            CSLDestroy(papszTokens);
37
0
            return nullptr;
38
0
        }
39
40
0
        CPLString osFilename;
41
0
        for (int i = 1; i < nTokens - 2; ++i)
42
0
        {
43
0
            if (osFilename.empty())
44
0
                osFilename += ":";
45
0
            osFilename += papszTokens[i];
46
0
        }
47
48
0
        pFileIO = new VSILFileIO(osFilename);
49
0
        nSubRasterLayer = atol(papszTokens[nTokens - 2]);
50
0
        nSubRasterFID = atol(papszTokens[nTokens - 1]);
51
52
0
        CSLDestroy(papszTokens);
53
0
    }
54
7.01k
    else
55
7.01k
    {
56
7.01k
        pFileIO = new VSILFileIO(poOpenInfo->pszFilename);
57
7.01k
    }
58
59
7.01k
    if (IdentifyCADFile(pFileIO, false) == FALSE)
60
3
    {
61
3
        delete pFileIO;
62
3
        return nullptr;
63
3
    }
64
65
    /* -------------------------------------------------------------------- */
66
    /*      Confirm the requested access is supported.                      */
67
    /* -------------------------------------------------------------------- */
68
7.00k
    if (poOpenInfo->eAccess == GA_Update)
69
0
    {
70
0
        GDALDataset::ReportUpdateNotSupportedByDriver("CAD");
71
0
        delete pFileIO;
72
0
        return nullptr;
73
0
    }
74
75
7.00k
    GDALCADDataset *poDS = new GDALCADDataset();
76
7.00k
    if (!poDS->Open(poOpenInfo, pFileIO, nSubRasterLayer, nSubRasterFID))
77
5.20k
    {
78
5.20k
        delete poDS;
79
5.20k
        return nullptr;
80
5.20k
    }
81
1.79k
    else
82
1.79k
        return poDS;
83
7.00k
}
84
85
/************************************************************************/
86
/*                           RegisterOGRCAD()                           */
87
/************************************************************************/
88
89
void RegisterOGRCAD()
90
24
{
91
24
    if (GDALGetDriverByName(DRIVER_NAME) == nullptr)
92
24
    {
93
24
        auto poDriver = new GDALDriver();
94
24
        OGRCADDriverSetCommonMetadata(poDriver);
95
96
24
        poDriver->pfnOpen = OGRCADDriverOpen;
97
98
24
        GetGDALDriverManager()->RegisterDriver(poDriver);
99
24
    }
100
24
}
101
102
CPLString CADRecode(const CPLString &sString, int CADEncoding)
103
1.96k
{
104
1.96k
    const char *const apszSource[] = {/* 0 UNDEFINED */ "",
105
1.96k
                                      /* 1 ASCII */ "US-ASCII",
106
1.96k
                                      /* 2 8859_1 */ "ISO-8859-1",
107
1.96k
                                      /* 3 8859_2 */ "ISO-8859-2",
108
1.96k
                                      /* 4 UNDEFINED */ "",
109
1.96k
                                      /* 5 8859_4 */ "ISO-8859-4",
110
1.96k
                                      /* 6 8859_5 */ "ISO-8859-5",
111
1.96k
                                      /* 7 8859_6 */ "ISO-8859-6",
112
1.96k
                                      /* 8 8859_7 */ "ISO-8859-7",
113
1.96k
                                      /* 9 8859_8 */ "ISO-8859-8",
114
1.96k
                                      /* 10 8859_9 */ "ISO-8859-9",
115
1.96k
                                      /* 11 DOS437 */ "CP437",
116
1.96k
                                      /* 12 DOS850 */ "CP850",
117
1.96k
                                      /* 13 DOS852 */ "CP852",
118
1.96k
                                      /* 14 DOS855 */ "CP855",
119
1.96k
                                      /* 15 DOS857 */ "CP857",
120
1.96k
                                      /* 16 DOS860 */ "CP860",
121
1.96k
                                      /* 17 DOS861 */ "CP861",
122
1.96k
                                      /* 18 DOS863 */ "CP863",
123
1.96k
                                      /* 19 DOS864 */ "CP864",
124
1.96k
                                      /* 20 DOS865 */ "CP865",
125
1.96k
                                      /* 21 DOS869 */ "CP869",
126
1.96k
                                      /* 22 DOS932 */ "CP932",
127
1.96k
                                      /* 23 MACINTOSH */ "MACINTOSH",
128
1.96k
                                      /* 24 BIG5 */ "BIG5",
129
1.96k
                                      /* 25 KSC5601 */ "CP949",
130
1.96k
                                      /* 26 JOHAB */ "JOHAB",
131
1.96k
                                      /* 27 DOS866 */ "CP866",
132
1.96k
                                      /* 28 ANSI_1250 */ "CP1250",
133
1.96k
                                      /* 29 ANSI_1251 */ "CP1251",
134
1.96k
                                      /* 30 ANSI_1252 */ "CP1252",
135
1.96k
                                      /* 31 GB2312 */ "GB2312",
136
1.96k
                                      /* 32 ANSI_1253 */ "CP1253",
137
1.96k
                                      /* 33 ANSI_1254 */ "CP1254",
138
1.96k
                                      /* 34 ANSI_1255 */ "CP1255",
139
1.96k
                                      /* 35 ANSI_1256 */ "CP1256",
140
1.96k
                                      /* 36 ANSI_1257 */ "CP1257",
141
1.96k
                                      /* 37 ANSI_874 */ "CP874",
142
1.96k
                                      /* 38 ANSI_932 */ "CP932",
143
1.96k
                                      /* 39 ANSI_936 */ "CP936",
144
1.96k
                                      /* 40 ANSI_949 */ "CP949",
145
1.96k
                                      /* 41 ANSI_950 */ "CP950",
146
1.96k
                                      /* 42 ANSI_1361 */ "CP1361",
147
1.96k
                                      /* 43 ANSI_1200 */ "UTF-16",
148
1.96k
                                      /* 44 ANSI_1258 */ "CP1258"};
149
150
1.96k
    if (CADEncoding > 0 &&
151
297
        CADEncoding < static_cast<int>(CPL_ARRAYSIZE(apszSource)) &&
152
259
        CADEncoding != 4)
153
247
    {
154
247
        char *pszRecoded =
155
247
            CPLRecode(sString, apszSource[CADEncoding], CPL_ENC_UTF8);
156
247
        CPLString soRecoded(pszRecoded);
157
247
        CPLFree(pszRecoded);
158
247
        return soRecoded;
159
247
    }
160
1.71k
    CPLError(CE_Failure, CPLE_NotSupported,
161
1.71k
             "CADRecode() function does not support provided CADEncoding.");
162
1.71k
    return CPLString("");
163
1.96k
}