3#include <QPluginLoader>
9#include <QLoggingCategory>
14#include "RabbitCommonDir.h"
15#include "RabbitCommonTools.h"
16#include "FrmParameterClient.h"
19#include "ParameterRecordUI.h"
21static Q_LOGGING_CATEGORY(log,
"Client")
32 m_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
33 "Client", RabbitCommon::CTools::TranslationType::Library);
35 CChannel::InitTranslation();
36 m_szSettingsFile = szFile;
38 if(m_pParameterClient) {
39 LoadSettings(m_szSettingsFile);
40 check = connect(m_pParameterClient, &CParameterClient::sigNativeWindowRecieveKeyboard,
42 if(m_pParameterClient->GetNativeWindowReceiveKeyboard()) {
44 m_pHook->UnRegisterKeyboard();
45 m_pHook->deleteLater();
49 m_pHook = CHook::GetHook(m_pParameterClient,
this);
51 m_pHook->RegisterKeyboard();
54 m_pHook = CHook::GetHook(m_pParameterClient,
this);
56 m_pHook->RegisterKeyboard();
58 qCritical(log) <<
"new CParameterClient() fail";
59 Q_ASSERT(m_pParameterClient);
67 qDebug(log) <<
"CClient::~CClient()";
69 qApp->removeEventFilter(
this);
72 m_pHook->UnRegisterKeyboard();
73 m_pHook->deleteLater();
77 if(m_pParameterClient) {
78 m_pParameterClient->deleteLater();
79 m_pParameterClient =
nullptr;
83 RabbitCommon::CTools::Instance()->RemoveTranslator(m_Translator);
85 CChannel::RemoveTranslation();
92int CClient::LoadPlugins()
95 foreach (QObject *plugin, QPluginLoader::staticInstances())
100 if(m_Plugins.find(p->
Id()) == m_Plugins.end())
102 qInfo(log) <<
"Success: Load plugin" << p->
Name();
106 qWarning(log) <<
"The plugin" << p->
Name() <<
" is exist.";
110 QString szPath = RabbitCommon::CDir::Instance()->GetDirPlugins();
111#if !defined (Q_OS_ANDROID)
112 szPath = szPath + QDir::separator() +
"Client";
116#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
117 filters <<
"*PluginClient*.dll";
119 filters <<
"*PluginClient*.so";
121 nRet = FindPlugins(szPath, filters);
122 if(!m_szDetails.isEmpty())
123 m_szDetails = tr(
"### Plugins") +
"\n" + m_szDetails;
125 qDebug(log) << (
"Client details:\n" + Details()).toStdString().c_str();
129int CClient::FindPlugins(QDir dir, QStringList filters)
132 if(filters.isEmpty())
134#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
135 filters <<
"*PluginClient*.dll";
137 filters <<
"*PluginClient*.so";
141 QString szCurrentPath = QDir::currentPath();
142 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
148 QDir::setCurrent(QDir::cleanPath(dir.absolutePath()));
159 foreach (fileName, files) {
160 QString szPlugins = dir.absoluteFilePath(fileName);
161 QPluginLoader loader(szPlugins);
162 QObject *plugin = loader.instance();
167 if(m_Plugins.find(p->
Id()) == m_Plugins.end())
169 qInfo(log) <<
"Success: Load plugin"
170 << p->
Name() <<
"from" << szPlugins;
174 qWarning(log) <<
"The plugin [" << p->
Name() <<
"] is exist.";
178 szMsg =
"Error: Load plugin fail from " + szPlugins;
179 if(!loader.errorString().isEmpty())
180 szMsg +=
"; Error: " + loader.errorString();
181 qCritical(log) << szMsg.toStdString().c_str();
185 foreach (fileName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
186 QDir pluginDir = dir;
187 if(pluginDir.cd(fileName))
188 FindPlugins(pluginDir, filters);
191 QDir::setCurrent(szCurrentPath);
199 m_Plugins.insert(p->
Id(), p);
202 bool bRet = QMetaObject::invokeMethod(
205 Qt::DirectConnection,
206 Q_RETURN_ARG(
int, val));
209 qCritical(log) <<
"The plugin" << p->
Name()
210 <<
"initial translator fail" << bRet << val;
214 + tr(
"Version:") +
" " + p->
Version() +
" \n"
217 m_szDetails += p->
Details() +
"\n";
226 auto it = m_Plugins.find(
id);
227 if(m_Plugins.end() != it)
230 qDebug(log) <<
"CreateConnecter id:" << id;
231 auto plugin = it.value();
234 bRet = QMetaObject::invokeMethod(
237 Qt::DirectConnection,
242 qCritical(log) <<
"Create CConnecter fail.";
253 qDebug(log) << Q_FUNC_INFO;
258 bool bRet = QMetaObject::invokeMethod(
261 Qt::DirectConnection,
264 if(bRet && pPluginClient) {
267 bRet = QMetaObject::invokeMethod(
270 Qt::DirectConnection,
271 Q_RETURN_ARG(
int, nRet),
275 qCritical(log) <<
"Call pPluginClient->DeleteConnecter(p) fail";
280 qCritical(log) <<
"Get CClient fail.";
287 if(szFile.isEmpty())
return nullptr;
289 QSettings set(szFile, QSettings::IniFormat);
290 m_FileVersion = set.value(
"Manage/FileVersion", m_FileVersion).toInt();
291 QString
id = set.value(
"Plugin/ID").toString();
292 QString protocol = set.value(
"Plugin/Protocol").toString();
293 QString name = set.value(
"Plugin/Name").toString();
295 qDebug(log) <<
"LoadConnecter protocol:" << protocol
296 <<
"name:" << name <<
"id:" << id;
301 bool bRet = QMetaObject::invokeMethod(
304 Qt::DirectConnection,
305 Q_RETURN_ARG(
int, nRet),
306 Q_ARG(QString, szFile));
308 qCritical(log) <<
"Call pConnecter->Load(szFile) fail.";
312 qCritical(log) <<
"Load parameter fail" << nRet;
316 pConnecter->SetSettingsFile(szFile);
319 qCritical(log) <<
"Don't create connecter:" << protocol;
326 if(!pConnecter)
return -1;
328 QString szFile = pConnecter->GetSettingsFile();
330 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
335 QSettings set(szFile, QSettings::IniFormat);
338 bool bRet = QMetaObject::invokeMethod(
341 Qt::DirectConnection,
343 if(!bRet || !pPluginClient)
345 qCritical(log) <<
"Get plugin client fail";
347 Q_ASSERT(pPluginClient);
349 set.setValue(
"Manage/FileVersion", m_FileVersion);
350 set.setValue(
"Plugin/ID", pPluginClient->
Id());
351 set.setValue(
"Plugin/Protocol", pPluginClient->
Protocol());
352 set.setValue(
"Plugin/Name", pPluginClient->
Name());
355 bRet = QMetaObject::invokeMethod(
358 Qt::DirectConnection,
359 Q_RETURN_ARG(
int, nRet),
360 Q_ARG(QString, szFile));
362 qCritical(log) <<
"Call pConnecter->Save(szFile) fail.";
366 qCritical(log) <<
"Save parameter fail" << nRet;
374 if(!m_pParameterClient) {
375 qCritical(log) <<
"The m_pParameterClient is nullptr";
376 Q_ASSERT_X(m_pParameterClient,
"CClient",
"The m_pParameterClient is nullptr");
382 s = m_szSettingsFile;
383 return m_pParameterClient->CParameter::Load(s);
388 if(!m_pParameterClient) {
389 qCritical(log) <<
"The m_pParameterClient is nullptr";
390 Q_ASSERT_X(m_pParameterClient,
"CClient",
"The m_pParameterClient is nullptr");
396 s = m_szSettingsFile;
397 return m_pParameterClient->CParameter::Save(s);
402 QList<QWidget*> lstWidget;
407 lstWidget.push_back(pClient);
412 pRecord->SetParameter(&m_pParameterClient->m_Record);
413 lstWidget.push_back(pRecord);
422 QMap<QString, CPluginClient*>::iterator it;
423 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
425 nRet = handle->
onProcess(it.key(), it.value());
436 QMap<QString, CPluginClient*>::iterator it;
437 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
439 nRet = cb(it.key(), it.value());
447const QString CClient::Details()
const
virtual int onProcess(const QString &id, CPluginClient *pPlug)=0
Process plugins
virtual CConnecter * LoadConnecter(const QString &szFile)
从文件中新建 CConnecter 指针,所有者是调用者。 当不再使用时,调用者必须负责调用 DeleteConnecter() 删除此指针。 调用者必须连接信号 CConnecter::sigDisc...
virtual CConnecter * CreateConnecter(const QString &id)
新建 CConnecter 指针,所有者是调用者。 当不在使用时,调用者必调用 DeteleConnecter() 须释放指针。 调用者必须连接信号 CConnecter::sigDisconnecte...
virtual int LoadSettings(const QString szFile=QString())
从文件中加载客户端参数
virtual int DeleteConnecter(CConnecter *p)
Delete CConnecter
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
得到设置参数窗口
virtual int SaveConnecter(CConnecter *pConnecter)
保存连接参数到文件
virtual int SaveSettings(const QString szFile=QString())
保存客户端参数到文件
virtual int EnumPlugins(Handle *handle)
Enum plugins
virtual const QString Id()
Identity
virtual int SetParameter(CParameter *pParameter) override
设置参数,并初始化界面
客户端库 (CClient) 参数。仅在客户端库 (CClient) 和插件中使用。
客户端插件接口。用于建立 CConnecter 实例,它由协议插件实现。
virtual const QString Details() const
显示更多细节。 例如: 在关于对话框或日志中显示。 包括插件的依赖库的版本信息和描述
virtual const QString Id() const
标识。默认: Protocol() + ":" + Name()
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Description() const =0
描述
virtual const QString Version() const =0
Version
virtual const QString Name() const =0
插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。
virtual const QString Protocol() const =0
协议