ImagingTools Core SDK
TPluginManagerCompBase.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// ACF includes
6#include <imod/CSingleModelObserverBase.h>
7
8#include <ifile/IFileNameParam.h>
9#include <imod/IModel.h>
10#include <iprm/IOptionsList.h>
11#include <iprm/IParamsManager.h>
12#include <iprm/TParamsPtr.h>
13#include <ilog/TLoggerCompWrap.h>
14
15// ImtCore includes
16#include <imtbase/TPluginManager.h>
17#include <imtbase/IPluginStatusMonitor.h>
18
19
20namespace imtbase
21{
22
23
24template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass = ilog::CLoggerComponentBase>
25class TPluginManagerCompBase: public BaseComponentClass, public TPluginManager<PluginInterface, CreateFunction, DestroyFunction>
26{
27public:
28 typedef BaseComponentClass BaseClass;
29 typedef TPluginManager<PluginInterface, CreateFunction, DestroyFunction> BaseClass2;
30
31 I_BEGIN_BASE_COMPONENT(TPluginManagerCompBase);
32 I_ASSIGN(m_settingsCompPtr, "Settings", "Plugin settings", true, "Settings");
33 I_ASSIGN_TO(m_settingsModelCompPtr, m_settingsCompPtr, true);
34 I_ASSIGN(m_pluginStatusMonitorCompPtr, "PluginStatusMonitor", "Plugin status monitor", false, "PluginStatusMonitor");
35 I_ASSIGN(m_pluginPathsManagerIdAttrPtr, "PluginPathsManagerId", "ID of the plugin path manager parameter in the application settings", true, "PluginPathsManager");
36 I_ASSIGN(m_pluginPathIdAttrPtr, "PluginPathId", "ID of the plugin path parameter in the parameter set", true, "PluginPath");
37 I_ASSIGN(m_defaultPluginPathIdAttrPtr, "DefaultPluginPathId", "ID of the default plug-in path parameter in the settings", true, "DefaultPluginPath");
38 I_ASSIGN(m_pluginExtensionAttrPtr, "PluginFileExtension", "File extension for the plugin DLL", true, "dll");
39 I_ASSIGN(m_pluginTypeIdAttrPtr, "PluginTypeId", "Type-ID of supported plugins", true, "");
40 I_END_COMPONENT;
41
42 TPluginManagerCompBase(const QByteArray& createMethodName, const QByteArray& destroyMethodName);
43
44 // reimplemented (ilog::ILoggable)
45 virtual void SetLogPtr(ilog::IMessageConsumer* logPtr) override;
46 virtual ilog::IMessageConsumer* GetLogPtr() const override;
47
48protected:
49 virtual void LoadPlugins();
50
54 virtual void OnPluginsCreated();
55
56 // reimplemented (icomp::CComponentBase)
57 virtual void OnComponentCreated() override;
58 virtual void OnComponentDestroyed() override;
59
60protected:
61 class SettingsObserver: public imod::CSingleModelObserverBase
62 {
63 public:
64 SettingsObserver(TPluginManagerCompBase& parent);
65
66 protected:
67 // reimplemented (imod::CSingleModelObserverBase)
68 virtual void OnUpdate(const istd::IChangeable::ChangeSet& changeSet) override;
69
70 private:
71 TPluginManagerCompBase& m_parent;
72 };
73
74private:
75 I_REF(iprm::IParamsSet, m_settingsCompPtr);
76 I_REF(imod::IModel, m_settingsModelCompPtr);
77 I_REF(imtbase::IPluginStatusMonitor, m_pluginStatusMonitorCompPtr);
78 I_ATTR(QByteArray, m_pluginPathsManagerIdAttrPtr);
79 I_ATTR(QByteArray, m_pluginPathIdAttrPtr);
80 I_ATTR(QByteArray, m_defaultPluginPathIdAttrPtr);
81 I_ATTR(QByteArray, m_pluginExtensionAttrPtr);
82 I_ATTR(QByteArray, m_pluginTypeIdAttrPtr);
83
84 QByteArray m_createMethodName;
85 QByteArray m_destroyMethodName;
86
87 SettingsObserver m_settingsObserver;
88};
89
90
91// public methods
92
93template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
94TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::TPluginManagerCompBase(const QByteArray& createMethodName, const QByteArray& destroyMethodName)
95 :BaseClass2(createMethodName, destroyMethodName, nullptr),
96 m_settingsObserver(*this)
97{
98}
99
100
101// reimplemented (ilog::ILoggable)
102
103template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
104void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::SetLogPtr(ilog::IMessageConsumer* logPtr)
105{
106 BaseClass::SetLogPtr(logPtr);
107 BaseClass2::SetLogPtr(logPtr);
108}
109
110
111template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
112ilog::IMessageConsumer* TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::GetLogPtr() const
113{
114 return BaseClass::GetLogPtr();
115}
116
117
118// protected methods
119
120template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
121void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::LoadPlugins()
122{
123 if (m_settingsCompPtr.IsValid()){
124 // Load default plug-in directory:
125 iprm::TParamsPtr<ifile::IFileNameParam> defaultPluginPathParamPtr(m_settingsCompPtr.GetPtr(), *m_defaultPluginPathIdAttrPtr);
126 if (defaultPluginPathParamPtr.IsValid()){
127 QString defaultPluginFolderPath = defaultPluginPathParamPtr->GetPath();
128 if (QFileInfo(defaultPluginFolderPath).exists()){
129 BaseClass2::LoadPluginDirectory(defaultPluginFolderPath, *m_pluginExtensionAttrPtr, *m_pluginTypeIdAttrPtr);
130 }
131 }
132
133 iprm::TParamsPtr<iprm::IParamsManager> pluginPathManagerPtr(m_settingsCompPtr.GetPtr(), *m_pluginPathsManagerIdAttrPtr);
134 if (pluginPathManagerPtr.IsValid()){
135 const iprm::IOptionsList* paramListPtr = pluginPathManagerPtr->GetSelectionConstraints();
136
137 int pluginPathsCount = pluginPathManagerPtr->GetParamsSetsCount();
138 for (int pluginPathIndex = 0; pluginPathIndex < pluginPathsCount; ++pluginPathIndex){
139
140 bool isEnabled = true;
141 if (paramListPtr != nullptr){
142 isEnabled = paramListPtr->IsOptionEnabled(pluginPathIndex);
143 }
144
145 if (isEnabled){
146 iprm::TParamsPtr<ifile::IFileNameParam> pluginPathParamPtr(pluginPathManagerPtr->GetParamsSet(pluginPathIndex), *m_pluginPathIdAttrPtr);
147 if (pluginPathParamPtr.IsValid()){
148 QString pluginsDirectoryPath = pluginPathParamPtr->GetPath();
149
150 BaseClass2::LoadPluginDirectory(pluginsDirectoryPath, *m_pluginExtensionAttrPtr, *m_pluginTypeIdAttrPtr);
151 }
152 }
153 }
154 }
155 }
156
157 OnPluginsCreated();
158}
159
160
161template<class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
162inline void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::OnPluginsCreated()
163{
164}
165
166
167// reimplemented (icomp::CComponentBase)
168
169template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
170void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::OnComponentCreated()
171{
172 BaseClass::OnComponentCreated();
173
174 BaseClass2::SetStatusManager(m_pluginStatusMonitorCompPtr.GetPtr());
175
176 if (m_settingsModelCompPtr.IsValid()){
177 m_settingsModelCompPtr->AttachObserver(&m_settingsObserver);
178 }
179}
180
181
182template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
183void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::OnComponentDestroyed()
184{
185 m_settingsObserver.EnsureModelDetached();
186
187 for (auto iter = this->m_plugins.begin(); iter != this->m_plugins.end(); ++iter){
188 iter->destroyFunc(iter->pluginPtr);
189 }
190
191 this->m_plugins.clear();
192
193 BaseClass::OnComponentDestroyed();
194}
195
196
197// public methods of the embedded class SettingsObserver
198
199template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
200TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::SettingsObserver::SettingsObserver(TPluginManagerCompBase& parent)
201 :m_parent(parent)
202{
203}
204
205
206// protected methods
207
208// reimplemented (imod::CSingleModelObserverBase)
209
210template <class PluginInterface, typename CreateFunction, typename DestroyFunction, typename BaseComponentClass>
211void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::SettingsObserver::OnUpdate(const istd::IChangeable::ChangeSet& /*changeSet*/)
212{
213 m_parent.LoadPlugins();
214}
215
216
217} // namespace imtbase
218
219