diff options
Diffstat (limited to 'net/host_resolver_helper/dyn_lib_loader.h')
-rw-r--r-- | net/host_resolver_helper/dyn_lib_loader.h | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/net/host_resolver_helper/dyn_lib_loader.h b/net/host_resolver_helper/dyn_lib_loader.h new file mode 100644 index 0000000..6e3b0f0 --- /dev/null +++ b/net/host_resolver_helper/dyn_lib_loader.h @@ -0,0 +1,103 @@ +/** --------------------------------------------------------------------------- + Copyright (c) 2011, Code Aurora Forum. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Code Aurora Forum, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + -----------------------------------------------------------------------------**/ +#ifndef __DYN_LIB_LOADER_H__ +#define __DYN_LIB_LOADER_H__ + +#include <map> +#include <string> +#include <dlfcn.h> +#include "dyn_lib_loader_decl.h" + +template<class T> +inline T* GetInterfacePtr(void* funptr) { + typedef T* (*InterfaceFunPtr)(void); + if (NULL==funptr) { + return NULL; + } + InterfaceFunPtr fun = (InterfaceFunPtr) (funptr); + return fun(); +} + +//This macro is used by module which wishes to use the interface object exported by some other module +// libname - is the dynamic library full name, interface_class - is the interface class for which +// the object will be imported +// EXAMPLE: Interface* ptr = GET_DYNAMIC_OBJECT_INTERFACE_PTR("libmy.so",Interface); +#define GET_DYNAMIC_OBJECT_INTERFACE_PTR(__libname__,__interface_class__) \ + GetInterfacePtr<__interface_class__>(LibraryManager::GetFunctionPtr<__interface_class__>(__libname__,"Get" #__interface_class__ "Object")) + +//LibraryManager Connects to shared library reusing the lib handle +//if called from mutiple places. Get retrieve exported functions and library handle. +//This class is module level singletone. +class LibraryManager { +public: + + typedef void* MODULE_HANDLE_TYPE; + template<class RET_TYPE> + static RET_TYPE* GetFunctionPtr(const char* libname, const char* symbol) { + return static_cast<RET_TYPE*>(GetInstance()->GetSymbolInternal(libname, + symbol)); + } + + static MODULE_HANDLE_TYPE GetLibraryHandle(const char* libname) { + return GetInstance()->GetLibraryHandleInternal(libname); + } + +private: + template<class MODULE_HANDLE_TYPE> + class LibHandleType { + public: + LibHandleType() : + handle(NULL) { + } + LibHandleType(MODULE_HANDLE_TYPE h) : + handle(h) { + } + operator MODULE_HANDLE_TYPE() { + return handle; + } + private: + MODULE_HANDLE_TYPE handle; + }; + + typedef LibHandleType<MODULE_HANDLE_TYPE> LibHandle; + typedef std::map<std::string, LibHandle> LibDictionary; + + static LibraryManager* GetInstance(); + LibraryManager() {} + ~LibraryManager(); + void* GetSymbolInternal(const std::string& libname, const std::string& symbol); + MODULE_HANDLE_TYPE GetLibraryHandleInternal(const std::string& libname); + void * LoadLibrarySymbol(const MODULE_HANDLE_TYPE& lh, const std::string& symname); + MODULE_HANDLE_TYPE LoadLibraryModule(const std::string& libname); + void ReleaseLibraryModule(const MODULE_HANDLE_TYPE& lh); + + std::map<std::string, LibHandle> libdict; +}; + +#endif //__DYN_LIB_LOADER_H__ |