diff options
Diffstat (limited to 'extern/audaspace/src/plugin/PluginManagerUnix.cpp.in')
-rw-r--r-- | extern/audaspace/src/plugin/PluginManagerUnix.cpp.in | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/extern/audaspace/src/plugin/PluginManagerUnix.cpp.in b/extern/audaspace/src/plugin/PluginManagerUnix.cpp.in new file mode 100644 index 00000000000..d08804bc2e7 --- /dev/null +++ b/extern/audaspace/src/plugin/PluginManagerUnix.cpp.in @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright 2009-2016 Jörg Müller + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#include "plugin/PluginManager.h" + +#include <dlfcn.h> +#include <dirent.h> + +AUD_NAMESPACE_BEGIN + +std::unordered_map<std::string, void*> PluginManager::m_plugins; + +void* PluginManager::openLibrary(const std::string& path) +{ + return dlopen(path.c_str(), RTLD_LAZY); +} + +void *PluginManager::lookupLibrary(void *handle, const std::string &name) +{ + return dlsym(handle, name.c_str()); +} + +void PluginManager::closeLibrary(void *handle) +{ + dlclose(handle); +} + +bool PluginManager::loadPlugin(const std::string& path) +{ + void* handle = openLibrary(path); + + if (!handle) + return false; + + void (*registerPlugin)() = (void (*)())lookupLibrary(handle, "registerPlugin"); + const char* (*getName)() = (const char* (*)())lookupLibrary(handle, "getName"); + + if(!registerPlugin || !getName) + { + closeLibrary(handle); + return false; + } + + registerPlugin(); + + m_plugins[getName()] = handle; + + return true; +} + +#define STATIC_PLUGIN_CLASS(name) class name { public: static void registerPlugin(); }; +#define STATIC_PLUGIN_REGISTER(name) name::registerPlugin(); + +@STATIC_PLUGIN_CLASSES@ + +void PluginManager::loadPlugins(const std::string& path) +{ +@STATIC_PLUGIN_REGISTERS@ + + std::string readpath = path; + + if(path == "") + readpath = "@DEFAULT_PLUGIN_PATH@"; + + DIR* dir = opendir(readpath.c_str()); + + if(!dir) + return; + + while(dirent* entry = readdir(dir)) + { + const std::string filename = entry->d_name; + const std::string end = ".so"; + + if(filename.length() >= end.length() && filename.substr(filename.length() - end.length()) == end) + { + if(!loadPlugin(readpath + "/" + filename + ".@AUDASPACE_VERSION@")) + loadPlugin(readpath + "/" + filename); + } + } + + closedir(dir); +} + +AUD_NAMESPACE_END |