3#include <QPluginLoader>
9#include <QLoggingCategory>
13#include "RabbitCommonDir.h"
14#include "RabbitCommonTools.h"
15#include "ParameterPluginUI.h"
16#include "ParameterRecordUI.h"
17#if defined(HAVE_QTERMWIDGET)
18#include "ParameterTerminalUI.h"
23static Q_LOGGING_CATEGORY(log,
"Manager")
34 m_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
35 "Plugin", RabbitCommon::CTools::TranslationType::Library);
38 m_szSettingsFile = szFile;
41 LoadSettings(m_szSettingsFile);
42 check = connect(m_pParameter, SIGNAL(sigNativeWindowRecieveKeyboard()),
43 this, SLOT(slotNativeWindowRecieveKeyboard()));
44 m_pHook = CHook::GetHook(m_pParameter,
this);
46 m_pHook->RegisterKeyboard();
48 qCritical(log) <<
"new CParameterPlugin() fail";
49 Q_ASSERT(m_pParameter);
57 qDebug(log) <<
"CManager::~CManager()";
59 qApp->removeEventFilter(
this);
62 m_pHook->UnRegisterKeyboard();
63 m_pHook->deleteLater();
68 m_pParameter->deleteLater();
69 m_pParameter =
nullptr;
73 RabbitCommon::CTools::Instance()->RemoveTranslator(m_Translator);
82int CManager::LoadPlugins()
85 foreach (QObject *plugin, QPluginLoader::staticInstances())
87 CPlugin* p = qobject_cast<CPlugin*>(plugin);
90 if(m_Plugins.find(p->
Id()) == m_Plugins.end())
92 qInfo(log) <<
"Success: Load plugin" << p->
Name();
96 qWarning(log) <<
"The plugin" << p->
Name() <<
" is exist.";
100 QString szPath = RabbitCommon::CDir::Instance()->GetDirPlugins();
103 if(filters.isEmpty())
105#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
106 filters <<
"*Plugin*.dll";
107#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
108 filters <<
"*Plugin*.dylib";
110 filters <<
"*Plugin*.so";
113 nRet = FindPlugins(szPath, filters);
114 if(!m_szDetails.isEmpty())
115 m_szDetails = tr(
"### Plugins") +
"\n" + m_szDetails;
117 qDebug(log) << (
"Client details:\n" + Details()).toStdString().c_str();
121int CManager::FindPlugins(QDir dir, QStringList filters)
125 QString szCurrentPath = QDir::currentPath();
126 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
132 QDir::setCurrent(QDir::cleanPath(dir.absolutePath()));
143 foreach (fileName, files) {
144 QString szPlugins = dir.absoluteFilePath(fileName);
145 QPluginLoader loader(szPlugins);
146 QObject *plugin = loader.instance();
148 CPlugin* p = qobject_cast<CPlugin*>(plugin);
151 if(m_Plugins.find(p->
Id()) == m_Plugins.end())
153 qInfo(log) <<
"Success: Load plugin"
154 << p->
Name() <<
"from" << szPlugins;
158 qWarning(log) <<
"The plugin [" << p->
Name() <<
"] is exist.";
162 szMsg =
"Error: Load plugin fail from " + szPlugins;
163 if(!loader.errorString().isEmpty())
164 szMsg +=
"; Error: " + loader.errorString();
165 qCritical(log) << szMsg.toStdString().c_str();
169 foreach (fileName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
170 QDir pluginDir = dir;
171 if(pluginDir.cd(fileName))
172 FindPlugins(pluginDir, filters);
175 QDir::setCurrent(szCurrentPath);
180int CManager::AppendPlugin(
CPlugin *p)
183 m_Plugins.insert(p->
Id(), p);
186 bool bRet = QMetaObject::invokeMethod(
189 Qt::DirectConnection,
190 Q_RETURN_ARG(
int, val));
193 qCritical(log) <<
"The plugin" << p->
Name()
194 <<
"initial translator fail" << bRet << val;
198 + tr(
"Version:") +
" " + p->
Version() +
" \n"
201 m_szDetails += p->
Details() +
"\n";
210 auto it = m_Plugins.find(
id);
211 if(m_Plugins.end() != it)
214 qDebug(log) <<
"CreateOperate id:" << id;
215 auto plugin = it.value();
218 bRet = QMetaObject::invokeMethod(
221 Qt::DirectConnection,
226 qCritical(log) <<
"Create COperate fail.";
237 qDebug(log) << Q_FUNC_INFO;
242 bool bRet = QMetaObject::invokeMethod(
245 Qt::DirectConnection,
246 Q_RETURN_ARG(
CPlugin*, pPlugin));
248 if(bRet && pPlugin) {
251 bRet = QMetaObject::invokeMethod(
254 Qt::DirectConnection,
255 Q_RETURN_ARG(
int, nRet),
259 qCritical(log) <<
"Call pPlugin->DeleteOperate(p) fail";
264 qCritical(log) <<
"Get CManager fail.";
271 if(szFile.isEmpty())
return nullptr;
273 QSettings set(szFile, QSettings::IniFormat);
274 m_FileVersion = set.value(
"Manage/FileVersion", m_FileVersion).toInt();
275 QString
id = set.value(
"Plugin/ID").toString();
276 QString protocol = set.value(
"Plugin/Protocol").toString();
277 QString name = set.value(
"Plugin/Name").toString();
278 qDebug(log) <<
"LoadOperate protocol:" << protocol
279 <<
"name:" << name <<
"id:" << id;
284 bool bRet = QMetaObject::invokeMethod(
287 Qt::DirectConnection,
288 Q_RETURN_ARG(
int, nRet),
289 Q_ARG(QString, szFile));
291 qCritical(log) <<
"Call pOperate->Load(szFile) fail.";
295 qCritical(log) <<
"Load parameter fail" << nRet;
299 pOperate->SetSettingsFile(szFile);
302 qCritical(log) <<
"Don't create Operate:" << protocol;
309 if(!pOperate)
return -1;
311 QString szFile = pOperate->GetSettingsFile();
313 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
318 QSettings set(szFile, QSettings::IniFormat);
321 bool bRet = QMetaObject::invokeMethod(
324 Qt::DirectConnection,
325 Q_RETURN_ARG(
CPlugin*, pPlugin));
326 if(!bRet || !pPlugin)
328 qCritical(log) <<
"Get plugin client fail";
332 set.setValue(
"Manage/FileVersion", m_FileVersion);
333 set.setValue(
"Plugin/ID", pPlugin->
Id());
334 set.setValue(
"Plugin/Protocol", pPlugin->
Protocol());
335 set.setValue(
"Plugin/Name", pPlugin->
Name());
338 bRet = QMetaObject::invokeMethod(
341 Qt::DirectConnection,
342 Q_RETURN_ARG(
int, nRet),
343 Q_ARG(QString, szFile));
345 qCritical(log) <<
"Call pOperate->Save(szFile) fail.";
349 qCritical(log) <<
"Save parameter fail" << nRet;
358 qCritical(log) <<
"The m_pParameter is nullptr";
359 Q_ASSERT_X(m_pParameter,
"CManager",
"The m_pParameter is nullptr");
365 s = m_szSettingsFile;
366 return m_pParameter->
Load(s);
372 qCritical(log) <<
"The m_pParameter is nullptr";
373 Q_ASSERT_X(m_pParameter,
"CManager",
"The m_pParameter is nullptr");
379 s = m_szSettingsFile;
380 return m_pParameter->
Save(s);
385 QList<QWidget*> lstWidget;
390 lstWidget.push_back(pClient);
392#if defined(HAVE_QTERMWIDGET)
396 pTermina->setWindowTitle(tr(
"Terminal"));
397 lstWidget.push_back(pTermina);
402 pRecord->SetParameter(&m_pParameter->m_Record);
403 lstWidget.push_back(pRecord);
412 QMap<QString, CPlugin*>::iterator it;
413 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
415 nRet = handle->
onProcess(it.key(), it.value());
426 QMap<QString, CPlugin*>::iterator it;
427 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
429 nRet = cb(it.key(), it.value());
437const QString CManager::Details()
const
442void CManager::slotNativeWindowRecieveKeyboard()
444 Q_ASSERT(m_pParameter);
445 if(m_pParameter->GetNativeWindowReceiveKeyboard()) {
447 m_pHook->UnRegisterKeyboard();
448 m_pHook->deleteLater();
453 m_pHook = CHook::GetHook(m_pParameter,
this);
455 m_pHook->RegisterKeyboard();
static int RemoveTranslation()
Remove translation.
static int InitTranslation()
Initial translation.
The Handle COperate class.
virtual int onProcess(const QString &id, CPlugin *pPlugin)=0
Process plugins.
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
Get parameter settings widget.
virtual int EnumPlugins(Handle *handle)
Enum plugins.
virtual COperate * CreateOperate(const QString &id)
New COperate pointer, the owner is caller.
virtual COperate * LoadOperate(const QString &szFile)
New COperate pointer from file, the owner is caller.
virtual int DeleteOperate(COperate *p)
Delete COperate.
virtual int SaveOperate(COperate *pOperate)
Accept Operate parameters to file.
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
virtual int LoadSettings(const QString szFile=QString())
Load Client parameters from file.
virtual const QString Id()
Identity.
virtual int SetParameter(CParameter *pParameter) override
[override functions]
Global parameters of plugins.
virtual int SetParameter(CParameter *pParameter) override
[override functions]
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.
virtual int Load(QString szFile=QString())
Load from file.
virtual const QString Version() const =0
Version.
virtual const QString Details() const
Display more information in About dialog or log.
virtual const QString Id()
ID. Default: Type() + ":" + Protocol() + ":" + Name()
virtual const QString Name() const =0
This name must be the same as the project name (${PROJECT_NAME}). The translation file (${PROJECT_NAM...
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Protocol() const =0
Plugin Protocol.
virtual const QString Description() const =0
Plugin description.