34 SubProtocolFactory* SubProtocolFactorySelector<SubProtocolFactory>::load(
const std::string& subProtocolName,
35 const std::string& subProtocolLibraryFile,
36 const std::string& subProtocolFactoryFunctionName) {
37 SubProtocolFactory* subProtocolFactory =
nullptr;
39 void* handle = core::DynamicLoader::
dlOpen(subProtocolLibraryFile);
41 if (handle !=
nullptr) {
42 SubProtocolFactory* (*getSubProtocolFactory)() =
43 reinterpret_cast<SubProtocolFactory* (*) ()>(core::DynamicLoader::dlSym(handle, subProtocolFactoryFunctionName));
44 if (getSubProtocolFactory !=
nullptr) {
45 subProtocolFactory = getSubProtocolFactory();
46 if (subProtocolFactory !=
nullptr) {
47 subProtocolFactory->setHandle(handle);
48 LOG(DEBUG) <<
"WebSocket: SubProtocolFactory created successful: " << subProtocolName;
50 LOG(DEBUG) <<
"WebSocket: SubProtocolFactory not created: " << subProtocolName;
51 core::DynamicLoader::dlClose(handle);
54 LOG(DEBUG) <<
"WebSocket: Optaining function \"" << subProtocolFactoryFunctionName
55 <<
"\" in plugin failed: " << core::DynamicLoader::dlError();
56 core::DynamicLoader::dlClose(handle);
60 return subProtocolFactory;
63 template <
typename SubProtocolFactory>
64 SubProtocolFactory* SubProtocolFactorySelector<SubProtocolFactory>::select(
const std::string& subProtocolName) {
65 SubProtocolFactory* subProtocolFactory =
nullptr;
67 if (subProtocolFactories.contains(subProtocolName)) {
68 subProtocolFactory = subProtocolFactories[subProtocolName];
71 return subProtocolFactory;
74 template <
typename SubProtocolFactory>
75 SubProtocolFactory* SubProtocolFactorySelector<SubProtocolFactory>::select(
const std::string& subProtocolName,
76 [[maybe_unused]] Role role) {
77 SubProtocolFactory* subProtocolFactory = select(subProtocolName);
79 if (subProtocolFactory ==
nullptr) {
80 if (linkedSubProtocolFactories.contains(subProtocolName)) {
81 SubProtocolFactory* (*plugin)() = linkedSubProtocolFactories[subProtocolName];
82 subProtocolFactory = plugin();
83 }
else if (!onlyLinked) {
84 subProtocolFactory = load(subProtocolName);
87 if (subProtocolFactory !=
nullptr) {
88 subProtocolFactories.insert({subProtocolName, subProtocolFactory});
92 return subProtocolFactory;
95 template <
typename SubProtocolFactory>
96 void SubProtocolFactorySelector<SubProtocolFactory>::allowDlOpen() {