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"
29#include "FrmMediaDevices.h"
34static Q_LOGGING_CATEGORY(log,
"Manager")
44 qDebug(log) <<
"CManager::~CManager()";
46 qApp->removeEventFilter(
this);
49 m_pHook->UnRegisterKeyboard();
50 m_pHook->deleteLater();
55 m_pParameter->deleteLater();
56 m_pParameter =
nullptr;
60 RabbitCommon::CTools::Instance()->RemoveTranslator(m_Translator);
69int CManager::Initial(QString szFile)
76 m_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
77 "Plugin", RabbitCommon::CTools::TranslationType::Library);
79 m_szSettingsFile = szFile;
90#if defined(Q_OS_ANDROID)
93#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0) && defined(Q_OS_WIN)
94 szSnap = qEnvironmentVariable(
"SNAP");
95 szFlatpak = qEnvironmentVariable(
"FLATPAK_ID");
97 szSnap = QString::fromLocal8Bit(qgetenv(
"SNAP"));
98 szFlatpak = QString::fromLocal8Bit(qgetenv(
"FLATPAK_ID"));
100 if(!szSnap.isEmpty() || !szFlatpak.isEmpty())
102 if(bReboot && !RabbitCommon::CTools::Instance()->HasAdministratorPrivilege()
103 && m_pParameter->GetPromptAdministratorPrivilege())
107 szMsg = tr(
"The programe is not administrator privilege.\n"
108 "Some features are limited.\n");
110 szMsg += tr(
"Eg: Can not disable system shortcuts(eg: Ctrl+Alt+del).") +
"\n";
112 szMsg += tr(
"Eg: Can not use the wake on LAN feature.") +
"\n";
114 szMsg += tr(
"Restart program by administrator?");
115 QMessageBox msg(QMessageBox::Warning, tr(
"Warning"), szMsg,
116 QMessageBox::Yes | QMessageBox::No);
117 msg.setCheckBox(
new QCheckBox(tr(
"Always shown"), &msg));
118 msg.checkBox()->setCheckable(
true);
119 msg.checkBox()->setChecked(
120 m_pParameter->GetPromptAdministratorPrivilege());
123 m_pParameter->SetPromptAdministratorPrivilege(
124 msg.checkBox()->isChecked());
127 if(QMessageBox::Yes == nRet) {
128 RabbitCommon::CTools::Instance()->StartWithAdministratorPrivilege(
true);
133 check = connect(m_pParameter, SIGNAL(sigCaptureAllKeyboard()),
134 this, SLOT(slotCaptureAllKeyboard()));
136 if(m_pParameter->GetCaptureAllKeyboard()) {
137 m_pHook = CHook::GetHook(m_pParameter,
this);
139 m_pHook->RegisterKeyboard();
142 qCritical(log) <<
"new CParameterPlugin() fail";
143 Q_ASSERT(m_pParameter);
150int CManager::LoadPlugins()
153 foreach (QObject *plugin, QPluginLoader::staticInstances())
155 CPlugin* p = qobject_cast<CPlugin*>(plugin);
158 if(m_Plugins.find(p->
Id()) == m_Plugins.end())
160 qInfo(log) <<
"Success: Load plugin" << p->
Name();
164 qWarning(log) <<
"The plugin" << p->
Name() <<
" is exist.";
168 QString szPath = RabbitCommon::CDir::Instance()->GetDirPlugins();
171 if(filters.isEmpty())
173#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
174 filters <<
"*Plugin*.dll";
175#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
176 filters <<
"*Plugin*.dylib";
178 filters <<
"*Plugin*.so";
181 nRet = FindPlugins(szPath, filters);
182 if(!m_szDetails.isEmpty())
183 m_szDetails =
"## " + tr(
"Plugins") +
"\n" + m_szDetails;
185 qDebug(log) << (
"Client details:\n" + Details()).toStdString().c_str();
189int CManager::FindPlugins(QDir dir, QStringList filters)
193 QString szCurrentPath = QDir::currentPath();
194 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
200 QDir::setCurrent(QDir::cleanPath(dir.absolutePath()));
211 foreach (fileName, files) {
212 QString szPlugins = dir.absoluteFilePath(fileName);
213 QPluginLoader loader(szPlugins);
214 QObject *plugin = loader.instance();
216 CPlugin* p = qobject_cast<CPlugin*>(plugin);
219 if(m_Plugins.find(p->
Id()) == m_Plugins.end())
221 qInfo(log) <<
"Success: Load plugin"
222 << p->
Name() <<
"from" << szPlugins;
226 qWarning(log) <<
"The plugin [" << p->
Name() <<
"] is exist.";
230 szMsg =
"Error: Load plugin fail from " + szPlugins;
231 if(!loader.errorString().isEmpty())
232 szMsg +=
"; Error: " + loader.errorString();
233 qCritical(log) << szMsg.toStdString().c_str();
237 foreach (fileName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
238 QDir pluginDir = dir;
239 if(pluginDir.cd(fileName))
240 FindPlugins(pluginDir, filters);
243 QDir::setCurrent(szCurrentPath);
248int CManager::AppendPlugin(
CPlugin *p)
251 m_Plugins.insert(p->
Id(), p);
254 bool bRet = QMetaObject::invokeMethod(
257 Qt::DirectConnection,
258 Q_RETURN_ARG(
int, val));
261 qCritical(log) <<
"The plugin" << p->
Name()
262 <<
"initial translator fail" << bRet << val;
266 + tr(
"Version:") +
" " + p->
Version() +
" \n"
269 m_szDetails += p->
Details() +
"\n";
278 auto it = m_Plugins.find(
id);
279 if(m_Plugins.end() != it)
282 qDebug(log) <<
"CreateOperate id:" << id;
283 auto plugin = it.value();
286 bRet = QMetaObject::invokeMethod(
289 Qt::DirectConnection,
294 qCritical(log) <<
"Create COperate fail.";
305 qDebug(log) << Q_FUNC_INFO;
310 bool bRet = QMetaObject::invokeMethod(
313 Qt::DirectConnection,
314 Q_RETURN_ARG(
CPlugin*, pPlugin));
316 if(bRet && pPlugin) {
319 bRet = QMetaObject::invokeMethod(
322 Qt::DirectConnection,
323 Q_RETURN_ARG(
int, nRet),
327 qCritical(log) <<
"Call pPlugin->DeleteOperate(p) fail";
332 qCritical(log) <<
"Get CManager fail.";
339 if(szFile.isEmpty())
return nullptr;
340 qDebug(log) <<
"Load operate configure file:"<< szFile;
341 QSettings set(szFile, QSettings::IniFormat);
342 m_FileVersion = set.value(
"Manage/FileVersion", m_FileVersion).toInt();
343 QString
id = set.value(
"Plugin/ID").toString();
344 QString protocol = set.value(
"Plugin/Protocol").toString();
345 QString name = set.value(
"Plugin/Name").toString();
346 qDebug(log) <<
"LoadOperate protocol:" << protocol
347 <<
"name:" << name <<
"id:" << id;
352 bool bRet = QMetaObject::invokeMethod(
355 Qt::DirectConnection,
356 Q_RETURN_ARG(
int, nRet),
357 Q_ARG(QString, szFile));
359 qCritical(log) <<
"Call pOperate->Load(szFile) fail.";
363 qCritical(log) <<
"Load parameter fail" << nRet;
367 pOperate->SetSettingsFile(szFile);
370 qCritical(log) <<
"Don't create Operate:" << name << protocol <<
id << szFile;
377 if(!pOperate)
return -1;
379 QString szFile = pOperate->GetSettingsFile();
381 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
386 QSettings set(szFile, QSettings::IniFormat);
389 bool bRet = QMetaObject::invokeMethod(
392 Qt::DirectConnection,
393 Q_RETURN_ARG(
CPlugin*, pPlugin));
394 if(!bRet || !pPlugin)
396 qCritical(log) <<
"Get plugin client fail";
400 set.setValue(
"Manage/FileVersion", m_FileVersion);
401 set.setValue(
"Plugin/ID", pPlugin->
Id());
402 set.setValue(
"Plugin/Protocol", pPlugin->
Protocol());
403 set.setValue(
"Plugin/Name", pPlugin->
Name());
406 bRet = QMetaObject::invokeMethod(
409 Qt::DirectConnection,
410 Q_RETURN_ARG(
int, nRet),
411 Q_ARG(QString, szFile));
413 qCritical(log) <<
"Call pOperate->Save(szFile) fail.";
417 qCritical(log) <<
"Save parameter fail" << nRet;
426 qCritical(log) <<
"The m_pParameter is nullptr";
427 Q_ASSERT_X(m_pParameter,
"CManager",
"The m_pParameter is nullptr");
433 s = m_szSettingsFile;
434 return m_pParameter->
Load(s);
440 qCritical(log) <<
"The m_pParameter is nullptr";
441 Q_ASSERT_X(m_pParameter,
"CManager",
"The m_pParameter is nullptr");
447 s = m_szSettingsFile;
448 return m_pParameter->
Save(s);
453 QList<QWidget*> lstWidget;
458 lstWidget.push_back(pClient);
460#if defined(HAVE_QTERMWIDGET)
464 pTermina->setWindowTitle(tr(
"Terminal"));
465 lstWidget.push_back(pTermina);
470 pRecord->SetParameter(&m_pParameter->m_Record);
471 lstWidget.push_back(pRecord);
474 CFrmMediaDevices* pMediaDevices =
new CFrmMediaDevices(parent);
476 pMediaDevices->SetParameter(&m_pParameter->m_MediaDevices.m_Para);
477 lstWidget.push_back(pMediaDevices);
485 QMap<QString, CPlugin*>::iterator it;
486 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
488 nRet = handle->
onProcess(it.key(), it.value());
499 QMap<QString, CPlugin*>::iterator it;
500 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
502 nRet = cb(it.key(), it.value());
510const QString CManager::Details()
const
514 szDetail += COperateTerminal::Details();
518 szDetail += channel.GetDetails();
521 szDetail +=
"- QtKeyChain\n" +
522 QString(
" - ") + tr(
"Version:")
523 +
" 0x" + QString::number(QTKEYCHAIN_VERSION, 16) +
"\n";
526 if(!szDetail.isEmpty()) {
527 szDetail =
"## " + tr(
"Dependency libraries:") +
"\n" + szDetail;
529 szDetail += m_szDetails;
533void CManager::slotCaptureAllKeyboard()
535 Q_ASSERT(m_pParameter);
536 if(m_pParameter->GetCaptureAllKeyboard()) {
538 m_pHook = CHook::GetHook(m_pParameter,
this);
540 m_pHook->RegisterKeyboard();
543 m_pHook->UnRegisterKeyboard();
544 m_pHook->deleteLater();
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
描述