2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "web/websocket/SubProtocolFactorySelector.h"
44#ifndef DOXYGEN_SHOULD_SKIP_THIS
46#include "log/Logger.h"
55 template <
typename SubProtocolFactory>
57 const std::string& subProtocolLibraryFile,
58 const std::string& subProtocolFactoryFunctionName) {
59 SubProtocolFactory* subProtocolFactory =
nullptr;
61 void* handle = core::DynamicLoader::
dlOpen(subProtocolLibraryFile);
63 if (handle !=
nullptr) {
64 SubProtocolFactory* (*getSubProtocolFactory)() =
66 if (getSubProtocolFactory !=
nullptr) {
67 subProtocolFactory = getSubProtocolFactory();
68 if (subProtocolFactory !=
nullptr) {
69 subProtocolFactory->setHandle(handle);
70 LOG(DEBUG) <<
"WebSocket: SubProtocolFactory created successful: " << subProtocolName;
72 LOG(DEBUG) <<
"WebSocket: SubProtocolFactory not created: " << subProtocolName;
76 LOG(DEBUG) <<
"WebSocket: Optaining function \"" << subProtocolFactoryFunctionName
82 return subProtocolFactory;
85 template <
typename SubProtocolFactory>
87 SubProtocolFactory* subProtocolFactory =
nullptr;
93 return subProtocolFactory;
96 template <
typename SubProtocolFactory>
99 SubProtocolFactory* subProtocolFactory = select(subProtocolName);
101 if (subProtocolFactory ==
nullptr) {
104 subProtocolFactory = plugin();
106 subProtocolFactory = load(subProtocolName);
109 if (subProtocolFactory !=
nullptr) {
114 return subProtocolFactory;
117 template <
typename SubProtocolFactory>
static int dlClose(void *handle)
static void * dlSym(void *handle, const std::string &symbol)
SubProtocolFactory * select(const std::string &subProtocolName)
std::map< std::string, SubProtocolFactory * > subProtocolFactories
static SubProtocolFactory * load(const std::string &subProtocolName, const std::string &subProtocolLibraryFile, const std::string &subProtocolFactoryFunctionName)
std::map< std::string, SubProtocolFactory *(*)()> linkedSubProtocolFactories
SubProtocolFactory * select(const std::string &subProtocolName, Role role)
static void allowDlOpen()
SubProtocolFactory * load(const std::string &subProtocolName) override
static SubProtocolFactorySelector * instance()
~SubProtocolFactorySelector() override