##// END OF EJS Templates
Reads variable's metadata to retrieve the type of data series (scalar, vector, spectrogram)
Reads variable's metadata to retrieve the type of data series (scalar, vector, spectrogram)

File last commit:

r1159:4c27015bd9c6
r1250:23206e07bbc2
Show More
PluginManager.cpp
137 lines | 4.1 KiB | text/x-c | CppLexer
/ core / src / Plugin / PluginManager.cpp
Alexandre Leroux
Initializes plugin manager...
r66 #include <Plugin/PluginManager.h>
#include <Plugin/IPlugin.h>
#include <QDir>
Alexandre Leroux
Implements plugin loading method
r67 #include <QLibrary>
#include <QPluginLoader>
Alexandre Leroux
Initializes plugin manager...
r66
Q_LOGGING_CATEGORY(LOG_PluginManager, "PluginManager")
Alexandre Leroux
Implements plugin loading method
r67 namespace {
/// Key for retrieving metadata of the plugin
const auto PLUGIN_METADATA_KEY = QStringLiteral("MetaData");
/// Key for retrieving the name of the plugin in its metadata
const auto PLUGIN_NAME_KEY = QStringLiteral("name");
Alexandre Leroux
Adds logs in plugin loading method
r68 /// Helper to state the plugin loading operation
struct LoadPluginState {
explicit LoadPluginState(const QString &pluginPath)
: m_PluginPath{pluginPath}, m_Valid{true}, m_ErrorMessage{}
{
}
void log() const
{
if (m_Valid) {
qCDebug(LOG_PluginManager())
<< QObject::tr("File '%1' has been loaded as a plugin").arg(m_PluginPath);
}
else {
qCWarning(LOG_PluginManager())
<< QObject::tr("File '%1' can't be loaded as a plugin: %2")
.arg(m_PluginPath)
.arg(m_ErrorMessage);
}
}
void setError(const QString &errorMessage)
{
m_Valid = false;
m_ErrorMessage = errorMessage;
}
QString m_PluginPath;
bool m_Valid;
QString m_ErrorMessage;
};
Alexandre Leroux
Implements plugin loading method
r67 } // namespace
Alexandre Leroux
Initializes plugin manager...
r66 struct PluginManager::PluginManagerPrivate {
Alexandre Leroux
Implements plugin loading method
r67 /**
* Loads a single plugin into SciQlop. The method has no effect if the plugin is malformed (e.g.
* wrong library type, missing metadata, etc.)
* @param pluginPath the path to the plugin library.
*/
void loadPlugin(const QString &pluginPath)
{
qCDebug(LOG_PluginManager())
<< QObject::tr("Attempting to load file '%1' as a plugin").arg(pluginPath);
Alexandre Leroux
Adds logs in plugin loading method
r68 LoadPluginState loadState{pluginPath};
Alexandre Leroux
Implements plugin loading method
r67 if (QLibrary::isLibrary(pluginPath)) {
QPluginLoader pluginLoader{pluginPath};
// Retrieving the plugin name to check if it can be loaded (i.e. no plugin with the same
// name has been registered yet)
auto metadata = pluginLoader.metaData().value(PLUGIN_METADATA_KEY).toObject();
auto pluginName = metadata.value(PLUGIN_NAME_KEY).toString();
if (pluginName.isEmpty()) {
Alexandre Leroux
Adds logs in plugin loading method
r68 loadState.setError(QObject::tr("empty file name"));
Alexandre Leroux
Implements plugin loading method
r67 }
else if (m_RegisteredPlugins.contains(pluginName)) {
Alexandre Leroux
Adds logs in plugin loading method
r68 loadState.setError(QObject::tr("name '%1' already registered").arg(pluginName));
Alexandre Leroux
Implements plugin loading method
r67 }
else {
if (auto pluginInstance = qobject_cast<IPlugin *>(pluginLoader.instance())) {
pluginInstance->initialize();
m_RegisteredPlugins.insert(pluginName, pluginPath);
}
else {
Alexandre Leroux
Adds logs in plugin loading method
r68 loadState.setError(QObject::tr("the file is not a Sciqlop plugin"));
Alexandre Leroux
Implements plugin loading method
r67 }
}
}
else {
Alexandre Leroux
Adds logs in plugin loading method
r68 loadState.setError(QObject::tr("the file is not a library"));
Alexandre Leroux
Implements plugin loading method
r67 }
Alexandre Leroux
Adds logs in plugin loading method
r68
// Log loading result
loadState.log();
Alexandre Leroux
Implements plugin loading method
r67 }
Added static plugin support...
r1123 void loadStaticPlugins()
{
Add Catalogue methods
r1159 for (QObject *plugin : QPluginLoader::staticInstances()) {
Added static plugin support...
r1123 qobject_cast<IPlugin *>(plugin)->initialize();
m_RegisteredPlugins.insert(plugin->metaObject()->className(), "StaticPlugin");
}
}
Alexandre Leroux
Implements plugin loading method
r67 /// Registered plugins (key: plugin name, value: plugin path)
QHash<QString, QString> m_RegisteredPlugins;
Alexandre Leroux
Initializes plugin manager...
r66 };
PluginManager::PluginManager() : impl{spimpl::make_unique_impl<PluginManagerPrivate>()}
{
}
void PluginManager::loadPlugins(const QDir &pluginDir)
{
// Load plugins
Some minor improvements on plugin loading:...
r652 auto pluginInfoList
= pluginDir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
for (auto entryInfo : qAsConst(pluginInfoList)) {
Alexandre Leroux
Adds {} to if blocks
r664 if (entryInfo.isDir()) {
Some minor improvements on plugin loading:...
r652 this->loadPlugins(QDir{entryInfo.absoluteFilePath()});
Alexandre Leroux
Adds {} to if blocks
r664 }
else if (QLibrary::isLibrary(entryInfo.absoluteFilePath())) {
impl->loadPlugin(entryInfo.absoluteFilePath());
Some minor improvements on plugin loading:...
r652 }
Alexandre Leroux
Initializes plugin manager...
r66 }
}
Added static plugin support...
r1123 void PluginManager::loadStaticPlugins()
{
impl->loadStaticPlugins();
}
Alexandre Leroux
Initializes plugin manager...
r66 int PluginManager::nbPluginsLoaded() const noexcept
{
Alexandre Leroux
Implements method to get the number of plugins loaded
r69 return impl->m_RegisteredPlugins.size();
Alexandre Leroux
Initializes plugin manager...
r66 }