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"
19 #include "OperateTerminal.h"
22 #include "ChannelSSH.h"
32static Q_LOGGING_CATEGORY(log,
"Manager")
43 m_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
44 "Plugin", RabbitCommon::CTools::TranslationType::Library);
47 m_szSettingsFile = szFile;
50 LoadSettings(m_szSettingsFile);
51 check = connect(m_pParameter, SIGNAL(sigNativeWindowRecieveKeyboard()),
52 this, SLOT(slotNativeWindowRecieveKeyboard()));
53 m_pHook = CHook::GetHook(m_pParameter,
this);
55 m_pHook->RegisterKeyboard();
57 qCritical(log) <<
"new CParameterPlugin() fail";
58 Q_ASSERT(m_pParameter);
66 qDebug(log) <<
"CManager::~CManager()";
68 qApp->removeEventFilter(
this);
71 m_pHook->UnRegisterKeyboard();
72 m_pHook->deleteLater();
77 m_pParameter->deleteLater();
78 m_pParameter =
nullptr;
82 RabbitCommon::CTools::Instance()->RemoveTranslator(m_Translator);
91int CManager::LoadPlugins()
94 foreach (QObject *plugin, QPluginLoader::staticInstances())
96 CPlugin* p = qobject_cast<CPlugin*>(plugin);
99 if(m_Plugins.find(p->
Id()) == m_Plugins.end())
101 qInfo(log) <<
"Success: Load plugin" << p->
Name();
105 qWarning(log) <<
"The plugin" << p->
Name() <<
" is exist.";
109 QString szPath = RabbitCommon::CDir::Instance()->GetDirPlugins();
112 if(filters.isEmpty())
114#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
115 filters <<
"*Plugin*.dll";
116#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
117 filters <<
"*Plugin*.dylib";
119 filters <<
"*Plugin*.so";
122 nRet = FindPlugins(szPath, filters);
123 if(!m_szDetails.isEmpty())
124 m_szDetails =
"#### " + tr(
"Plugins") +
"\n" + m_szDetails;
126 qDebug(log) << (
"Client details:\n" + Details()).toStdString().c_str();
130int CManager::FindPlugins(QDir dir, QStringList filters)
134 QString szCurrentPath = QDir::currentPath();
135 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
141 QDir::setCurrent(QDir::cleanPath(dir.absolutePath()));
152 foreach (fileName, files) {
153 QString szPlugins = dir.absoluteFilePath(fileName);
154 QPluginLoader loader(szPlugins);
155 QObject *plugin = loader.instance();
157 CPlugin* p = qobject_cast<CPlugin*>(plugin);
160 if(m_Plugins.find(p->
Id()) == m_Plugins.end())
162 qInfo(log) <<
"Success: Load plugin"
163 << p->
Name() <<
"from" << szPlugins;
167 qWarning(log) <<
"The plugin [" << p->
Name() <<
"] is exist.";
171 szMsg =
"Error: Load plugin fail from " + szPlugins;
172 if(!loader.errorString().isEmpty())
173 szMsg +=
"; Error: " + loader.errorString();
174 qCritical(log) << szMsg.toStdString().c_str();
178 foreach (fileName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
179 QDir pluginDir = dir;
180 if(pluginDir.cd(fileName))
181 FindPlugins(pluginDir, filters);
184 QDir::setCurrent(szCurrentPath);
189int CManager::AppendPlugin(
CPlugin *p)
192 m_Plugins.insert(p->
Id(), p);
195 bool bRet = QMetaObject::invokeMethod(
198 Qt::DirectConnection,
199 Q_RETURN_ARG(
int, val));
202 qCritical(log) <<
"The plugin" << p->
Name()
203 <<
"initial translator fail" << bRet << val;
207 + tr(
"Version:") +
" " + p->
Version() +
" \n"
210 m_szDetails += p->
Details() +
"\n";
219 auto it = m_Plugins.find(
id);
220 if(m_Plugins.end() != it)
223 qDebug(log) <<
"CreateOperate id:" << id;
224 auto plugin = it.value();
227 bRet = QMetaObject::invokeMethod(
230 Qt::DirectConnection,
235 qCritical(log) <<
"Create COperate fail.";
246 qDebug(log) << Q_FUNC_INFO;
251 bool bRet = QMetaObject::invokeMethod(
254 Qt::DirectConnection,
255 Q_RETURN_ARG(
CPlugin*, pPlugin));
257 if(bRet && pPlugin) {
260 bRet = QMetaObject::invokeMethod(
263 Qt::DirectConnection,
264 Q_RETURN_ARG(
int, nRet),
268 qCritical(log) <<
"Call pPlugin->DeleteOperate(p) fail";
273 qCritical(log) <<
"Get CManager fail.";
280 if(szFile.isEmpty())
return nullptr;
281 qDebug(log) <<
"LoadOperate:"<< szFile;
282 QSettings set(szFile, QSettings::IniFormat);
283 m_FileVersion = set.value(
"Manage/FileVersion", m_FileVersion).toInt();
284 QString
id = set.value(
"Plugin/ID").toString();
285 QString protocol = set.value(
"Plugin/Protocol").toString();
286 QString name = set.value(
"Plugin/Name").toString();
287 qDebug(log) <<
"LoadOperate protocol:" << protocol
288 <<
"name:" << name <<
"id:" << id;
293 bool bRet = QMetaObject::invokeMethod(
296 Qt::DirectConnection,
297 Q_RETURN_ARG(
int, nRet),
298 Q_ARG(QString, szFile));
300 qCritical(log) <<
"Call pOperate->Load(szFile) fail.";
304 qCritical(log) <<
"Load parameter fail" << nRet;
308 pOperate->SetSettingsFile(szFile);
311 qCritical(log) <<
"Don't create Operate:" << name << protocol <<
id << szFile;
318 if(!pOperate)
return -1;
320 QString szFile = pOperate->GetSettingsFile();
322 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
327 QSettings set(szFile, QSettings::IniFormat);
330 bool bRet = QMetaObject::invokeMethod(
333 Qt::DirectConnection,
334 Q_RETURN_ARG(
CPlugin*, pPlugin));
335 if(!bRet || !pPlugin)
337 qCritical(log) <<
"Get plugin client fail";
341 set.setValue(
"Manage/FileVersion", m_FileVersion);
342 set.setValue(
"Plugin/ID", pPlugin->
Id());
343 set.setValue(
"Plugin/Protocol", pPlugin->
Protocol());
344 set.setValue(
"Plugin/Name", pPlugin->
Name());
347 bRet = QMetaObject::invokeMethod(
350 Qt::DirectConnection,
351 Q_RETURN_ARG(
int, nRet),
352 Q_ARG(QString, szFile));
354 qCritical(log) <<
"Call pOperate->Save(szFile) fail.";
358 qCritical(log) <<
"Save parameter fail" << nRet;
367 qCritical(log) <<
"The m_pParameter is nullptr";
368 Q_ASSERT_X(m_pParameter,
"CManager",
"The m_pParameter is nullptr");
374 s = m_szSettingsFile;
375 return m_pParameter->
Load(s);
381 qCritical(log) <<
"The m_pParameter is nullptr";
382 Q_ASSERT_X(m_pParameter,
"CManager",
"The m_pParameter is nullptr");
388 s = m_szSettingsFile;
389 return m_pParameter->
Save(s);
394 QList<QWidget*> lstWidget;
399 lstWidget.push_back(pClient);
401#if defined(HAVE_QTERMWIDGET)
405 pTermina->setWindowTitle(tr(
"Terminal"));
406 lstWidget.push_back(pTermina);
411 pRecord->SetParameter(&m_pParameter->m_Record);
412 lstWidget.push_back(pRecord);
421 QMap<QString, CPlugin*>::iterator it;
422 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
424 nRet = handle->
onProcess(it.key(), it.value());
435 QMap<QString, CPlugin*>::iterator it;
436 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
438 nRet = cb(it.key(), it.value());
446const QString CManager::Details()
const
450 szDetail += COperateTerminal::Details();
454 szDetail += channel.GetDetails();
457 szDetail +=
"- QtKeyChain\n" +
458 QString(
" - ") + tr(
"Version:")
459 +
" 0x" + QString::number(QTKEYCHAIN_VERSION, 16) +
"\n";
462 if(!szDetail.isEmpty()) {
463 szDetail =
"#### " + tr(
"Dependency libraries:") +
"\n" + szDetail;
465 szDetail += m_szDetails;
469void CManager::slotNativeWindowRecieveKeyboard()
471 Q_ASSERT(m_pParameter);
472 if(m_pParameter->GetNativeWindowReceiveKeyboard()) {
474 m_pHook->UnRegisterKeyboard();
475 m_pHook->deleteLater();
480 m_pHook = CHook::GetHook(m_pParameter,
this);
482 m_pHook->RegisterKeyboard();
static int RemoveTranslation()
Remove translation
static int InitTranslation()
Initial translation
virtual int onProcess(const QString &id, CPlugin *pPlugin)=0
Process plugins
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
得到设置参数窗口
virtual int EnumPlugins(Handle *handle)
Enum plugins
virtual COperate * CreateOperate(const QString &id)
新建 COperate 指针,所有者是调用者。 当不在使用时,调用者必调用 DeteleOperate() 须释放指针。 调用者必须连接信号 COperate::sigFinished 。 释放指针 (...
virtual COperate * LoadOperate(const QString &szFile)
从文件中新建 COperate 指针,所有者是调用者。 当不再使用时,调用者必须负责调用 DeleteOperate() 删除此指针。 调用者必须连接信号 COperate::sigFinished 。...
virtual int DeleteOperate(COperate *p)
Delete COperate
virtual int SaveOperate(COperate *pOperate)
保存连接参数到文件
virtual int SaveSettings(const QString szFile=QString())
保存客户端参数到文件
virtual int LoadSettings(const QString szFile=QString())
从文件中加载客户端参数
virtual const QString Id()
Identity
virtual int SetParameter(CParameter *pParameter) override
[override functions]
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
显示更多细节。 例如: 在关于对话框或日志中显示。 包括插件的依赖库的版本信息和描述
virtual const QString Id()
标识。默认: Type() + ":" + Protocol() + ":" + Name()
virtual const QString Name() const =0
插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Protocol() const =0
协议
virtual const QString Description() const =0
描述