Coverage Report

Created: 2026-02-14 09:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/frmts/wms/minidriver.cpp
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  WMS Client Driver
4
 * Purpose:  WMSMiniDriverManager implementation.
5
 * Author:   Adam Nowacki, nowak@xpam.de
6
 *
7
 ******************************************************************************
8
 *
9
 * Copyright (c) 2007, Adam Nowacki
10
 *               2016, Lucian Plesea
11
 *
12
 * A single global MiniDriverManager exists, containing factories for all
13
 *possible types of WMS minidrivers.  Minidriver object factories get registered
14
 *in wmsdriver.cpp, during the WMS driver registration with GDAL
15
 *
16
 * SPDX-License-Identifier: MIT
17
 ****************************************************************************/
18
19
#include "wmsdriver.h"
20
21
class WMSMiniDriverManager
22
{
23
  public:
24
    WMSMiniDriverManager()
25
92
    {
26
92
    }
27
28
    ~WMSMiniDriverManager()
29
0
    {
30
0
        erase();
31
0
    }
32
33
  public:
34
    void Register(WMSMiniDriverFactory *mdf);
35
    // Clean up the minidriver factories
36
    void erase();
37
    WMSMiniDriverFactory *Find(const CPLString &name);
38
39
  protected:
40
    std::vector<WMSMiniDriverFactory *> m_mdfs{};
41
42
    CPL_DISALLOW_COPY_ASSIGN(WMSMiniDriverManager)
43
};
44
45
// Called by WMS driver deregister, also by destructor
46
void WMSMiniDriverManager::erase()
47
0
{
48
0
    for (size_t i = 0; i < m_mdfs.size(); i++)
49
0
        delete m_mdfs[i];
50
0
    m_mdfs.clear();
51
0
}
52
53
WMSMiniDriverFactory *WMSMiniDriverManager::Find(const CPLString &name)
54
13.3k
{
55
15.6k
    for (size_t i = 0; i < m_mdfs.size(); i++)
56
15.3k
        if (EQUAL(name.c_str(), m_mdfs[i]->m_name))
57
13.1k
            return m_mdfs[i];
58
264
    return nullptr;
59
13.3k
}
60
61
void WMSMiniDriverManager::Register(WMSMiniDriverFactory *mdf)
62
264
{
63
    // Prevent duplicates
64
264
    if (!Find(mdf->m_name))
65
264
        m_mdfs.push_back(mdf);
66
0
    else  // Register takes ownership of factories, so it removes the duplicate
67
0
        delete mdf;
68
264
}
69
70
// global object containing minidriver factories
71
static WMSMiniDriverManager g_mini_driver_manager;
72
73
// If a matching factory is found in the global minidriver manager, it returns a
74
// new minidriver object
75
WMSMiniDriver *NewWMSMiniDriver(const CPLString &name)
76
13.1k
{
77
13.1k
    const WMSMiniDriverFactory *factory = g_mini_driver_manager.Find(name);
78
13.1k
    if (factory == nullptr)
79
0
        return nullptr;
80
13.1k
    return factory->New();
81
13.1k
}
82
83
// Registers a minidriver factory with the global minidriver manager
84
void WMSRegisterMiniDriverFactory(WMSMiniDriverFactory *mdf)
85
264
{
86
264
    g_mini_driver_manager.Register(mdf);
87
264
}
88
89
void WMSDeregisterMiniDrivers(CPL_UNUSED GDALDriver *)
90
0
{
91
0
    g_mini_driver_manager.erase();
92
0
}