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