diff --git a/SrcBehaviorLoader/PluginLoader.cpp b/SrcBehaviorLoader/PluginLoader.cpp index 70355ca3c6e4dec0fd4123169d30ca4284d1f8fb..0c75aad742c0bc7192e2d895d11c74ad8bde7bd7 100644 --- a/SrcBehaviorLoader/PluginLoader.cpp +++ b/SrcBehaviorLoader/PluginLoader.cpp @@ -202,6 +202,12 @@ std::vector<std::string> PluginLoader::searchDirectoriesForPlugins(std::vector<s PluginLoader::PluginLoader(QObject *parent) { m_PluginLoader = new QPluginLoader(this); + m_PluginListModel = new QStringListModel(); +} +PluginLoader::~PluginLoader() +{ + delete m_PluginLoader; + delete m_PluginListModel; } bool PluginLoader::loadPluginFromFilename(QString const& filename) @@ -236,6 +242,40 @@ bool PluginLoader::loadPluginFromFilename(QString const& filename) return retval; } +bool PluginLoader::loadPluginFromName(QString name) { + QString filename = m_PluginMap.find(name)->second; + return loadPluginFromFilename(filename); +} + +void PluginLoader::addToPluginList(QString filename) { + + bool isLib = QLibrary::isLibrary(filename); + + if (isLib) { + + QPluginLoader loader; + loader.setFileName(filename); + QJsonValue pluginMeda(loader.metaData().value("MetaData")); + QJsonObject metaObj = pluginMeda.toObject(); + QString mstring = metaObj.value("name").toString(); + if (!m_PluginList.contains(mstring)) + m_PluginList.append(mstring); + m_PluginListModel->setStringList(m_PluginList); + m_PluginMap.insert(std::pair<QString, QString>(mstring, filename)); + } + else { + qWarning() << "Error reading plugin: " << filename; + } +} + +QStringListModel* PluginLoader::getPluginList() { + return m_PluginListModel; +} + +QObject* PluginLoader::getPluginInstance() { + return (m_PluginLoader->instance()); +} + QJsonObject PluginLoader::getPluginMetaData() const { return m_MetaData; @@ -245,3 +285,18 @@ void PluginLoader::readMetaDataFromPlugin() { m_MetaData = m_PluginLoader->metaData().value("MetaData").toObject(); } + +bool PluginLoader::getIsPluginLoaded() { + return m_isPluginLoaded; +} + +QString PluginLoader::getCurrentPluginName() { + return m_currentPluginName; +} +const std::map<QString, QString> &PluginLoader::getPluginMap() const +{ + return m_PluginMap; +} + + + diff --git a/SrcBehaviorLoader/PluginLoader.h b/SrcBehaviorLoader/PluginLoader.h index b9d4542a769726ed6960fff52d1f1ba35dd59610..f0184fea63c3d8aa4ff03cceca593fc873138ff0 100644 --- a/SrcBehaviorLoader/PluginLoader.h +++ b/SrcBehaviorLoader/PluginLoader.h @@ -5,28 +5,94 @@ #include "QPluginLoader" #include "QStringListModel" #include "QPointer" +#include <map> class PluginLoader : QObject { Q_OBJECT public: explicit PluginLoader(QObject *parent = 0); + + ~PluginLoader(); + /** + * Loads a file as a QT plugin and reads it's name from the metadata. + * It will then be added to the stringlist and is selectable via "loadPluginFromName". + * This function does not actually set the plugin instance. + */ + void addToPluginList(QString p); + + /** + * Returns a QStrinListModel with the names of all seen Plugins. + */ + QStringListModel* getPluginList(); + + /** + * Loads a BioTracker Plugin from a filpaht. It returns true if the Plugin could be loaded, otherwise false. + */ bool loadPluginFromFilename(QString const& filename); + + /** + * Loads a plugin from it's name (given in the metadata) instead of the filename. + * Only works if it is already known to the pluginloader, i.e. was loaded manually or automatically before or + * or has been added to the pluginlist via "addToPluginList" + */ + bool loadPluginFromName(QString name); + QJsonObject getPluginMetaData() const; static std::vector<std::string> queryRegistryBehaviors(std::string path); + static std::vector<std::string> searchDirectoriesForPlugins(std::vector<std::string> list, std::string suffix); //return oldPath static const char* addDllPath(std::string file); + static void delDllPath(const char* oldPath); + + // Is a plugin loaded or not? + bool getIsPluginLoaded(); + + // Gets the name of the currently loaded plugin + QString getCurrentPluginName(); + + /** + * Returns the Instance of the BioTracker Plugin. + */ + QObject *getPluginInstance(); + + /** + * Returns a map containing the mapping "plugin name -> filename" + */ + std::map<QString, QString> const& getPluginMap() const; + private: + //a map containing the mapping "plugin name -> filename" + std::map<QString, QString> m_PluginMap; + + /** + * Gets the metadata from the currently loaded plugin. + * Currently this is nothing but the advertised name of the plugin + */ void readMetaDataFromPlugin(); + // The QT object to actually load the plugins QPluginLoader *m_PluginLoader; + QJsonObject m_MetaData; + + //nomen est omen + bool m_isPluginLoaded; + + // List of all available plugins + QStringList m_PluginList; + + //Name of the currently loaded plugin + QString m_currentPluginName; + + // Entire ListModel of the metadata (actually containing all metadata, not only name) + QStringListModel* m_PluginListModel; }; #endif // PLUGINLOADER_H \ No newline at end of file