##// END OF EJS Templates
Adds logs in plugin loading method
Alexandre Leroux -
r68:b0fc434fbc92
parent child
Show More
@@ -1,82 +1,119
1 1 #include <Plugin/PluginManager.h>
2 2
3 3 #include <Plugin/IPlugin.h>
4 4
5 5 #include <QDir>
6 6 #include <QLibrary>
7 7 #include <QPluginLoader>
8 8
9 9 Q_LOGGING_CATEGORY(LOG_PluginManager, "PluginManager")
10 10
11 11 namespace {
12 12
13 13 /// Key for retrieving metadata of the plugin
14 14 const auto PLUGIN_METADATA_KEY = QStringLiteral("MetaData");
15 15
16 16 /// Key for retrieving the name of the plugin in its metadata
17 17 const auto PLUGIN_NAME_KEY = QStringLiteral("name");
18 18
19 /// Helper to state the plugin loading operation
20 struct LoadPluginState {
21 explicit LoadPluginState(const QString &pluginPath)
22 : m_PluginPath{pluginPath}, m_Valid{true}, m_ErrorMessage{}
23 {
24 }
25
26 void log() const
27 {
28 if (m_Valid) {
29 qCDebug(LOG_PluginManager())
30 << QObject::tr("File '%1' has been loaded as a plugin").arg(m_PluginPath);
31 }
32 else {
33 qCWarning(LOG_PluginManager())
34 << QObject::tr("File '%1' can't be loaded as a plugin: %2")
35 .arg(m_PluginPath)
36 .arg(m_ErrorMessage);
37 }
38 }
39
40 void setError(const QString &errorMessage)
41 {
42 m_Valid = false;
43 m_ErrorMessage = errorMessage;
44 }
45
46 QString m_PluginPath;
47 bool m_Valid;
48 QString m_ErrorMessage;
49 };
50
19 51 } // namespace
20 52
21 53 struct PluginManager::PluginManagerPrivate {
22 54 /**
23 55 * Loads a single plugin into SciQlop. The method has no effect if the plugin is malformed (e.g.
24 56 * wrong library type, missing metadata, etc.)
25 57 * @param pluginPath the path to the plugin library.
26 58 */
27 59 void loadPlugin(const QString &pluginPath)
28 60 {
29 61 qCDebug(LOG_PluginManager())
30 62 << QObject::tr("Attempting to load file '%1' as a plugin").arg(pluginPath);
31 63
64 LoadPluginState loadState{pluginPath};
65
32 66 if (QLibrary::isLibrary(pluginPath)) {
33 67 QPluginLoader pluginLoader{pluginPath};
34 68
35 69 // Retrieving the plugin name to check if it can be loaded (i.e. no plugin with the same
36 70 // name has been registered yet)
37 71 auto metadata = pluginLoader.metaData().value(PLUGIN_METADATA_KEY).toObject();
38 72 auto pluginName = metadata.value(PLUGIN_NAME_KEY).toString();
39 73
40 74 if (pluginName.isEmpty()) {
41 /// @todo ALX : log error
75 loadState.setError(QObject::tr("empty file name"));
42 76 }
43 77 else if (m_RegisteredPlugins.contains(pluginName)) {
44 /// @todo ALX : log error
78 loadState.setError(QObject::tr("name '%1' already registered").arg(pluginName));
45 79 }
46 80 else {
47 81 if (auto pluginInstance = qobject_cast<IPlugin *>(pluginLoader.instance())) {
48 82 pluginInstance->initialize();
49 83 m_RegisteredPlugins.insert(pluginName, pluginPath);
50 84 }
51 85 else {
52 /// @todo ALX : log error
86 loadState.setError(QObject::tr("the file is not a Sciqlop plugin"));
53 87 }
54 88 }
55 89 }
56 90 else {
57 /// @todo ALX : log error
91 loadState.setError(QObject::tr("the file is not a library"));
58 92 }
93
94 // Log loading result
95 loadState.log();
59 96 }
60 97
61 98 /// Registered plugins (key: plugin name, value: plugin path)
62 99 QHash<QString, QString> m_RegisteredPlugins;
63 100 };
64 101
65 102 PluginManager::PluginManager() : impl{spimpl::make_unique_impl<PluginManagerPrivate>()}
66 103 {
67 104 }
68 105
69 106 void PluginManager::loadPlugins(const QDir &pluginDir)
70 107 {
71 108 // Load plugins
72 109 auto pluginInfoList = pluginDir.entryInfoList(QDir::Files, QDir::Name);
73 110 for (auto pluginInfo : qAsConst(pluginInfoList)) {
74 111 impl->loadPlugin(pluginInfo.absoluteFilePath());
75 112 }
76 113 }
77 114
78 115 int PluginManager::nbPluginsLoaded() const noexcept
79 116 {
80 117 /// @todo ALX
81 118 return 0;
82 119 }
General Comments 5
Under Review
author

Pull request updated. Auto status change to "Under Review"

Changed commits:
  * 1 added
  * 0 removed

Changed files:
  * M core/CMakeLists.txt
Approved
author

Status change > Approved

You need to be logged in to leave comments. Login now