70 SocketContextUpgradeFactory* (*getSocketContextUpgradeFactory)() =
reinterpret_cast<SocketContextUpgradeFactory* (*) ()>(
71 core::DynamicLoader::dlSym(handle, socketContextUpgradeFactoryFunctionName));
73 if (getSocketContextUpgradeFactory !=
nullptr) {
74 socketContextUpgradeFactory = getSocketContextUpgradeFactory();
76 if (socketContextUpgradeFactory !=
nullptr) {
77 if (add(socketContextUpgradeFactory, handle)) {
78 LOG(DEBUG) <<
"HTTP: SocketContextUpgradeFactory created successful: " << socketContextUpgradeName;
80 LOG(DEBUG) <<
"HTTP: UpgradeSocketContext already existing. Not using: " << socketContextUpgradeName;
81 delete socketContextUpgradeFactory;
82 socketContextUpgradeFactory =
nullptr;
83 core::DynamicLoader::dlClose(handle);
86 LOG(ERROR) <<
"HTTP: SocketContextUpgradeFactory not created: " << socketContextUpgradeName;
87 core::DynamicLoader::dlClose(handle);
90 LOG(ERROR) <<
"HTTP: Optaining function \"" << socketContextUpgradeFactoryFunctionName
91 <<
"\" in plugin failed: " << core::DynamicLoader::dlError();
92 core::DynamicLoader::dlClose(handle);
96 return socketContextUpgradeFactory;
99 template <
typename SocketContextUpgradeFactory>
100 SocketContextUpgradeFactory*
101 SocketContextUpgradeFactorySelector<SocketContextUpgradeFactory>::select(
const std::string& socketContextUpgradeName) {
102 SocketContextUpgradeFactory* socketContextUpgradeFactory =
nullptr;
104 if (socketContextUpgradePlugins.contains(socketContextUpgradeName)) {
105 socketContextUpgradeFactory = socketContextUpgradePlugins[socketContextUpgradeName].socketContextUpgradeFactory;
106 }
else if (linkedSocketContextUpgradePlugins.contains(socketContextUpgradeName)) {
107 socketContextUpgradeFactory = linkedSocketContextUpgradePlugins[socketContextUpgradeName]();
108 add(socketContextUpgradeFactory);
109 }
else if (!onlyLinked) {
110 socketContextUpgradeFactory = load(socketContextUpgradeName);
113 return socketContextUpgradeFactory;
116 template <
typename SocketContextUpgradeFactory>
117 void SocketContextUpgradeFactorySelector<SocketContextUpgradeFactory>::link(
const std::string& socketContextUpgradeName,
118 SocketContextUpgradeFactory* (*linkedPlugin)()) {
119 if (!linkedSocketContextUpgradePlugins.contains(socketContextUpgradeName)) {
120 linkedSocketContextUpgradePlugins[socketContextUpgradeName] = linkedPlugin;
126 template <
typename SocketContextUpgradeFactory>
128 SocketContextUpgradeFactorySelector<SocketContextUpgradeFactory>::unload(SocketContextUpgradeFactory* socketContextUpgradeFactory) {
129 std::string upgradeContextNames = socketContextUpgradeFactory->name();
131 if (socketContextUpgradePlugins.contains(upgradeContextNames)) {
132 SocketContextPlugin socketContextPlugin = socketContextUpgradePlugins[upgradeContextNames];
133 socketContextUpgradePlugins.erase(upgradeContextNames);
135 delete socketContextUpgradeFactory;
137 if (socketContextPlugin.handle !=
nullptr) {
138 core::DynamicLoader::dlCloseDelayed(socketContextPlugin.handle);