6#include <imod/CSingleModelObserverBase.h>
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>
16#include <imtbase/TPluginManager.h>
17#include <imtbase/IPluginStatusMonitor.h>
24template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass = ilog::CLoggerComponentBase>
25class TPluginManagerCompBase:
public BaseComponentClass,
public TPluginManager<PluginInterface, CreateFunction, DestroyFunction>
28 typedef BaseComponentClass BaseClass;
29 typedef TPluginManager<PluginInterface, CreateFunction, DestroyFunction> BaseClass2;
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,
"");
42 TPluginManagerCompBase(
const QByteArray& createMethodName,
const QByteArray& destroyMethodName);
45 virtual void SetLogPtr(ilog::IMessageConsumer* logPtr)
override;
46 virtual ilog::IMessageConsumer* GetLogPtr()
const override;
49 virtual void LoadPlugins();
54 virtual void OnPluginsCreated();
57 virtual void OnComponentCreated()
override;
58 virtual void OnComponentDestroyed()
override;
61 class SettingsObserver:
public imod::CSingleModelObserverBase
64 SettingsObserver(TPluginManagerCompBase& parent);
68 virtual void OnUpdate(
const istd::IChangeable::ChangeSet& changeSet)
override;
71 TPluginManagerCompBase& m_parent;
75 I_REF(iprm::IParamsSet, m_settingsCompPtr);
76 I_REF(imod::IModel, m_settingsModelCompPtr);
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);
84 QByteArray m_createMethodName;
85 QByteArray m_destroyMethodName;
87 SettingsObserver m_settingsObserver;
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)
103template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass>
104void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::SetLogPtr(ilog::IMessageConsumer* logPtr)
106 BaseClass::SetLogPtr(logPtr);
107 BaseClass2::SetLogPtr(logPtr);
111template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass>
112ilog::IMessageConsumer* TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::GetLogPtr()
const
114 return BaseClass::GetLogPtr();
120template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass>
121void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::LoadPlugins()
123 if (m_settingsCompPtr.IsValid()){
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);
133 iprm::TParamsPtr<iprm::IParamsManager> pluginPathManagerPtr(m_settingsCompPtr.GetPtr(), *m_pluginPathsManagerIdAttrPtr);
134 if (pluginPathManagerPtr.IsValid()){
135 const iprm::IOptionsList* paramListPtr = pluginPathManagerPtr->GetSelectionConstraints();
137 int pluginPathsCount = pluginPathManagerPtr->GetParamsSetsCount();
138 for (
int pluginPathIndex = 0; pluginPathIndex < pluginPathsCount; ++pluginPathIndex){
140 bool isEnabled =
true;
141 if (paramListPtr !=
nullptr){
142 isEnabled = paramListPtr->IsOptionEnabled(pluginPathIndex);
146 iprm::TParamsPtr<ifile::IFileNameParam> pluginPathParamPtr(pluginPathManagerPtr->GetParamsSet(pluginPathIndex), *m_pluginPathIdAttrPtr);
147 if (pluginPathParamPtr.IsValid()){
148 QString pluginsDirectoryPath = pluginPathParamPtr->GetPath();
150 BaseClass2::LoadPluginDirectory(pluginsDirectoryPath, *m_pluginExtensionAttrPtr, *m_pluginTypeIdAttrPtr);
161template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass>
162inline void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::OnPluginsCreated()
169template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass>
170void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::OnComponentCreated()
172 BaseClass::OnComponentCreated();
174 BaseClass2::SetStatusManager(m_pluginStatusMonitorCompPtr.GetPtr());
176 if (m_settingsModelCompPtr.IsValid()){
177 m_settingsModelCompPtr->AttachObserver(&m_settingsObserver);
182template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass>
183void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::OnComponentDestroyed()
185 m_settingsObserver.EnsureModelDetached();
187 for (
auto iter = this->m_plugins.begin(); iter != this->m_plugins.end(); ++iter){
188 iter->destroyFunc(iter->pluginPtr);
191 this->m_plugins.clear();
193 BaseClass::OnComponentDestroyed();
199template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass>
200TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::SettingsObserver::SettingsObserver(TPluginManagerCompBase& parent)
210template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction,
typename BaseComponentClass>
211void TPluginManagerCompBase<PluginInterface, CreateFunction, DestroyFunction, BaseComponentClass>::SettingsObserver::OnUpdate(
const istd::IChangeable::ChangeSet& )
213 m_parent.LoadPlugins();