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 35 of file SubProtocolFactorySelector.h.

Member Typedef Documentation

◆ SubProtocolFactory

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

Definition at line 40 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 77 of file SubProtocolFactorySelector.h.

77 {
78 onlyLinked = true;
79 linkedSubProtocolFactories[subProtocolName] =
80 reinterpret_cast<SubProtocolFactorySelector::SubProtocolFactory* (*) ()>(subProtocolFactory);
81 }
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 34 of file SubProtocolFactorySelector.hpp.

36 {
37 SubProtocolFactory* subProtocolFactory = nullptr;
38
39 void* handle = core::DynamicLoader::dlOpen(subProtocolLibraryFile);
40
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;
49 } else {
50 LOG(DEBUG) << "WebSocket: SubProtocolFactory not created: " << subProtocolName;
52 }
53 } else {
54 LOG(DEBUG) << "WebSocket: Optaining function \"" << subProtocolFactoryFunctionName
55 << "\" in plugin failed: " << core::DynamicLoader::dlError();
57 }
58 }
59
60 return subProtocolFactory;
61 }
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 64 of file SubProtocolFactorySelector.hpp.

64 {
65 SubProtocolFactory* subProtocolFactory = nullptr;
66
67 if (subProtocolFactories.contains(subProtocolName)) {
68 subProtocolFactory = subProtocolFactories[subProtocolName];
69 }
70
71 return subProtocolFactory;
72 }
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 75 of file SubProtocolFactorySelector.hpp.

76 {
77 SubProtocolFactory* subProtocolFactory = select(subProtocolName);
78
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);
85 }
86
87 if (subProtocolFactory != nullptr) {
88 subProtocolFactories.insert({subProtocolName, subProtocolFactory});
89 }
90 }
91
92 return subProtocolFactory;
93 }
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 58 of file SubProtocolFactorySelector.h.

58 {
59 std::string name = subProtocolFactory->getName();
60
61 if (subProtocolFactories.contains(name)) {
62 subProtocolFactories.erase(name);
63
64 void* handle = subProtocolFactory->getHandle();
65 delete subProtocolFactory;
66
67 if (handle != nullptr) {
69 }
70 }
71 }
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 85 of file SubProtocolFactorySelector.h.

◆ onlyLinked

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

Definition at line 87 of file SubProtocolFactorySelector.h.

◆ subProtocolFactories

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

Definition at line 84 of file SubProtocolFactorySelector.h.


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