Coverage Report

Created: 2025-07-23 09:13

/src/gdal/frmts/wms/wmsutils.cpp
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *
3
 * Project:  WMS Client Driver
4
 * Purpose:  Supporting utility functions for GDAL WMS driver.
5
 * Author:   Adam Nowacki, nowak@xpam.de
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2007, Adam Nowacki
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#include "wmsdriver.h"
14
15
OGRSpatialReference ProjToSRS(const CPLString &proj)
16
20.3k
{
17
20.3k
    OGRSpatialReference sr;
18
20.3k
    sr.SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER);
19
20.3k
    CPLString srs;
20
21
    /* We could of course recognize OSGEO:41001 to SetFromUserInput(), but this
22
     * hackish SRS */
23
    /* is almost only used in the context of WMS */
24
20.3k
    if (strcmp(proj.c_str(), "OSGEO:41001") == 0)
25
0
    {
26
0
        sr.importFromEPSG(3857);
27
0
    }
28
20.3k
    else if (EQUAL(proj.c_str(), "EPSG:NONE"))
29
0
    {
30
        // do nothing
31
0
    }
32
20.3k
    else
33
20.3k
    {
34
20.3k
        sr.SetFromUserInput(
35
20.3k
            proj.c_str(),
36
20.3k
            OGRSpatialReference::SET_FROM_USER_INPUT_LIMITATIONS_get());
37
20.3k
    }
38
20.3k
    return sr;
39
20.3k
}
40
41
// Terminates an URL base with either ? or &, so extra args can be appended
42
void URLPrepare(CPLString &url)
43
2.56k
{
44
2.56k
    if (url.find("?") == std::string::npos)
45
0
    {
46
0
        url.append("?");
47
0
    }
48
2.56k
    else
49
2.56k
    {
50
2.56k
        if (*url.rbegin() != '?' && *url.rbegin() != '&')
51
2.06k
            url.append("&");
52
2.56k
    }
53
2.56k
}
54
55
CPLString BufferToVSIFile(GByte *buffer, size_t size)
56
56
{
57
56
    CPLString file_name(VSIMemGenerateHiddenFilename("wmsresult.dat"));
58
56
    VSILFILE *f = VSIFileFromMemBuffer(file_name.c_str(), buffer, size, false);
59
56
    if (f == nullptr)
60
0
        return CPLString();
61
56
    VSIFCloseL(f);
62
56
    return file_name;
63
56
}
64
65
int VersionStringToInt(const char *version)
66
81.4k
{
67
81.4k
    if (version == nullptr)
68
0
        return -1;
69
81.4k
    const char *p = version;
70
81.4k
    int v = 0;
71
407k
    for (int i = 3; i >= 0; --i)
72
325k
    {
73
325k
        int n = atoi(p);
74
325k
        if (n < 0 || n >= 100)
75
17
            return -1;
76
325k
        v += (1 << (i * 8)) * n;
77
550k
        for (; (*p != '\0') && (*p != '.'); ++p)
78
224k
            ;
79
325k
        if (*p != '\0')
80
142k
            ++p;
81
325k
    }
82
81.4k
    return v;
83
81.4k
}
84
85
int StrToBool(const char *p)
86
41.4k
{
87
41.4k
    if (p == nullptr)
88
0
        return -1;
89
41.4k
    if (EQUAL(p, "1") || EQUAL(p, "true") || EQUAL(p, "yes") ||
90
41.4k
        EQUAL(p, "enable") || EQUAL(p, "enabled") || EQUAL(p, "on"))
91
21.1k
        return 1;
92
20.3k
    if (EQUAL(p, "0") || EQUAL(p, "false") || EQUAL(p, "no") ||
93
20.3k
        EQUAL(p, "disable") || EQUAL(p, "disabled") || EQUAL(p, "off"))
94
20.3k
        return 0;
95
0
    return -1;
96
20.3k
}
97
98
int URLSearchAndReplace(CPLString *base, const char *search, const char *fmt,
99
                        ...)
100
3.49k
{
101
3.49k
    CPLString tmp;
102
3.49k
    va_list args;
103
104
3.49k
    size_t start = base->find(search);
105
3.49k
    if (start == std::string::npos)
106
2.41k
    {
107
2.41k
        return -1;
108
2.41k
    }
109
110
1.08k
    va_start(args, fmt);
111
1.08k
    tmp.vPrintf(fmt, args);
112
1.08k
    va_end(args);
113
114
1.08k
    base->replace(start, strlen(search), tmp);
115
1.08k
    return static_cast<int>(start);
116
3.49k
}
117
118
// decode s from base64, XMLencoded or read from the file name s
119
const char *WMSUtilDecode(CPLString &s, const char *encoding)
120
0
{
121
0
    if (EQUAL(encoding, "base64"))
122
0
    {
123
0
        std::vector<char> buffer(s.begin(), s.end());
124
0
        buffer.push_back('\0');
125
0
        int nSize =
126
0
            CPLBase64DecodeInPlace(reinterpret_cast<GByte *>(&buffer[0]));
127
0
        s.assign(&buffer[0], nSize);
128
0
    }
129
0
    else if (EQUAL(encoding, "XMLencoded"))
130
0
    {
131
0
        int len = static_cast<int>(s.size());
132
0
        char *result = CPLUnescapeString(s.c_str(), &len, CPLES_XML);
133
0
        s.assign(result, static_cast<size_t>(len));
134
0
        CPLFree(result);
135
0
    }
136
0
    else if (EQUAL(encoding, "file"))
137
0
    {  // Not an encoding but an external file
138
0
        VSILFILE *f = VSIFOpenL(s.c_str(), "rb");
139
0
        s.clear();  // Return an empty string if file can't be opened or read
140
0
        if (f)
141
0
        {
142
0
            VSIFSeekL(f, 0, SEEK_END);
143
0
            size_t size = static_cast<size_t>(VSIFTellL(f));
144
0
            VSIFSeekL(f, 0, SEEK_SET);
145
0
            std::vector<char> buffer(size);
146
0
            if (VSIFReadL(reinterpret_cast<void *>(&buffer[0]), size, 1, f))
147
0
                s.assign(&buffer[0], buffer.size());
148
0
            VSIFCloseL(f);
149
0
        }
150
0
    }
151
0
    return s.c_str();
152
0
}