SNode.C
Loading...
Searching...
No Matches
web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT > Class Template Referenceabstract

#include <SubProtocolFactorySelector.h>

Collaboration diagram for web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >:

Public Types

enum class  Role { SERVER , CLIENT }
 
using SubProtocolFactory = SubProtocolFactoryT
 

Public Member Functions

 SubProtocolFactorySelector (const SubProtocolFactorySelector &)=delete
 
SubProtocolFactorySelectoroperator= (const SubProtocolFactorySelector &)=delete
 
SubProtocolFactoryselect (const std::string &subProtocolName)
 
SubProtocolFactoryselect (const std::string &subProtocolName, Role role)
 
template<typename SubProtocolFactory >
void unload (SubProtocolFactory *subProtocolFactory)
 

Protected Member Functions

 SubProtocolFactorySelector ()=default
 
virtual ~SubProtocolFactorySelector ()=default
 
virtual SubProtocolFactoryload (const std::string &subProtocolName)=0
 
void allowDlOpen ()
 
template<typename SubProtocolFactory >
void link (const std::string &subProtocolName, SubProtocolFactory *(*subProtocolFactory)())
 

Static Protected Member Functions

static SubProtocolFactoryload (const std::string &subProtocolName, const std::string &subProtocolLibraryFile, const std::string &subProtocolFactoryFunctionName)
 

Private Attributes

std::map< std::string, SubProtocolFactory * > subProtocolFactories
 
std::map< std::string, SubProtocolFactory *(*)()> linkedSubProtocolFactories
 
bool onlyLinked = false
 

Detailed Description

template<typename SubProtocolFactoryT>
class web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >

Definition at line 57 of file SubProtocolFactorySelector.h.

Member Typedef Documentation

◆ SubProtocolFactory

template<typename SubProtocolFactoryT >
using web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::SubProtocolFactory = SubProtocolFactoryT

Definition at line 62 of file SubProtocolFactorySelector.h.

Member Enumeration Documentation

◆ Role

template<typename SubProtocolFactoryT >
enum class web::websocket::SubProtocolFactorySelector::Role
strong

Constructor & Destructor Documentation

◆ SubProtocolFactorySelector() [1/2]

template<typename SubProtocolFactoryT >
web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::SubProtocolFactorySelector ( const SubProtocolFactorySelector< SubProtocolFactoryT > & )
delete

◆ SubProtocolFactorySelector() [2/2]

template<typename SubProtocolFactoryT >
web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::SubProtocolFactorySelector ( )
protecteddefault

◆ ~SubProtocolFactorySelector()

template<typename SubProtocolFactoryT >
virtual web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::~SubProtocolFactorySelector ( )
protectedvirtualdefault

Member Function Documentation

◆ allowDlOpen()

template<typename SubProtocolFactory >
void web::websocket::SubProtocolFactorySelector< SubProtocolFactory >::allowDlOpen ( )
protected

◆ link()

template<typename SubProtocolFactoryT >
template<typename SubProtocolFactory >
void web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::link ( const std::string & subProtocolName,
SubProtocolFactory *(* subProtocolFactory )() )
inlineprotected

Definition at line 99 of file SubProtocolFactorySelector.h.

99 {
100 onlyLinked = true;
101 linkedSubProtocolFactories[subProtocolName] =
102 reinterpret_cast<SubProtocolFactorySelector::SubProtocolFactory* (*) ()>(subProtocolFactory);
103 }
std::map< std::string, SubProtocolFactory *(*)()> linkedSubProtocolFactories

◆ load() [1/2]

template<typename SubProtocolFactoryT >
virtual SubProtocolFactory * web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::load ( const std::string & subProtocolName)
protectedpure virtual

◆ load() [2/2]

template<typename SubProtocolFactory >
SubProtocolFactory * web::websocket::SubProtocolFactorySelector< SubProtocolFactory >::load ( const std::string & subProtocolName,
const std::string & subProtocolLibraryFile,
const std::string & subProtocolFactoryFunctionName )
staticprotected

Definition at line 56 of file SubProtocolFactorySelector.hpp.

