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