summaryrefslogtreecommitdiff
path: root/AudioManagerCore/include/TAmPluginTemplate.h
diff options
context:
space:
mode:
authorChristian Linke <Christian.Linke@bmw.de>2016-02-11 07:28:47 +0100
committerChristian Linke <Christian.Linke@bmw.de>2016-02-15 09:00:59 +0100
commit5bcd206b9270d9a79e212f91723ea1a08a4d4859 (patch)
tree55b0cd4d07fbd7ebfd15d58d02e9cae6ae61b127 /AudioManagerCore/include/TAmPluginTemplate.h
parent59080ecc2c8840fd85c561adea3f85f5344534a8 (diff)
downloadaudiomanager-5bcd206b9270d9a79e212f91723ea1a08a4d4859.tar.gz
* rework of the build structure, adopt to standard cmake package structure7.4
* check versions when loading the libs * introduction of the AudioManagerCore * give control plugin as file or directory * remove SQLITE * either find and use gmock or build and install it * fixed [Bug 411] * compile flag gnu11 is now used Signed-off-by: Christian Linke <Christian.Linke@bmw.de> Signed-off-by: Christian Linke <Christian.Linke@bmw.de>
Diffstat (limited to 'AudioManagerCore/include/TAmPluginTemplate.h')
-rw-r--r--AudioManagerCore/include/TAmPluginTemplate.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/AudioManagerCore/include/TAmPluginTemplate.h b/AudioManagerCore/include/TAmPluginTemplate.h
new file mode 100644
index 0000000..f000fbe
--- /dev/null
+++ b/AudioManagerCore/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_ */