Line data Source code
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 10 : WMSMiniDriverManager() 25 10 : { 26 10 : } 27 : 28 10 : ~WMSMiniDriverManager() 29 10 : { 30 10 : erase(); 31 10 : } 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 10 : void WMSMiniDriverManager::erase() 47 : { 48 130 : for (size_t i = 0; i < m_mdfs.size(); i++) 49 120 : delete m_mdfs[i]; 50 10 : m_mdfs.clear(); 51 10 : } 52 : 53 470 : WMSMiniDriverFactory *WMSMiniDriverManager::Find(const CPLString &name) 54 : { 55 2213 : for (size_t i = 0; i < m_mdfs.size(); i++) 56 2093 : if (EQUAL(name.c_str(), m_mdfs[i]->m_name)) 57 350 : return m_mdfs[i]; 58 120 : return nullptr; 59 : } 60 : 61 120 : void WMSMiniDriverManager::Register(WMSMiniDriverFactory *mdf) 62 : { 63 : // Prevent duplicates 64 120 : if (!Find(mdf->m_name)) 65 120 : m_mdfs.push_back(mdf); 66 : else // Register takes ownership of factories, so it removes the duplicate 67 0 : delete mdf; 68 120 : } 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 350 : WMSMiniDriver *NewWMSMiniDriver(const CPLString &name) 76 : { 77 350 : const WMSMiniDriverFactory *factory = g_mini_driver_manager.Find(name); 78 350 : if (factory == nullptr) 79 0 : return nullptr; 80 350 : return factory->New(); 81 : } 82 : 83 : // Registers a minidriver factory with the global minidriver manager 84 120 : void WMSRegisterMiniDriverFactory(WMSMiniDriverFactory *mdf) 85 : { 86 120 : g_mini_driver_manager.Register(mdf); 87 120 : } 88 : 89 0 : void WMSDeregisterMiniDrivers(CPL_UNUSED GDALDriver *) 90 : { 91 0 : g_mini_driver_manager.erase(); 92 0 : }