58 {
59 SubProtocolFactory* subProtocolFactory = nullptr;
60
61 void* handle = core::DynamicLoader::dlOpen(subProtocolLibraryFile);
62
63 if (handle != nullptr) {
64 SubProtocolFactory* (*getSubProtocolFactory)() =
65 reinterpret_cast<SubProtocolFactory* (*) ()>(core::DynamicLoader::dlSym(handle, subProtocolFactoryFunctionName));
66 if (getSubProtocolFactory != nullptr) {
67 subProtocolFactory = getSubProtocolFactory();
68 if (subProtocolFactory != nullptr) {
69 subProtocolFactory->setHandle(handle);
70 LOG(DEBUG) << "WebSocket: SubProtocolFactory created successful: " << subProtocolName;
71 } else {
72 LOG(DEBUG) << "WebSocket: SubProtocolFactory not created: " << subProtocolName;
74 }
75 } else {
76 LOG(DEBUG) << "WebSocket: Optaining function \"" << subProtocolFactoryFunctionName
77 << "\" in plugin failed: " << core::DynamicLoader::dlError();
79 }
80 }
81
82 return subProtocolFactory;
83 }
static char * dlError()
static int dlClose(void *handle)
static void * dlSym(void *handle, const std::string &symbol)

◆ operator=()

template<typename SubProtocolFactoryT >
SubProtocolFactorySelector & web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::operator= ( const SubProtocolFactorySelector< SubProtocolFactoryT > & )
delete

◆ select() [1/2]

template<typename SubProtocolFactory >
SubProtocolFactory * web::websocket::SubProtocolFactorySelector< SubProtocolFactory >::select ( const std::string & subProtocolName)

Definition at line 86 of file SubProtocolFactorySelector.hpp.

86 {
87 SubProtocolFactory* subProtocolFactory = nullptr;
88
89 if (subProtocolFactories.contains(subProtocolName)) {
90 subProtocolFactory = subProtocolFactories[subProtocolName];
91 }
92
93 return subProtocolFactory;
94 }
std::map< std::string, SubProtocolFactory * > subProtocolFactories

◆ select() [2/2]

template<typename SubProtocolFactory >
SubProtocolFactory * web::websocket::SubProtocolFactorySelector< SubProtocolFactory >::select ( const std::string & subProtocolName,
Role role )

Definition at line 97 of file SubProtocolFactorySelector.hpp.

98 {
99 SubProtocolFactory* subProtocolFactory = select(subProtocolName);
100
101 if (subProtocolFactory == nullptr) {
102 if (linkedSubProtocolFactories.contains(subProtocolName)) {
103 SubProtocolFactory* (*plugin)() = linkedSubProtocolFactories[subProtocolName];
104 subProtocolFactory = plugin();
105 } else if (!onlyLinked) {
106 subProtocolFactory = load(subProtocolName);
107 }
108
109 if (subProtocolFactory != nullptr) {
110 subProtocolFactories.insert({subProtocolName, subProtocolFactory});
111 }
112 }
113
114 return subProtocolFactory;
115 }
SubProtocolFactory * select(const std::string &subProtocolName)
virtual SubProtocolFactory * load(const std::string &subProtocolName)=0

◆ unload()

template<typename SubProtocolFactoryT >
template<typename SubProtocolFactory >
void web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::unload ( SubProtocolFactory * subProtocolFactory)
inline

Definition at line 80 of file SubProtocolFactorySelector.h.

80 {
81 std::string name = subProtocolFactory->getName();
82
83 if (subProtocolFactories.contains(name)) {
84 subProtocolFactories.erase(name);
85
86 void* handle = subProtocolFactory->getHandle();
87 delete subProtocolFactory;
88
89 if (handle != nullptr) {
91 }
92 }
93 }
static void dlCloseDelayed(void *handle)

Member Data Documentation

◆ linkedSubProtocolFactories

template<typename SubProtocolFactoryT >
std::map<std::string, SubProtocolFactory* (*) ()> web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::linkedSubProtocolFactories
private

Definition at line 107 of file SubProtocolFactorySelector.h.

◆ onlyLinked

template<typename SubProtocolFactoryT >
bool web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::onlyLinked = false
private

Definition at line 109 of file SubProtocolFactorySelector.h.

◆ subProtocolFactories

template<typename SubProtocolFactoryT >
std::map<std::string, SubProtocolFactory*> web::websocket::SubProtocolFactorySelector< SubProtocolFactoryT >::subProtocolFactories
private

Definition at line 106 of file SubProtocolFactorySelector.h.


The documentation for this class was generated from the following files: