@@ -3,10 +3,63 | |||
|
3 | 3 | #include <Plugin/IPlugin.h> |
|
4 | 4 | |
|
5 | 5 | #include <QDir> |
|
6 | #include <QLibrary> | |
|
7 | #include <QPluginLoader> | |
|
6 | 8 | |
|
7 | 9 | Q_LOGGING_CATEGORY(LOG_PluginManager, "PluginManager") |
|
8 | 10 | |
|
11 | namespace { | |
|
12 | ||
|
13 | /// Key for retrieving metadata of the plugin | |
|
14 | const auto PLUGIN_METADATA_KEY = QStringLiteral("MetaData"); | |
|
15 | ||
|
16 | /// Key for retrieving the name of the plugin in its metadata | |
|
17 | const auto PLUGIN_NAME_KEY = QStringLiteral("name"); | |
|
18 | ||
|
19 | } // namespace | |
|
20 | ||
|
9 | 21 | struct PluginManager::PluginManagerPrivate { |
|
22 | /** | |
|
23 | * Loads a single plugin into SciQlop. The method has no effect if the plugin is malformed (e.g. | |
|
24 | * wrong library type, missing metadata, etc.) | |
|
25 | * @param pluginPath the path to the plugin library. | |
|
26 | */ | |
|
27 | void loadPlugin(const QString &pluginPath) | |
|
28 | { | |
|
29 | qCDebug(LOG_PluginManager()) | |
|
30 | << QObject::tr("Attempting to load file '%1' as a plugin").arg(pluginPath); | |
|
31 | ||
|
32 | if (QLibrary::isLibrary(pluginPath)) { | |
|
33 | QPluginLoader pluginLoader{pluginPath}; | |
|
34 | ||
|
35 | // Retrieving the plugin name to check if it can be loaded (i.e. no plugin with the same | |
|
36 | // name has been registered yet) | |
|
37 | auto metadata = pluginLoader.metaData().value(PLUGIN_METADATA_KEY).toObject(); | |
|
38 | auto pluginName = metadata.value(PLUGIN_NAME_KEY).toString(); | |
|
39 | ||
|
40 | if (pluginName.isEmpty()) { | |
|
41 | /// @todo ALX : log error | |
|
42 | } | |
|
43 | else if (m_RegisteredPlugins.contains(pluginName)) { | |
|
44 | /// @todo ALX : log error | |
|
45 | } | |
|
46 | else { | |
|
47 | if (auto pluginInstance = qobject_cast<IPlugin *>(pluginLoader.instance())) { | |
|
48 | pluginInstance->initialize(); | |
|
49 | m_RegisteredPlugins.insert(pluginName, pluginPath); | |
|
50 | } | |
|
51 | else { | |
|
52 | /// @todo ALX : log error | |
|
53 | } | |
|
54 | } | |
|
55 | } | |
|
56 | else { | |
|
57 | /// @todo ALX : log error | |
|
58 | } | |
|
59 | } | |
|
60 | ||
|
61 | /// Registered plugins (key: plugin name, value: plugin path) | |
|
62 | QHash<QString, QString> m_RegisteredPlugins; | |
|
10 | 63 | }; |
|
11 | 64 | |
|
12 | 65 | PluginManager::PluginManager() : impl{spimpl::make_unique_impl<PluginManagerPrivate>()} |
@@ -18,7 +71,7 void PluginManager::loadPlugins(const QDir &pluginDir) | |||
|
18 | 71 | // Load plugins |
|
19 | 72 | auto pluginInfoList = pluginDir.entryInfoList(QDir::Files, QDir::Name); |
|
20 | 73 | for (auto pluginInfo : qAsConst(pluginInfoList)) { |
|
21 | /// @todo ALX | |
|
74 | impl->loadPlugin(pluginInfo.absoluteFilePath()); | |
|
22 | 75 | } |
|
23 | 76 | } |
|
24 | 77 |
General Comments 0
You need to be logged in to leave comments.
Login now