玉兔远程控制 0.1.0-bate8
载入中...
搜索中...
未找到
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 if(m_pHook) {
62 m_pHook->UnRegisterKeyboard();
63 m_pHook->deleteLater();
64 m_pHook = nullptr;
65 }
66
67 if(m_pParameterPlugin) {
68 m_pParameterPlugin->deleteLater();
69 m_pParameterPlugin = nullptr;
70 }
71
72 if(m_Translator)
73 RabbitCommon::CTools::Instance()->RemoveTranslator(m_Translator);
74
76
77 //#if defined (_DEBUG) || !defined(BUILD_SHARED_LIBS)
78 // Q_CLEANUP_RESOURCE(translations_Plugin);
79 //#endif
80}
81
82int CManager::Initial(QString szFile)
83{
84 bool check = false;
85 //#if defined (_DEBUG) || !defined(BUILD_SHARED_LIBS)
86 // Q_INIT_RESOURCE(translations_Plugin);
87 //#endif
88
89 m_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
90 "Plugin", RabbitCommon::CTools::TranslationType::Library);
91
92 m_szSettingsFile = szFile;
93
95
96 m_pParameterPlugin = new CParameterPlugin();
97 if(m_pParameterPlugin) {
98 LoadSettings(m_szSettingsFile);
99
100 // Initial database
101 auto pg = GetGlobalParameters();
102 Q_ASSERT(pg);
103 QString szFile;
104 szFile = pg->m_Database.GetDatabaseName();
105 bool bRet = pg->m_DatabaseLocal.OpenSQLiteDatabase(szFile, "Local_connect");
106 if(!bRet) return -1;
107 bRet = pg->m_DatabaseRemote.OpenDatabase(&pg->m_Database, "Remote_connect");
108 if(!bRet) return -1;
109 bRet = m_pParameterPlugin->m_WhiteList.InitDatabase(&pg->m_DatabaseLocal);
110 if(!bRet) return -1;
111 bRet = m_pParameterPlugin->m_BlackList.InitDatabase(&pg->m_DatabaseLocal);
112 if(!bRet) return -1;
113
114 bool bReboot = true;
115 QString szSnap;
116 QString szFlatpak;
117#if defined(Q_OS_ANDROID)
118 bReboot = false;
119#endif
120#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0) && defined(Q_OS_WIN)
121 szSnap = qEnvironmentVariable("SNAP");
122 szFlatpak = qEnvironmentVariable("FLATPAK_ID");
123#else
124 szSnap = QString::fromLocal8Bit(qgetenv("SNAP"));
125 szFlatpak = QString::fromLocal8Bit(qgetenv("FLATPAK_ID"));
126#endif
127 if(!szSnap.isEmpty() || !szFlatpak.isEmpty())
128 bReboot = false;
129 if(bReboot && !RabbitCommon::CTools::Instance()->HasAdministratorPrivilege()
130 && m_pParameterPlugin->GetPromptAdministratorPrivilege())
131 {
132 int nRet = 0;
133 QString szMsg;
134 szMsg = tr("The programe is not administrator privilege.\n"
135 "Some features are limited.\n");
136#if defined(Q_OS_WIN)
137 szMsg += tr("Eg: Can not disable system shortcuts(eg: Ctrl+Alt+del).") + "\n";
138#else
139 szMsg += tr("Eg: Can not use the wake on LAN feature.") + "\n";
140#endif
141 szMsg += tr("Restart program by administrator?");
142 QMessageBox msg(QMessageBox::Warning, tr("Warning"), szMsg,
143 QMessageBox::Yes | QMessageBox::No);
144 msg.setCheckBox(new QCheckBox(tr("Always shown"), &msg));
145 msg.checkBox()->setCheckable(true);
146 msg.checkBox()->setChecked(
147 m_pParameterPlugin->GetPromptAdministratorPrivilege());
148 nRet = msg.exec();
149
150 m_pParameterPlugin->SetPromptAdministratorPrivilege(
151 msg.checkBox()->isChecked());
152 SaveSettings(m_szSettingsFile);
153
154 if(QMessageBox::Yes == nRet) {
155 RabbitCommon::CTools::Instance()->StartWithAdministratorPrivilege(true);
156 return -1;
157 }
158 }
159
160 check = connect(m_pParameterPlugin, SIGNAL(sigCaptureAllKeyboard()),
161 this, SLOT(slotCaptureAllKeyboard()));
162 Q_ASSERT(check);
163 if(m_pParameterPlugin->GetCaptureAllKeyboard()) {
164 m_pHook = CHook::GetHook(m_pParameterPlugin, this);
165 if(m_pHook)
166 m_pHook->RegisterKeyboard();
167 }
168 } else {
169 qCritical(log) << "new CParameterPlugin() fail";
170 Q_ASSERT(m_pParameterPlugin);
171 }
172
173 LoadPlugins();
174
175 m_pDatabaseFile = new CDatabaseFile();
176 if(m_pDatabaseFile) {
177 auto pg = GetGlobalParameters();
178 bool bRet = m_pDatabaseFile->SetDatabase(&pg->m_DatabaseRemote);
179 if(!bRet) return -1;
180 }
181
182 return 0;
183}
184
185int CManager::LoadPlugins()
186{
187 int nRet = 0;
188 /*
189 foreach (QObject *plugin, QPluginLoader::staticInstances())
190 {
191 CPlugin* p = qobject_cast<CPlugin*>(plugin);
192 if(p)
193 {
194 if(m_Plugins.find(p->Id()) == m_Plugins.end())
195 {
196 qInfo(log) << "Success: Load plugin" << p->Name();
197 AppendPlugin(p);
198 }
199 else
200 qWarning(log) << "The plugin" << p->Name() << " is exist.";
201 }
202 }//*/
203
204 QStringList lstPaths;
205 if(m_pParameterPlugin->GetEnableSetPluginsPath()) {
206 lstPaths = m_pParameterPlugin->GetPluginsPath();
207 }
208 else
209 lstPaths << RabbitCommon::CDir::Instance()->GetDirPlugins();
210 if(lstPaths.isEmpty())
211 qWarning(log) << "The plugins path is empty. please set it from: `Menu` -> `Tools` -> `Settings` -> `Load Plugins`";
212
213 if(m_pParameterPlugin->GetOnlyLoadInWhitelist()) {
214 m_pParameterPlugin->m_WhiteList.OnProcess([this, lstPaths](const QString& szPath) -> int{
215 QFileInfo fi(szPath);
216 if(fi.isAbsolute())
217 return LoadPlugin(szPath);
218 foreach (auto d, lstPaths) {
219 if(d.isEmpty()) continue;
220 QString szFile = d + QDir::separator() + szPath;
221 return LoadPlugin(szFile);
222 }
223 return -1;
224 });
225 return 0;
226 }
227
228 foreach (auto szPath, lstPaths) {
229 //QString szPath = RabbitCommon::CDir::Instance()->GetDirPlugins();
230
231 QStringList filters;
232 if(filters.isEmpty())
233 {
234#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
235 filters << "*Plugin*.dll";
236#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
237 filters << "*Plugin*.dylib";
238#else
239 filters << "*Plugin*.so";
240#endif
241 }
242 nRet = FindPlugins(szPath, filters);
243 }
244
245 if(m_Plugins.empty()) {
246 qWarning(log) << "The plugins is empty. please set it from: `Menu` -> `Tools` -> `Settings` -> `Load Plugins`";
247 }
248
249 if(!m_szDetails.isEmpty())
250 m_szDetails = "## " + tr("Plugins") + "\n" + m_szDetails;
251
252 qDebug(log) << ("Client details:\n" + Details()).toStdString().c_str();
253 return 0;
254}
255
256int CManager::FindPlugins(QDir dir, QStringList filters)
257{
258 QString fileName;
259
260 QString szCurrentPath = QDir::currentPath();
261 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
262 if(!files.isEmpty())
263 {
264 //This method is invalid
265 //QCoreApplication::addLibraryPath(QDir::cleanPath(dir.absolutePath()));
266
267 QDir::setCurrent(QDir::cleanPath(dir.absolutePath()));
268
269 // This method is valid
270 //#if defined(Q_OS_WINDOWS)
271 // QString szPath = QString::fromLocal8Bit(qgetenv("PATH"));
272 // szPath += ";";
273 // szPath += QDir::cleanPath(dir.absolutePath());
274 // qputenv("PATH", szPath.toLatin1());
275 //#endif
276 }
277
278 foreach (fileName, files) {
279 QString szPlugins = dir.absoluteFilePath(fileName);
280 if(m_pParameterPlugin
281 && (!m_pParameterPlugin->m_WhiteList.contains(fileName) || !m_pParameterPlugin->m_WhiteList.contains(fileName))
282 && (m_pParameterPlugin->m_BlackList.contains(fileName) || m_pParameterPlugin->m_BlackList.contains(fileName))) {
283 qInfo(log) << "Filter:" << szPlugins << "in blacklist";
284 continue;
285 }
286 LoadPlugin(szPlugins);
287 }
288
289 foreach (fileName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
290 QDir pluginDir = dir;
291 if(pluginDir.cd(fileName))
292 FindPlugins(pluginDir, filters);
293 }
294
295 QDir::setCurrent(szCurrentPath);
296
297 return 0;
298}
299
300int CManager::LoadPlugin(const QString &szPath)
301{
302 int nRet = -1;
303 QPluginLoader loader(szPath);
304 QObject *plugin = loader.instance();
305 if (plugin) {
306 CPlugin* p = qobject_cast<CPlugin*>(plugin);
307 if(p)
308 {
309 if(m_Plugins.find(p->Id()) == m_Plugins.end())
310 {
311 qInfo(log) << "Success: Load plugin"
312 << p->Name() << "from" << szPath;
313 AppendPlugin(p);
314 }
315 else
316 qWarning(log) << "The plugin [" << p->Name() << "] is exist.";
317 return 0;
318 } else
319 qCritical(log) << "The plugin is not \"CPlugin\":" << szPath;
320 } else {
321 QString szMsg;
322 szMsg = "Error: Load plugin fail from " + szPath;
323 if(!loader.errorString().isEmpty())
324 szMsg += "; Error: " + loader.errorString();
325 qCritical(log) << szMsg.toStdString().c_str();
326 }
327 return nRet;
328}
329
331{
332 if(!p) return -1;
333 m_Plugins.insert(p->Id(), p);
334 //p->InitTranslator();
335 int val = 0;
336 bool bRet = QMetaObject::invokeMethod(
337 p,
338 "InitTranslator",
339 Qt::DirectConnection,
340 Q_RETURN_ARG(int, val));
341 if(!bRet || val)
342 {
343 qCritical(log) << "The plugin" << p->Name()
344 << "initial translator fail" << bRet << val;
345 }
346
347 m_szDetails += "### " + p->DisplayName() + "\n";
348 m_szDetails += "- " + tr("Version:") + " " + p->Version() + "\n";
349 m_szDetails += "- " + tr("Type:") + " " + p->TypeName(p->Type()) + "\n";
350 if(!p->Protocol().isEmpty())
351 m_szDetails += "- " + tr("Protocol:") + " " + p->Protocol() + "\n";
352 m_szDetails += "- " + tr("ID:") + " " + p->Id() + "\n";
353 if(!p->Description().isEmpty())
354 m_szDetails += "- " + tr("Description:") + " " + p->Description() + "\n";
355
356 if(!p->Details().isEmpty())
357 m_szDetails += p->Details() + "\n";
358
359 bRet = connect(p, &CPlugin::sigNewOperate, this, &CManager::sigNewOperate);
360 return 0;
361}
362
365{
366 COperate* pOperate = nullptr;
367 auto it = m_Plugins.find(id);
368 if(m_Plugins.end() != it)
369 {
370 bool bRet = 0;
371 qDebug(log) << "CreateOperate id:" << id;
372 auto plugin = it.value();
373 if(plugin) {
374 //p = plugin->CreateOperate(id);
375 bRet = QMetaObject::invokeMethod(
376 plugin,
377 "CreateOperate",
378 Qt::DirectConnection,
379 Q_RETURN_ARG(COperate*, pOperate),
380 Q_ARG(QString, id),
381 Q_ARG(CParameterPlugin*, m_pParameterPlugin));
382 if(!bRet) {
383 qCritical(log) << "Create COperate fail.";
384 return nullptr;
385 }
386 }
387 }
388 return pOperate;
389}
391
393{
394 qDebug(log) << Q_FUNC_INFO;
395 if(!p) return 0;
396
397 CPlugin* pPlugin = nullptr;
398 //pPlugin->GetPlugin();
399 bool bRet = QMetaObject::invokeMethod(
400 p,
401 "GetPlugin",
402 Qt::DirectConnection,
403 Q_RETURN_ARG(CPlugin*, pPlugin));
404
405 if(bRet && pPlugin) {
406 int nRet = 0;
407 //pPlugin->DeleteOperate(p);
408 bRet = QMetaObject::invokeMethod(
409 pPlugin,
410 "DeleteOperate",
411 Qt::DirectConnection,
412 Q_RETURN_ARG(int, nRet),
413 Q_ARG(COperate*, p));
414 if(!bRet) {
415 nRet = -1;
416 qCritical(log) << "Call pPlugin->DeleteOperate(p) fail";
417 }
418 return nRet;
419 }
420
421 qCritical(log) << "Get CManager fail.";
422 return -1;
423}
424
425COperate* CManager::LoadOperate(const QString &szFile)
426{
427 COperate* pOperate = nullptr;
428 if(szFile.isEmpty()) return nullptr;
429 qDebug(log) << "Load operate configure file:"<< szFile;
430 if(m_pParameterPlugin->GetGlobalParameters()->GetSaveSettingsType()
431 == CParameterGlobal::SaveSettingsType::Database && m_pDatabaseFile) {
432 qDebug(log) << "Load file from database";
433 QByteArray content = m_pDatabaseFile->Load(szFile);
434 if(!content.isEmpty()) {
435 QFile f(szFile);
436 if(!f.open(QFile::WriteOnly | QFile::Text)) return nullptr;
437 f.write(content.data(), content.length());
438 f.close();
439 }
440 }
441
442 QSettings set(szFile, QSettings::IniFormat);
443 m_FileVersion = set.value("Manage/FileVersion", m_FileVersion).toInt();
444 QString id = set.value("Plugin/ID").toString();
445 QString protocol = set.value("Plugin/Protocol").toString();
446 QString name = set.value("Plugin/Name").toString();
447 qDebug(log) << "LoadOperate protocol:" << protocol
448 << "name:" << name << "id:" << id;
449 pOperate = CreateOperate(id);
450 if(pOperate) {
451 int nRet = false;
452 //bRet = pOperate->Load(szFile);
453 bool bRet = QMetaObject::invokeMethod(
454 pOperate,
455 "Load",
456 Qt::DirectConnection,
457 Q_RETURN_ARG(int, nRet),
458 Q_ARG(QString, szFile));
459 if(!bRet) {
460 qCritical(log) << "Call pOperate->Load(szFile) fail.";
461 return nullptr;
462 }
463 if(nRet) {
464 qCritical(log) << "Load parameter fail" << nRet;
465 DeleteOperate(pOperate);
466 return nullptr;
467 }
468 pOperate->SetSettingsFile(szFile);
469 }
470 else
471 qCritical(log) << "Don't create Operate:" << name << protocol << id << szFile;
472
473 return pOperate;
474}
475
477{
478 if(!pOperate) return -1;
479
480 QString szFile = pOperate->GetSettingsFile();
481 if(szFile.isEmpty())
482 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
483 + QDir::separator()
484 + pOperate->Id()
485 + ".rrc";
486
487 QSettings set(szFile, QSettings::IniFormat);
488 CPlugin* pPlugin = nullptr; //pOperate->GetPlugin;
489 bool bRet = QMetaObject::invokeMethod(
490 pOperate,
491 "GetPlugin",
492 Qt::DirectConnection,
493 Q_RETURN_ARG(CPlugin*, pPlugin));
494 if(!bRet || !pPlugin)
495 {
496 qCritical(log) << "Get plugin client fail";
497 }
498 Q_ASSERT(pPlugin);
499
500 set.setValue("Manage/FileVersion", m_FileVersion);
501 set.setValue("Plugin/ID", pPlugin->Id());
502 set.setValue("Plugin/Protocol", pPlugin->Protocol());
503 set.setValue("Plugin/Name", pPlugin->Name());
504 int nRet = 0;
505 //nRet = pOperate->Save(szFile);
506 bRet = QMetaObject::invokeMethod(
507 pOperate,
508 "Save",
509 Qt::DirectConnection,
510 Q_RETURN_ARG(int, nRet),
511 Q_ARG(QString, szFile));
512 if(!bRet) {
513 qCritical(log) << "Call pOperate->Save(szFile) fail.";
514 return -1;
515 }
516 if(nRet) {
517 qCritical(log) << "Save parameter fail" << nRet;
518 return -2;
519 }
520
521 if(m_pParameterPlugin->GetGlobalParameters()->GetSaveSettingsType()
522 == CParameterGlobal::SaveSettingsType::Database && m_pDatabaseFile) {
523 qDebug(log) << "Save file to database";
524 return m_pDatabaseFile->Save(szFile) ? 0 : -1;
525 }
526
527 return 0;
528}
529
530int CManager::LoadSettings(const QString szFile)
531{
532 if(!m_pParameterPlugin) {
533 qCritical(log) << "The m_pParameter is nullptr";
534 Q_ASSERT_X(m_pParameterPlugin, "CManager", "The m_pParameter is nullptr");
535 return -1;
536 }
537
538 QString s = szFile;
539 if(s.isEmpty())
540 s = m_szSettingsFile;
541 return m_pParameterPlugin->Load(s);
542}
543
544int CManager::SaveSettings(const QString szFile)
545{
546 if(!m_pParameterPlugin) {
547 qCritical(log) << "The m_pParameter is nullptr";
548 Q_ASSERT_X(m_pParameterPlugin, "CManager", "The m_pParameter is nullptr");
549 return -1;
550 }
551
552 QString s = szFile;
553 if(s.isEmpty())
554 s = m_szSettingsFile;
555 return m_pParameterPlugin->Save(s);
556}
557
559{
560 if(m_pParameterPlugin)
561 return m_pParameterPlugin->GetGlobalParameters();
562 return nullptr;
563}
564
565QList<QWidget*> CManager::GetSettingsWidgets(QWidget* parent)
566{
567 QList<QWidget*> lstWidget;
568
569 CFrmManagePlugins* pManagePlugins = new CFrmManagePlugins(parent);
570 if(pManagePlugins) {
571 int nRet = pManagePlugins->SetParameter(m_pParameterPlugin);
572 if(!nRet)
573 lstWidget.push_back(pManagePlugins);
574 }
575
576 CParameterPluginUI* pClient = new CParameterPluginUI(parent);
577 if(pClient) {
578 int nRet = pClient->SetParameter(m_pParameterPlugin);
579 if(!nRet)
580 lstWidget.push_back(pClient);
581 }
582
583 auto pDatabase = new CParameterDatabaseUI(parent);
584 if(pDatabase) {
585 if(GetGlobalParameters()) {
586 int nRet = pDatabase->SetParameter(GetGlobalParameters());
587 if(!nRet)
588 lstWidget.push_back(pDatabase);
589 }
590 }
591
592#if defined(HAVE_QTERMWIDGET)
593 CParameterTerminalUI* pTermina = new CParameterTerminalUI(parent);
594 if(pTermina) {
595 pTermina->SetParameter(&m_pParameterPlugin->m_Terminal);
596 pTermina->setWindowTitle(tr("Terminal"));
597 lstWidget.push_back(pTermina);
598 }
599#endif
600 CParameterRecordUI* pRecord = new CParameterRecordUI(parent);
601 if(pRecord) {
602 int nRet = pRecord->SetParameter(&m_pParameterPlugin->m_Record);
603 if(!nRet)
604 lstWidget.push_back(pRecord);
605 }
606
607 CFrmMediaDevices* pMediaDevices = new CFrmMediaDevices(parent);
608 if(pMediaDevices) {
609 int nRet = pMediaDevices->SetParameter(&m_pParameterPlugin->m_MediaDevices.m_Para);
610 if(!nRet)
611 lstWidget.push_back(pMediaDevices);
612 }
613
615 foreach(auto plugin, m_Plugins) {
616 if(!plugin) continue;
617 QWidget* pSettings = nullptr;
618 bool bRet = QMetaObject::invokeMethod(
619 plugin,
620 "GetSettingsWidget",
621 Qt::DirectConnection,
622 Q_RETURN_ARG(QWidget*, pSettings),
623 Q_ARG(QWidget*, parent));
624 if(!bRet) {
625 qCritical(log) << "Call CPlugin::GetSettingsWidget() fail.";
626 continue;
627 }
628 if(!pSettings) continue;
629 lstWidget.push_back(pSettings);
630 }
632
633 return lstWidget;
634}
635
637{
638 int nRet = 0;
639 QMap<QString, CPlugin*>::iterator it;
640 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
641 {
642 nRet = handle->onProcess(it.key(), it.value());
643 if(nRet)
644 return nRet;
645 }
646 return nRet;
647}
648
649#if HAS_CPP_11
650int CManager::EnumPlugins(std::function<int(const QString &, CPlugin *)> cb)
651{
652 int nRet = 0;
653 QMap<QString, CPlugin*>::iterator it;
654 for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
655 {
656 nRet = cb(it.key(), it.value());
657 if(nRet)
658 return nRet;
659 }
660 return nRet;
661}
662#endif
663
664const QString CManager::Details() const
665{
666 QString szDetail;
667#if HAVE_QTERMWIDGET
668 szDetail += COperateTerminal::Details();
669#endif
670#ifdef HAVE_LIBSSH
671 CChannelSSH channel(nullptr, nullptr);
672 szDetail += channel.GetDetails();
673#endif
674#if HAVE_QTKEYCHAIN
675 szDetail += "- QtKeyChain\n" +
676 QString(" - ") + tr("Version:")
677 + " 0x" + QString::number(QTKEYCHAIN_VERSION, 16) + "\n";
678#endif
679
680 if(!szDetail.isEmpty()) {
681 szDetail = "## " + tr("Dependency libraries") + "\n" + szDetail;
682 }
683
684 if(m_pParameterPlugin)
685 szDetail += m_pParameterPlugin->GetGlobalParameters()->m_Database.Details();
686
687 szDetail += m_szDetails;
688 return szDetail;
689}
690
691void CManager::slotCaptureAllKeyboard()
692{
693 Q_ASSERT(m_pParameterPlugin);
694 if(m_pParameterPlugin->GetCaptureAllKeyboard()) {
695 if(m_pHook) return;
696 m_pHook = CHook::GetHook(m_pParameterPlugin, this);
697 if(m_pHook)
698 m_pHook->RegisterKeyboard();
699 } else {
700 if(m_pHook) {
701 m_pHook->UnRegisterKeyboard();
702 m_pHook->deleteLater();
703 m_pHook = nullptr;
704 }
705 }
706}
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]
处理连接者。用于客户端得到连接者信号
Definition Manager.h:171
virtual int onProcess(const QString &id, CPlugin *pPlugin)=0
Process plugins
管理插件
Definition Manager.h:48
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
得到设置参数窗口
Definition Manager.cpp:565
virtual int EnumPlugins(Handle *handle)
Enum plugins
Definition Manager.cpp:636
virtual COperate * CreateOperate(const QString &id)
新建 COperate 指针,所有者是调用者。 当不在使用时,调用者必调用 DeteleOperate() 须释放指针。 调用者必须连接信号 COperate::sigFinished 。 释放指针 (...
Definition Manager.cpp:364
int LoadPlugin(const QString &szPath)
LoadPlugin
Definition Manager.cpp:300
virtual COperate * LoadOperate(const QString &szFile)
从文件中新建 COperate 指针,所有者是调用者。 当不再使用时,调用者必须负责调用 DeleteOperate() 删除此指针。 调用者必须连接信号 COperate::sigFinished 。...
Definition Manager.cpp:425
virtual int DeleteOperate(COperate *p)
Delete COperate
Definition Manager.cpp:392
virtual int SaveOperate(COperate *pOperate)
保存连接参数到文件
Definition Manager.cpp:476
int Initial(QString szFile=QString())
Initial
Definition Manager.cpp:82
int AppendPlugin(CPlugin *plugin)
Append Plugin
Definition Manager.cpp:330
virtual int SaveSettings(const QString szFile=QString())
保存客户端参数到文件
Definition Manager.cpp:544
CParameterGlobal * GetGlobalParameters()
得到全局参数
Definition Manager.cpp:558
void sigNewOperate(COperate *pOperate, bool bOpenSettingsDialog)
当在插件中新建操作时,触发此信号
virtual int LoadSettings(const QString szFile=QString())
从文件中加载客户端参数
Definition Manager.cpp:530
QMap< QString, CPlugin * > m_Plugins
ID -> CPlugin
Definition Manager.h:240
操作接口。
Definition Operate.h:51
virtual const QString Id()
标识
Definition Operate.cpp:36
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
Definition Parameter.cpp:47
virtual int Load(QString szFile=QString())
Load from file
Definition Parameter.cpp:35
插件接口
Definition Plugin.h:15
virtual const QString Version() const =0
Version
void sigNewOperate(COperate *pOperate, bool bOpenSettingsDialog)
当在插件中新建操作时,触发此信号
virtual const QString Details() const =0
显示更多细节。 例如: 在关于对话框或日志中显示。 包括插件的依赖库的版本信息和描述等
virtual const QString Name() const =0
插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。
virtual const QString DisplayName() const
在界面上显示的名称
Definition Plugin.cpp:76
virtual const QString Protocol() const =0
协议
virtual const QString Id() const
标识。默认: Type() + ":" + Protocol() + ":" + Name()
Definition Plugin.cpp:71
virtual const QString Description() const =0
描述