summaryrefslogtreecommitdiffstats
path: root/net/host_resolver_helper/dyn_lib_loader.h
diff options
context:
space:
mode:
Diffstat (limited to 'net/host_resolver_helper/dyn_lib_loader.h')
-rw-r--r--net/host_resolver_helper/dyn_lib_loader.h103
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__