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
The Handle CConnecter class.
virtual int onProcess(const QString &id, CPluginClient *pPlug)=0
Process plugins.
manage plugins and connecter
virtual CConnecter * LoadConnecter(const QString &szFile)
New CConnecter pointer from file, the owner is caller.
virtual CConnecter * CreateConnecter(const QString &id)
New CConnecter pointer, the owner is caller.
virtual int LoadSettings(const QString szFile=QString())
Load Client parameters from file.
virtual int DeleteConnecter(CConnecter *p)
Delete CConnecter.
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
Get parameter settings widget.
virtual int SaveConnecter(CConnecter *pConnecter)
Accept connecter parameters to file.
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
virtual int EnumPlugins(Handle *handle)
Enum plugins.
virtual const QString Id()
Identity.
virtual int SetParameter(CParameter *pParameter) override
Set the parameters and initialize the user interface.
The parameters of client.
virtual const QString Details() const
Display more information in About dialog or log.
virtual const QString Id() const
ID. Default: Protocol() + ":" + Name()
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Description() const =0
Plugin description.
virtual const QString Version() const =0
Version.
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 Protocol() const =0
Plugin Protocol.