From 66d3e99ff2bea172d991ad59db19586ce7bcbed6 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Fri, 9 Oct 2015 19:18:45 -0300 Subject: Add a PluginManager class This class is currently very small but the reason of existence is to allow subsurface to be easily extendable via plugins. The current type of plugin that I'm making is Social Network, but another possibilities: - Dive Simulation Algorithm - Import/Export Filters - Profile Overlays Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- subsurface-core/CMakeLists.txt | 1 + subsurface-core/pluginmanager.cpp | 44 +++++++++++++++++++++++++++++++++++++++ subsurface-core/pluginmanager.h | 19 +++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 subsurface-core/pluginmanager.cpp create mode 100644 subsurface-core/pluginmanager.h diff --git a/subsurface-core/CMakeLists.txt b/subsurface-core/CMakeLists.txt index 60efb7d92..e56f8bb34 100644 --- a/subsurface-core/CMakeLists.txt +++ b/subsurface-core/CMakeLists.txt @@ -72,6 +72,7 @@ set(SUBSURFACE_CORE_LIB_SRCS qtserialbluetooth.cpp metrics.cpp color.cpp + pluginmanager.cpp ${SERIAL_FTDI} ${PLATFORM_SRC} ${BT_CORE_SRC_FILES} diff --git a/subsurface-core/pluginmanager.cpp b/subsurface-core/pluginmanager.cpp new file mode 100644 index 000000000..41d226f61 --- /dev/null +++ b/subsurface-core/pluginmanager.cpp @@ -0,0 +1,44 @@ +#include "pluginmanager.h" + +#include +#include +#include + +static QList _socialNetworks; + +PluginManager& PluginManager::instance() { + static PluginManager self; + return self; +} + +void PluginManager::loadPlugins() { + QDir pluginsDir(qApp->applicationDirPath()); + +#if defined(Q_OS_WIN) + if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") + pluginsDir.cdUp(); +#elif defined(Q_OS_MAC) + if (pluginsDir.dirName() == "MacOS") { + pluginsDir.cdUp(); + pluginsDir.cdUp(); + pluginsDir.cdUp(); + } +#endif + pluginsDir.cd("plugins"); + + foreach (const QString& fileName, pluginsDir.entryList(QDir::Files)) { + QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); + QObject *plugin = loader.instance(); + if(!plugin) { + continue; + } + + if (ISocialNetworkIntegration *social = qobject_cast(plugin)){ + _socialNetworks.push_back(social); + } + } +} + +QList PluginManager::socialNetworkIntegrationPlugins() const { + return _socialNetworks; +} \ No newline at end of file diff --git a/subsurface-core/pluginmanager.h b/subsurface-core/pluginmanager.h new file mode 100644 index 000000000..c4943895c --- /dev/null +++ b/subsurface-core/pluginmanager.h @@ -0,0 +1,19 @@ +#ifndef PLUGINMANAGER_H +#define PLUGINMANAGER_H + +#include + +#include "isocialnetworkintegration.h" + +class PluginManager { +public: + static PluginManager& instance(); + void loadPlugins(); + QList socialNetworkIntegrationPlugins() const; +private: + PluginManager(); + PluginManager(const PluginManager&) = delete; + PluginManager& operator=(const PluginManager&) = delete; +}; + +#endif \ No newline at end of file -- cgit v1.2.3-70-g09d2