6#include <QtCore/QLibrary>
15#include <istd/TDelPtr.h>
16#include <ilog/CLoggerBase.h>
19#include <imtbase/IPluginStatusMonitor.h>
26template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
27class TPluginManager:
virtual public ilog::ILoggable
30 TPluginManager() : m_pluginStatusMonitorPtr(nullptr)
34 TPluginManager(
const QByteArray& createMethodName,
const QByteArray& destroyMethodName, IPluginStatusMonitor* pluginStatusMonitorPtr);
36 virtual bool LoadPluginDirectory(
37 const QString& pluginDirectoryPath,
38 const QByteArray& pluginExtension,
39 const QByteArray& pluginTypeId);
42 virtual void SetLogPtr(ilog::IMessageConsumer* logPtr)
override;
43 virtual ilog::IMessageConsumer* GetLogPtr()
const override;
53 PluginInterface* pluginPtr;
55 DestroyFunction destroyFunc;
58 typedef QList<PluginInfo> Plugins;
62 void SetStatusManager(IPluginStatusMonitor* pluginStatusMonitorPtr);
69 virtual bool InitializePlugin(PluginInterface* pluginPtr);
72 class Logger :
public ilog::CLoggerBase
75 typedef ilog::CLoggerBase BaseClass;
79 const QString& message,
80 const QString& messageSource = QString(),
82 bool SendWarningMessage(
84 const QString& message,
85 const QString& messageSource = QString(),
87 bool SendErrorMessage(
89 const QString& message,
90 const QString& messageSource = QString(),
92 bool SendCriticalMessage(
94 const QString& message,
95 const QString& messageSource = QString(),
97 bool SendInfoMessageOnce(
99 const QString& message,
100 const QString& messageSource = QString(),
101 int flags = 0)
const;
102 bool SendWarningMessageOnce(
104 const QString& message,
105 const QString& messageSource = QString(),
106 int flags = 0)
const;
107 bool SendErrorMessageOnce(
109 const QString& message,
110 const QString& messageSource = QString(),
111 int flags = 0)
const;
112 bool SendCriticalMessageOnce(
114 const QString& message,
115 const QString& messageSource = QString(),
116 int flags = 0)
const;
120 QByteArray m_createMethodName;
121 QByteArray m_destroyMethodName;
122 IPluginStatusMonitor* m_pluginStatusMonitorPtr;
129template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
130TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::TPluginManager(
const QByteArray& createMethodName,
const QByteArray& destroyMethodName, IPluginStatusMonitor* pluginStatusMonitorPtr)
131 :m_createMethodName(createMethodName),
132 m_destroyMethodName(destroyMethodName),
133 m_pluginStatusMonitorPtr(pluginStatusMonitorPtr)
135 Q_ASSERT(!createMethodName.isEmpty());
136 Q_ASSERT(!destroyMethodName.isEmpty());
144template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
145inline void TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::SetLogPtr(ilog::IMessageConsumer* logPtr)
147 m_logger.SetLogPtr(logPtr);
151template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
152inline ilog::IMessageConsumer* TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::GetLogPtr()
const
154 return m_logger.GetLogPtr();
160template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
161void TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::SetStatusManager(IPluginStatusMonitor* pluginStatusMonitorPtr)
163 m_pluginStatusMonitorPtr = pluginStatusMonitorPtr;
167template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
168bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::LoadPluginDirectory(
169 const QString& pluginDirectoryPath,
170 const QByteArray& pluginExtension,
171 const QByteArray& pluginTypeId)
173 m_logger.SendInfoMessage(0, QString(
"Looking for the plug-ins in '%1'").arg(pluginDirectoryPath));
175 if (!pluginDirectoryPath.isEmpty() && QFileInfo(pluginDirectoryPath).exists()){
176 QDir pluginsDirectory(pluginDirectoryPath);
178 QFileInfoList pluginsList = pluginsDirectory.entryInfoList(QStringList() << (QString(
"*.") + pluginExtension));
180 for (
const QFileInfo& pluginPath : pluginsList){
182 std::wstring path = pluginPath.absolutePath().toStdWString();
183 SetDllDirectory(path.c_str());
185 m_logger.SendInfoMessage(0, QString(
"Load: '%1'").arg(pluginPath.canonicalFilePath()));
188 QByteArray instanceTypeId;
189 istd::IInformationProvider::InformationCategory category;
190 QString statusMessage;
192 QLibrary library(pluginPath.canonicalFilePath());
193 if (library.load() ==
true){
194 CreateFunction createPluginFunc = (CreateFunction)library.resolve(m_createMethodName);
195 if (createPluginFunc != NULL){
196 istd::TDelPtr<PluginInterface> pluginInstancePtr = createPluginFunc();
197 if (pluginInstancePtr.IsValid()){
198 pluginName = pluginInstancePtr->GetPluginName();
199 instanceTypeId = pluginInstancePtr->GetPluginTypeId();
201 if (instanceTypeId == pluginTypeId){
202 PluginInfo pluginInfo;
203 pluginInfo.pluginPath = pluginPath.canonicalFilePath();
204 pluginInfo.pluginPtr = pluginInstancePtr.PopPtr();
205 pluginInfo.destroyFunc = (DestroyFunction)library.resolve(m_destroyMethodName);
207 if (InitializePlugin(pluginInfo.pluginPtr)){
208 m_plugins.push_back(pluginInfo);
210 category = istd::IInformationProvider::IC_INFO;
211 statusMessage = QObject::tr(
"Plug-in loaded");
214 m_logger.SendInfoMessage(0, QString(
"Plug-in initialization failed for: '%1'").arg(pluginPath.canonicalFilePath()));
216 category = istd::IInformationProvider::IC_ERROR;
217 statusMessage = QObject::tr(
"Plug-in initialization failed");
221 category = istd::IInformationProvider::IC_WARNING;
222 statusMessage = QObject::tr(
"Plug-in unsupported type-ID");
226 category = istd::IInformationProvider::IC_ERROR;
227 statusMessage = QObject::tr(
"Plug-in instance creation failed");
230 if (m_pluginStatusMonitorPtr !=
nullptr){
231 m_pluginStatusMonitorPtr->OnPluginStatusChanged(
232 pluginPath.canonicalFilePath(),
240 m_logger.SendErrorMessage(0, QString(
"Plug-in entry point was not found: '%1'. %2").arg(pluginPath.canonicalFilePath()).arg(library.errorString()));
242 category = istd::IInformationProvider::IC_ERROR;
243 statusMessage = QObject::tr(
"Plug-in entry point was not found: '%1'").arg(library.errorString());
247 m_logger.SendErrorMessage(0, QString(
"%1").arg(library.errorString()));
249 category = istd::IInformationProvider::IC_ERROR;
250 statusMessage = QObject::tr(
"%1").arg(library.errorString());
261template <
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
262inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::InitializePlugin(PluginInterface * pluginPtr)
272template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
273inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::Logger::SendInfoMessage(
int id,
const QString& message,
const QString& messageSource,
int flags)
const
275 return BaseClass::SendInfoMessage(
id, message, messageSource, flags);
279template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
280inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::Logger::SendWarningMessage(
int id,
const QString& message,
const QString& messageSource,
int flags)
const
282 return BaseClass::SendWarningMessage(
id, message, messageSource, flags);
286template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
287inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::Logger::SendErrorMessage(
int id,
const QString& message,
const QString& messageSource,
int flags)
const
289 return BaseClass::SendErrorMessage(
id, message, messageSource, flags);
293template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
294inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::Logger::SendCriticalMessage(
int id,
const QString& message,
const QString& messageSource,
int flags)
const
296 return BaseClass::SendCriticalMessage(
id, message, messageSource, flags);
300template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
301inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::Logger::SendInfoMessageOnce(
int id,
const QString& message,
const QString& messageSource,
int flags)
const
303 return BaseClass::SendInfoMessageOnce(
id, message, messageSource, flags);
307template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
308inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::Logger::SendWarningMessageOnce(
int id,
const QString& message,
const QString& messageSource,
int flags)
const
310 return BaseClass::SendWarningMessageOnce(
id, message, messageSource, flags);
314template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
315inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::Logger::SendErrorMessageOnce(
int id,
const QString& message,
const QString& messageSource,
int flags)
const
317 return BaseClass::SendErrorMessageOnce(
id, message, messageSource, flags);
321template<
class PluginInterface,
typename CreateFunction,
typename DestroyFunction>
322inline bool TPluginManager<PluginInterface, CreateFunction, DestroyFunction>::Logger::SendCriticalMessageOnce(
int id,
const QString& message,
const QString& messageSource,
int flags)
const
324 return BaseClass::SendCriticalMessageOnce(
id, message, messageSource, flags);