/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 | } |