summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuerra Mattia <mguerra@de.adit-jv.com>2016-04-05 14:28:56 +0200
committerChristian Linke <Christian.Linke@bmw.de>2016-04-11 09:12:30 -0700
commitcf9c4bc83d4c705ca6fbb2f06dec95615063bae1 (patch)
treeb4a5fb4af7a99b313d557dd6149cf447ab1f0d93
parent5d57e445b5b3296a7bc2946ce2bd2678c94da33c (diff)
downloadaudiomanager-cf9c4bc83d4c705ca6fbb2f06dec95615063bae1.tar.gz
utility: Moved TAmPluginTemplate.h to utilities
Signed-off-by: Jens Lorenz <jlorenz@de.adit-jv.com>
-rw-r--r--AudioManagerUtilities/include/TAmPluginTemplate.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/AudioManagerUtilities/include/TAmPluginTemplate.h b/AudioManagerUtilities/include/TAmPluginTemplate.h
new file mode 100644
index 0000000..f000fbe
--- /dev/null
+++ b/AudioManagerUtilities/include/TAmPluginTemplate.h
@@ -0,0 +1,91 @@
+/**
+ * SPDX license identifier: MPL-2.0
+ *
+ * Copyright (C) 2012, BMW AG
+ *
+ * This file is part of GENIVI Project AudioManager.
+ *
+ * Contributions are licensed to the GENIVI Alliance under one or more
+ * Contribution License Agreements.
+ *
+ * \copyright
+ * This Source Code Form is subject to the terms of the
+ * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
+ * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ *
+ * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012
+ *
+ * \file TAmPluginTemplate.h
+ * For further information see http://www.genivi.org/.
+ *
+ */
+
+#ifndef PLUGINTEMPLATE_H_
+#define PLUGINTEMPLATE_H_
+
+#include <dlfcn.h>
+#include <libgen.h>
+#include "CAmDltWrapper.h"
+
+namespace am
+{
+
+/**
+ * * This template tries to load a library and cast to a class
+ * @param libname the full path to the library to be loaded
+ * @param libraryHandle the handle to the library that gets returned
+ * @return returns the pointer to the class to be loaded
+ */
+template<class T> T* getCreateFunction(const std::string& libname, void*& libraryHandle)
+{
+
+ logInfo("getCreateFunction : Trying to load library with name: ",libname);
+
+ // cut off directories
+ char* fileWithPath = const_cast<char*>(libname.c_str());
+ std::string libFileName = basename(fileWithPath);
+
+ // cut off "lib" in front and cut off .so end"
+ std::string createFunctionName = libFileName.substr(3, libFileName.length() - 6) + "Factory";
+ // open library
+ dlerror(); // Clear any existing error
+ libraryHandle = dlopen(libname.c_str(), RTLD_LAZY );
+ const char* dlopen_error = dlerror();
+ if (!libraryHandle || dlopen_error)
+ {
+ logError("getCreateFunction : dlopen failed",dlopen_error);
+ return (0);
+ }
+
+ // get entry point from shared lib
+ dlerror(); // Clear any existing error
+
+ union
+ {
+ void* voidPointer;
+ T* typedPointer;
+ } functionPointer;
+
+ // Note: direct cast is not allowed by ISO C++. e.g.
+ // T* createFunction = reinterpret_cast<T*>(dlsym(libraryHandle, createFunctionName.c_str()));
+ // compiler warning: "forbids casting between pointer-to-function and pointer-to-object"
+
+ functionPointer.voidPointer = dlsym(libraryHandle, createFunctionName.c_str());
+ T* createFunction = functionPointer.typedPointer;
+
+ const char* dlsym_error = dlerror();
+ if (!createFunction || dlsym_error)
+ {
+ logError("getCreateFunction: Failed to load shared lib entry point",dlsym_error);
+ }
+ else
+ {
+ logInfo("getCreateFunction : loaded successfully plugin", createFunctionName);
+ }
+ return (createFunction);
+}
+
+}
+
+#endif /* PLUGINTEMPLATE_H_ */