Rabbit Remote Control 0.1.0-bate10
Loading...
Searching...
No Matches
Manager.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QPluginLoader>
4#include <QKeyEvent>
5#include <QtPlugin>
6#include <QFile>
7#include <QTemporaryFile>
8#include <QApplication>
9#include <QSettings>
10#include <QLoggingCategory>
11#include <QMessageBox>
12#include <QCheckBox>
13
14#include "RabbitCommonDir.h"
15#include "RabbitCommonTools.h"
16#include "ParameterPluginUI.h"
17#include "ParameterRecordUI.h"
18#if defined(HAVE_QTERMWIDGET)
19 #include "ParameterTerminalUI.h"
20 #include "OperateTerminal.h"
21#endif
22#ifdef HAVE_LIBSSH
23 #include "ChannelSSH.h"
24#endif
25
26#if HAVE_QTKEYCHAIN
27 #include "keychain.h"
28#endif
29
30#include "FrmMediaDevices.h"
31#include "ParameterFilter.h"
32#include "FrmManagePlugins.h"
33
34#include "ParameterDatabaseUI.h"
35#include "ParameterPlugin.h"
36
37#include "Channel.h"
38#include "Manager.h"
39
40static Q_LOGGING_CATEGORY(log, "Manager")
41
42CManager::CManager(QObject *parent) : QObject(parent)
43 , m_FileVersion(1) //TODO: update version it if update data
44 , m_pHook(nullptr)
45 , m_pParameterPlugin(nullptr)
46 , m_pDatabaseFile(nullptr)
47{
48}
49
50CManager::~CManager()
51{
52 qDebug(log) << "CManager::~CManager()";
53
54 qApp->removeEventFilter(this);
55
56 if(m_pDatabaseFile) {
57 delete m_pDatabaseFile;
58 m_pDatabaseFile = nullptr;
59 }
60
61 for(auto it = m_Plugins.begin(); it != m_Plugins.end(); it++)
62 {
63 auto pLoader = it.value();
64 pLoader->unload();
65 pLoader->deleteLater();
66 }
67
68 if(m_pHook) {
69 m_pHook->UnRegisterKeyboard();
70 m_pHook->deleteLater();
71 m_pHook = nullptr;
72 }
73
74 if(m_pParameterPlugin) {
75 m_pParameterPlugin->deleteLater();
76 m_pParameterPlugin = nullptr;
77 }
78
79 if(m_Translator)
80 RabbitCommon::CTools::Instance()->RemoveTranslator(m_Translator);
81
83
84 //#if defined (_DEBUG) || !defined(BUILD_SHARED_LIBS)
85 // Q_CLEANUP_RESOURCE(translations_Plugin);
86 //#endif
87}
88
89int CManager::Initial(QString szFile)
90{
91 bool check = false;
92 //#if defined (_DEBUG) || !defined(BUILD_SHARED_LIBS)
93 // Q_INIT_RESOURCE(translations_Plugin);
94 //#endif
95
96 m_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
97 "Plugin", RabbitCommon::CTools::TranslationType::Library);
98
99 m_szSettingsFile = szFile;
100
102
103 m_pParameterPlugin = new CParameterPlugin();
104 if(m_pParameterPlugin) {
105 LoadSettings(m_szSettingsFile);
106
107 // Initial database
108 auto pg = GetGlobalParameters();
109 Q_ASSERT(pg);
110 QString szFile;
111 szFile = pg->m_Database.GetDatabaseName();
112 bool bRet = pg->m_DatabaseLocal.OpenSQLiteDatabase(szFile, "Local_connect");
113 if(!bRet) return -1;
114 bRet = pg->m_DatabaseRemote.OpenDatabase(&pg->m_Database, "Remote_connect");
115 if(!bRet) return -1;
116 bRet = m_pParameterPlugin->m_WhiteList.InitDatabase(&pg->m_DatabaseLocal);
117 if(!bRet) return -1;
118 bRet = m_pParameterPlugin->m_BlackList.InitDatabase(&pg->m_DatabaseLocal);
119 if(!bRet) return -1;
120
121 bool bReboot = true;
122 QString szSnap;
123 QString szFlatpak;
124#if defined(Q_OS_ANDROID)
125 bReboot = false;
126#endif
127#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0) && defined(Q_OS_WIN)
128 szSnap = qEnvironmentVariable("SNAP");
129 szFlatpak = qEnvironmentVariable("FLATPAK_ID");
130#else
131 szSnap = QString::fromLocal8Bit(qgetenv("SNAP"));
132 szFlatpak = QString::fromLocal8Bit(qgetenv("FLATPAK_ID"));
133#endif
134 if(!szSnap.isEmpty() || !szFlatpak.isEmpty())
135 bReboot = false;
136 if(bReboot && !RabbitCommon::CTools::Instance()->HasAdministratorPrivilege()
137 && m_pParameterPlugin->GetPromptAdministratorPrivilege())
138 {
139 int nRet = 0;
140 QString szMsg;
141 szMsg = tr("The programe is not administrator privilege.\n"
142 "Some features are limited.\n");
143#if defined(Q_OS_WIN)
144 szMsg += tr("Eg: Can not disable system shortcuts(eg: Ctrl+Alt+del).") + "\n";
145#else
146 szMsg += tr("Eg: Can not use the wake on LAN feature.") + "\n";
147#endif
148 szMsg += tr("Restart program by administrator?");
149 QMessageBox msg(QMessageBox::Warning, tr("Warning"), szMsg,
150 QMessageBox::Yes | QMessageBox::No);
151 msg.setCheckBox(new QCheckBox(tr("Always shown"), &msg));
152 msg.checkBox()->setCheckable(true);
153 msg.checkBox()->setChecked(
154 m_pParameterPlugin->GetPromptAdministratorPrivilege());
155 nRet = msg.exec();
156
157 m_pParameterPlugin->SetPromptAdministratorPrivilege(
158 msg.checkBox()->isChecked());
159 SaveSettings(m_szSettingsFile);
160
161 if(QMessageBox::Yes == nRet) {
162 RabbitCommon::CTools::Instance()->StartWithAdministratorPrivilege(true);
163 return -1;
164 }
165 }
166
167 check = connect(m_pParameterPlugin, SIGNAL(sigCaptureAllKeyboard()),
168 this, SLOT(slotCaptureAllKeyboard()));
169 Q_ASSERT(check);
170 if(m_pParameterPlugin->GetCaptureAllKeyboard()) {
171 m_pHook = CHook::GetHook(m_pParameterPlugin, this);
172 if(m_pHook)
173 m_pHook->RegisterKeyboard();
174 }
175 } else {
176 qCritical(log) << "new CParameterPlugin() fail";
177 Q_ASSERT(m_pParameterPlugin);
178 }
179
180 LoadPlugins();
181
182 m_pDatabaseFile = new CDatabaseFile();
183 if(m_pDatabaseFile) {
184 auto pg = GetGlobalParameters();
185 bool bRet = m_pDatabaseFile->SetDatabase(&pg->m_DatabaseRemote);
186 if(!bRet) return -1;
187 }
188
189 return 0;
190}
191
192int CManager::LoadPlugins()
193{
194 int nRet = 0;
195
196 QStringList lstPaths;
197 if(m_pParameterPlugin->GetEnableSetPluginsPath()) {
198 lstPaths = m_pParameterPlugin->GetPluginsPath();
199 }
200 else
201 lstPaths << RabbitCommon::CDir::Instance()->GetDirPlugins();
202 if(lstPaths.isEmpty())
203 qWarning(log) << "The plugins path is empty. please set it from: `Menu` -> `Tools` -> `Settings` -> `Load Plugins`";
204
205 if(m_pParameterPlugin->GetOnlyLoadInWhitelist()) {
206 m_pParameterPlugin->m_WhiteList.OnProcess([this, lstPaths](const QString& szPath) -> int{
207 QFileInfo fi(szPath);
208 if(fi.isAbsolute())
209 return LoadPlugin(szPath);
210 foreach (auto d, lstPaths) {
211 if(d.isEmpty()) continue;
212 QString szFile = d + QDir::separator() + szPath;
213 return LoadPlugin(szFile);
214 }
215 return -1;
216 });
217 return 0;
218 }
219
220 foreach (auto szPath, lstPaths) {
221 //QString szPath = RabbitCommon::CDir::Instance()->GetDirPlugins();
222
223 QStringList filters;
224 if(filters.isEmpty())
225 {
226#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
227 filters << "*Plugin*.dll";
228#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
229 filters << "*Plugin*.dylib";
230#else
231 filters << "*Plugin*.so";
232#endif
233 }
234 nRet = FindPlugins(szPath, filters);
235 }
236
237 if(m_Plugins.empty()) {
238 qWarning(log) << "The plugins is empty. please set it from: `Menu` -> `Tools` -> `Settings` -> `Load Plugins`";
239 }
240
241 if(!m_szDetails.isEmpty())
242 m_szDetails = "## " + tr("Plugins") + "\n" + m_szDetails;
243
244 qDebug(log) << ("Client details:\n" + Details()).toStdString().c_str();
245 return 0;
246}
247
248int CManager::FindPlugins(QDir dir, QStringList filters)
249{
250 QString fileName;
251
252 QString szCurrentPath = QDir::currentPath();
253 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
254 if(!files.isEmpty())
255 {
256 //This method is invalid
257 //QCoreApplication::addLibraryPath(QDir::cleanPath(dir.absolutePath()));
258
259 QDir::setCurrent(QDir::cleanPath(dir.absolutePath()));
260
261 // This method is valid
262 //#if defined(Q_OS_WINDOWS)
263 // QString szPath = QString::fromLocal8Bit(qgetenv("PATH"));
264 // szPath += ";";
265 // szPath += QDir::cleanPath(dir.absolutePath());
266 // qputenv("PATH", szPath.toLatin1());
267 //#endif
268 }
269
270 foreach (fileName, files) {
271 QString szPlugins = dir.absoluteFilePath(fileName);
272 if(m_pParameterPlugin
273 && (!m_pParameterPlugin->m_WhiteList.contains(fileName) || !m_pParameterPlugin->m_WhiteList.contains(fileName))
274 && (m_pParameterPlugin->m_BlackList.contains(fileName) || m_pParameterPlugin->m_BlackList.contains(fileName))) {
275 qInfo(log) << "Filter:" << szPlugins << "in blacklist";
276 continue;
277 }
278 LoadPlugin(szPlugins);
279 }
280
281 foreach (fileName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
282 QDir pluginDir = dir;
283 if(pluginDir.cd(fileName))
284 FindPlugins(pluginDir, filters);
285 }
286
287 QDir::setCurrent(szCurrentPath);
288
289 return 0;
290}
291
292int CManager::LoadPlugin(const QString &szPath)
293{
294 int nRet = -1;
295 QPluginLoader* pLoader = new QPluginLoader(szPath, this);
296 do{
297 QObject *plugin = pLoader->instance();
298 if (plugin) {
299 CPlugin* p = qobject_cast<CPlugin*>(plugin);
300 if(p) {
301 if(m_Plugins.find(p->Id()) == m_Plugins.end()) {
302 qInfo(log) << "Success: Load plugin"
303 << p->Name() << "from" << szPath;
304 nRet = AppendPlugin(pLoader, p);
305 return nRet;
306 } else {
307 qWarning(log) << "The plugin [" << p->Name() << "] is exist.";
308 nRet = 0;
309 }
310 } else
311 qCritical(log) << "The plugin is not \"CPlugin\":" << szPath;
312 } else {
313 QString szMsg;
314 szMsg = "Error: Load plugin fail from " + szPath;
315 if(!pLoader->errorString().isEmpty())
316 szMsg += "; Error: " + pLoader->errorString();
317 qCritical(log) << szMsg.toStdString().c_str();
318 }
319 } while(0);
320 pLoader->deleteLater();
321 return nRet;
322}
323
324int CManager::AppendPlugin(QPluginLoader *pLoader, CPlugin* p)
325{
326 if(!pLoader) return -1;
327 m_Plugins.insert(p->Id(), pLoader);
328 //p->InitTranslator();
329 int val = 0;
330 bool bRet = QMetaObject::invokeMethod(
331 p,
332 "InitTranslator",
333 Qt::DirectConnection,
334 Q_RETURN_ARG(int, val));
335 if(!bRet || val)
336 {
337 qCritical(log) << "The plugin" << p->Name()
338 << "initial translator fail" << bRet << val;
339 }
340
341 m_szDetails += "### " + p->DisplayName() + "\n";
342 m_szDetails += "- " + tr("Version:") + " " + p->Version() + "\n";
343 m_szDetails += "- " + tr("Type:") + " " + p->TypeName(p->Type()) + "\n";
344 if(!p->Protocol().isEmpty())
345 m_szDetails += "- " + tr("Protocol:") + " " + p->Protocol() + "\n";
346 m_szDetails += "- " + tr("ID:") + " " + p->Id() + "\n";
347 if(!p->Description().isEmpty())
348 m_szDetails += "- " + tr("Description:") + " " + p->Description() + "\n";
349
350 if(!p->Details().isEmpty())
351 m_szDetails += p->Details() + "\n";
352
353 bRet = connect(p, &CPlugin::sigNewOperate, this, &CManager::sigNewOperate);
354 Q_ASSERT(bRet);
355 return 0;
356}
357
360{
361 COperate* pOperate = nullptr;
362 auto it = m_Plugins.find(id);
363 if(m_Plugins.end() != it)
364 {
365 bool bRet = 0;
366 qDebug(log) << "CreateOperate id:" << id;
367 auto plugin = it.value()->instance();
368 if(plugin) {
369 //p = plugin->CreateOperate(id);
370 bRet = QMetaObject::invokeMethod(
371 plugin,
372 "CreateOperate",
373 Qt::DirectConnection,
374 Q_RETURN_ARG(COperate*, pOperate),
375 Q_ARG(QString, id),
376 Q_ARG(CParameterPlugin*, m_pParameterPlugin));
377 if(!bRet) {
378 qCritical(log) << "Create COperate fail.";
379 return nullptr;
380 }
381 }
382 }
383 return pOperate;
384}
386
388{
389 qDebug(log) << Q_FUNC_INFO;
390 if(!p) return 0;
391
392 CPlugin* pPlugin = nullptr;
393 //pPlugin->GetPlugin();
394 bool bRet = QMetaObject::invokeMethod(
395 p,
396 "GetPlugin",
397 Qt::DirectConnection,
398 Q_RETURN_ARG(CPlugin*, pPlugin));
399
400 if(bRet && pPlugin) {
401 int nRet = 0;
402 //pPlugin->DeleteOperate(p);
403 bRet = QMetaObject::invokeMethod(
404 pPlugin,
405 "DeleteOperate",
406 Qt::DirectConnection,
407 Q_RETURN_ARG(int, nRet),
408 Q_ARG(COperate*, p));
409 if(!bRet) {
410 nRet = -1;
411 qCritical(log) << "Call pPlugin->DeleteOperate(p) fail";
412 }
413 return nRet;
414 }
415
416 qCritical(log) << "Get CManager fail.";
417 return -1;
418}
419
420COperate* CManager::LoadOperate(const QString &szFile)
421{
422 COperate* pOperate = nullptr;
423 if(szFile.isEmpty()) return nullptr;
424 qDebug(log) << "Load operate configure file:"<< szFile;
425 if(m_pParameterPlugin->GetGlobalParameters()->GetSaveSettingsType()
426 == CParameterGlobal::SaveSettingsType::Database && m_pDatabaseFile) {
427 qDebug(log) << "Load file from database";
428 QByteArray content = m_pDatabaseFile->Load(szFile);
429 if(!content.isEmpty()) {
430 QFile f(szFile);
431 if(!f.open(QFile::WriteOnly | QFile::Text)) return nullptr;
432 f.write(content.data(), content.length());
433 f.close();
434 }
435 }
436
437 QSettings set(szFile, QSettings::IniFormat);
438 m_FileVersion = set.value("Manage/FileVersion", m_FileVersion).toInt();
439 QString id = set.value("Plugin/ID").toString();
440 QString protocol = set.value("Plugin/Protocol").toString();
441 QString name = set.value("Plugin/Name").toString();
442 qDebug(log) << "LoadOperate protocol:" << protocol
443 << "name:" << name << "id:" << id;
444 pOperate = CreateOperate(id);
445 if(pOperate) {
446 int nRet = false;
447 //bRet = pOperate->Load(szFile);
448 bool bRet = QMetaObject::invokeMethod(
449 pOperate,
450 "Load",
451 Qt::DirectConnection,
452 Q_RETURN_ARG(int, nRet),
453 Q_ARG(QString, szFile));
454 if(!bRet) {
455 qCritical(log) << "Call pOperate->Load(szFile) fail.";
456 return nullptr;
457 }
458 if(nRet) {
459 qCritical(log) << "Load parameter fail" << nRet;
460 DeleteOperate(pOperate);
461 return nullptr;
462 }
463 pOperate->SetSettingsFile(szFile);
464 }
465 else
466 qCritical(log) << "Don't create Operate:" << name << protocol << id << szFile;
467
468 return pOperate;
469}
470
472{
473 if(!pOperate) return -1;
474
475 QString szFile = pOperate->GetSettingsFile();
476 if(szFile.isEmpty())
477 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
478 + QDir::separator()
479 + pOperate->Id()
480 + ".rrc";
481
482 QSettings set(szFile, QSettings::IniFormat);
483 CPlugin* pPlugin = nullptr; //pOperate->GetPlugin;
484 bool bRet = QMetaObject::invokeMethod(
485 pOperate,
486 "GetPlugin",
487 Qt::DirectConnection,
488 Q_RETURN_ARG(CPlugin*, pPlugin));
489 if(!bRet || !pPlugin)
490 {
491 qCritical(log) << "Get plugin client fail";
492 }
493 Q_ASSERT(pPlugin);
494
495 set.setValue("Manage/FileVersion", m_FileVersion);
496 set.setValue("Plugin/ID", pPlugin->Id());
497 set.setValue("Plugin/Protocol", pPlugin->Protocol());
498 set.setValue("Plugin/Name", pPlugin->Name());
499 int nRet = 0;
500 //nRet = pOperate->Save(szFile);
501 bRet = QMetaObject::invokeMethod(
502 pOperate,
503 "Save",
504 Qt::DirectConnection,
505 Q_RETURN_ARG(int, nRet),
506 Q_ARG(QString, szFile));
507 if(!bRet) {
508 qCritical(log) << "Call pOperate->Save(szFile) fail.";
509 return -1;
510 }
511 if(nRet) {
512 qCritical(log) << "Save parameter fail" << nRet;
513 return -2;
514 }
515
516 if(m_pParameterPlugin->GetGlobalParameters()->GetSaveSettingsType()
517 == CParameterGlobal::SaveSettingsType::Database && m_pDatabaseFile) {
518 qDebug(log) << "Save file to database";
519 return m_pDatabaseFile->Save(szFile) ? 0 : -1;
520 }
521
522 return 0;
523}
524
525int CManager::LoadSettings(const QString szFile)
526{
527 if(!m_pParameterPlugin) {
528 qCritical(log) << "The m_pParameter is nullptr";
529 Q_ASSERT_X(m_pParameterPlugin, "CManager", "The m_pParameter is nullptr");
530 return -1;
531 }
532
533 QString s = szFile;
534 if(s.isEmpty())
535 s = m_szSettingsFile;
536 return m_pParameterPlugin->Load(s);
537}
538
539int CManager::SaveSettings(const QString szFile)
540{
541 if(!m_pParameterPlugin) {
542 qCritical(log) << "The m_pParameter is nullptr";
543 Q_ASSERT_X(m_pParameterPlugin, "CManager", "The m_pParameter is nullptr");
544 return -1;
545 }
546
547 QString s = szFile;
548 if(s.isEmpty())
549 s = m_szSettingsFile;
550 return m_pParameterPlugin->Save(s);
551}
552
554{
555 if(m_pParameterPlugin)
556 return m_pParameterPlugin->GetGlobalParameters();
557 return nullptr;
558}
559
560QList<QWidget*> CManager::GetSettingsWidgets(QWidget* parent)
561{
562 QList<QWidget*> lstWidget;
563
564 CFrmManagePlugins* pManagePlugins = new CFrmManagePlugins(parent);
565 if(pManagePlugins) {
566 int nRet = pManagePlugins->SetParameter(m_pParameterPlugin);
567 if(!nRet)
568 lstWidget.push_back(pManagePlugins);
569 }
570
571 CParameterPluginUI* pClient = new CParameterPluginUI(parent);
572 if(pClient) {
573 int nRet = pClient->SetParameter(m_pParameterPlugin);
574 if(!nRet)
575 lstWidget.push_back(pClient);
576 }
577
578 auto pDatabase = new CParameterDatabaseUI(parent);
579 if(pDatabase) {
580 if(GetGlobalParameters()) {
581 int nRet = pDatabase->SetParameter(GetGlobalParameters());
582 if(!nRet)
583 lstWidget.push_back(pDatabase);
584 }
585 }
586
587#if defined(HAVE_QTERMWIDGET)
588 CParameterTerminalUI* pTermina = new CParameterTerminalUI(parent);
589 if(pTermina) {
590 pTermina->SetParameter(&m_pParameterPlugin->m_Terminal);
591 pTermina->setWindowTitle(tr("Terminal"));
592 lstWidget.push_back(pTermina);
593 }
594#endif
595 CParameterRecordUI* pRecord = new CParameterRecordUI(parent);
596 if(pRecord) {
597 int nRet = pRecord->SetParameter(&m_pParameterPlugin->m_Record);
598 if(!nRet)
599 lstWidget.push_back(pRecord);
600 }
601
602 CFrmMediaDevices* pMediaDevices = new CFrmMediaDevices(true, parent);
603 if(pMediaDevices) {
604 int nRet = pMediaDevices->SetParameter(&m_pParameterPlugin->m_MediaDevices.m_Para);
605 if(!nRet)
606 lstWidget.push_back(pMediaDevices);
607 }
608
610 foreach(auto pLoader, m_Plugins) {
611 auto plugin = pLoader->instance();
612 if(!plugin) continue;
613 QWidget* pSettings = nullptr;
614 bool bRet = QMetaObject::invokeMethod(
615 plugin,
616 "GetSettingsWidget",
617 Qt::DirectConnection,
618 Q_RETURN_ARG(QWidget*, pSettings),
619 Q_ARG(QWidget*, parent));
620 if(!bRet) {
621 qCritical(log) << "Call CPlugin::GetSettingsWidget() fail.";
622 continue;
623 }
624 if(!pSettings) continue;
625 lstWidget.push_back(pSettings);
626 }
628
629 return lstWidget;
630}
631
633{
634 int nRet = 0;
635 for(auto it = m_Plugins.begin(); it != m_Plugins.end(); it++)
636 {
637 CPlugin* p = qobject_cast<CPlugin*>(it.value()->instance());
638 nRet = handle->onProcess(it.key(), p);
639 if(nRet)
640 return nRet;
641 }
642 return nRet;
643}
644
645#if HAS_CPP_11
646int CManager::EnumPlugins(std::function<int(const QString &, CPlugin *)> cb)
647{
648 int nRet = 0;
649 for(auto it = m_Plugins.begin(); it != m_Plugins.end(); it++)
650 {
651 CPlugin* p = qobject_cast<CPlugin*>(it.value()->instance());
652 nRet = cb(it.key(), p);
653 if(nRet)
654 return nRet;
655 }
656 return nRet;
657}
658#endif
659
660const QString CManager::Details() const
661{
662 QString szDetail;
663#if HAVE_QTERMWIDGET
664 szDetail += COperateTerminal::Details();
665#endif
666#ifdef HAVE_LIBSSH
667 CChannelSSH channel(nullptr, nullptr);
668 szDetail += channel.GetDetails();
669#endif
670#if HAVE_QTKEYCHAIN
671 szDetail += "- QtKeyChain\n" +
672 QString(" - ") + tr("Version:")
673 + " 0x" + QString::number(QTKEYCHAIN_VERSION, 16) + "\n";
674#endif
675
676 if(!szDetail.isEmpty()) {
677 szDetail = "## " + tr("Dependency libraries") + "\n" + szDetail;
678 }
679
680 if(m_pParameterPlugin)
681 szDetail += m_pParameterPlugin->GetGlobalParameters()->m_Database.Details();
682
683 szDetail += m_szDetails;
684 return szDetail;
685}
686
687void CManager::slotCaptureAllKeyboard()
688{
689 Q_ASSERT(m_pParameterPlugin);
690 if(m_pParameterPlugin->GetCaptureAllKeyboard()) {
691 if(m_pHook) return;
692 m_pHook = CHook::GetHook(m_pParameterPlugin, this);
693 if(m_pHook)
694 m_pHook->RegisterKeyboard();
695 } else {
696 if(m_pHook) {
697 m_pHook->UnRegisterKeyboard();
698 m_pHook->deleteLater();
699 m_pHook = nullptr;
700 }
701 }
702}
static int RemoveTranslation()
Remove translation.
Definition Channel.cpp:142
static int InitTranslation()
Initial translation.
Definition Channel.cpp:134
File database.
Definition Database.h:164
bool Save(const QString &szFile)
Save.
Definition Database.cpp:756
QByteArray Load(const QString &szFile)
Load.
Definition Database.cpp:732
bool SetDatabase(const CDatabase *db)
Share an existing database.
Definition Database.cpp:34
virtual int SetParameter(CParameter *pParameter) override
[override functions]
The Handle COperate class.
Definition Manager.h:172
virtual int onProcess(const QString &id, CPlugin *pPlugin)=0
Process plugins.
Manage plugins.
Definition Manager.h:49
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
Get parameter settings widget.
Definition Manager.cpp:560
virtual int EnumPlugins(Handle *handle)
Enum plugins.
Definition Manager.cpp:632
virtual COperate * CreateOperate(const QString &id)
New COperate pointer, the owner is caller.
Definition Manager.cpp:359
int LoadPlugin(const QString &szPath)
LoadPlugin.
Definition Manager.cpp:292
virtual COperate * LoadOperate(const QString &szFile)
New COperate pointer from file, the owner is caller.
Definition Manager.cpp:420
virtual int DeleteOperate(COperate *p)
Delete COperate.
Definition Manager.cpp:387
virtual int SaveOperate(COperate *pOperate)
Accept Operate parameters to file.
Definition Manager.cpp:471
int AppendPlugin(QPluginLoader *pLoader, CPlugin *p)
Append Plugin.
Definition Manager.cpp:324
int Initial(QString szFile=QString())
Initial.
Definition Manager.cpp:89
QMap< QString, QPluginLoader * > m_Plugins
ID -> CPlugin.
Definition Manager.h:241
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
Definition Manager.cpp:539
CParameterGlobal * GetGlobalParameters()
Get Global Parameters.
Definition Manager.cpp:553
void sigNewOperate(COperate *pOperate, bool bOpenSettingsDialog)
This signal is triggered when a new operate is created in the plugin.
virtual int LoadSettings(const QString szFile=QString())
Load Client parameters from file.
Definition Manager.cpp:525
Operate interface.
Definition Operate.h:51
Global parameters.
virtual int SetParameter(CParameter *pParameter) override
[override functions]
Global parameters of plugins.
CParameterGlobal * GetGlobalParameters()
Get global parameters.
virtual int SetParameter(CParameter *pParameter) override
[override functions]
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.
Definition Parameter.cpp:47
virtual int Load(QString szFile=QString())
Load from file.
Definition Parameter.cpp:35
Plugin interface.
Definition Plugin.h:15
virtual const QString Version() const =0
Version.
void sigNewOperate(COperate *pOperate, bool bOpenSettingsDialog)
This signal is triggered when a new operate is created in the plugin.
virtual const QString Details() const =0
Display more information in About dialog or log.
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.
Definition Plugin.cpp:76
virtual const QString Protocol() const =0
Plugin Protocol.
virtual const QString Id() const
ID. Default: Type() + ":" + Protocol() + ":" + Name()
Definition Plugin.cpp:71
virtual const QString Description() const =0
Plugin description.