6#include <QGenericArgument>
8#include <QLoggingCategory>
13#include "PluginClient.h"
14#include "RabbitCommonTools.h"
15#include "RabbitCommonDir.h"
17static Q_LOGGING_CATEGORY(log,
"Client.Connecter")
20 m_pPluginClient(plugin),
26 if(QApplication::clipboard())
28 check = connect(QApplication::clipboard(), SIGNAL(dataChanged()),
29 this, SIGNAL(sigClipBoardChanged()));
34CConnecter::~CConnecter()
36 qDebug(log) <<
"CConnecter::~CConnecter";
41 QString szId =
Protocol() +
"_" + GetPlugClient()->
Name();
47 return GetPlugClient()->
Name();
52 return tr(
"Name: ") +
Name() +
"\n"
58 + tr(
"Description: ") + GetPlugClient()->
Description();
68 return GetPlugClient()->Icon();
73 QClipboard* pClipboard = QApplication::clipboard();
77 pClipboard->setMimeData(data);
87 int nRet = QDialog::Accepted;
95 p->setWindowIcon(this->
Icon());
96 p->setWindowTitle(tr(
"Set ") + GetPlugClient()->DisplayName());
97 p->setAttribute(Qt::WA_DeleteOnClose);
98 nRet = RC_SHOW_WINDOW(p);
100 qCritical(log) <<
"The Protocol [" <<
Protocol() <<
"] don't settings dialog";
107 if(m_Menu.actions().isEmpty())
112QString CConnecter::GetSettingsFile()
114 if(m_szSettings.isEmpty())
116 m_szSettings = RabbitCommon::CDir::Instance()->GetDirUserData()
124int CConnecter::SetSettingsFile(
const QString &szFile)
126 m_szSettings = szFile;
132 Q_ASSERT(!szFile.isEmpty());
135 qCritical(log) <<
"The load file is empty";
138 QSettings set(szFile, QSettings::IniFormat);
144 Q_ASSERT(!szFile.isEmpty());
147 qCritical(log) <<
"The load file is empty";
150 QSettings set(szFile, QSettings::IniFormat);
157 Q_ASSERT(m_pParameter);
159 nRet = m_pParameter->
Load(set);
166 Q_ASSERT(m_pParameter);
168 m_pParameter->
Save(set);
175 m_Menu.setIcon(m_pPluginClient->Icon());
178 m_Menu.setStatusTip(m_pPluginClient->
DisplayName());
180 m_pSettings =
new QAction(QIcon::fromTheme(
"system-settings"),
181 tr(
"Settings"), &m_Menu);
183 bool check = connect(m_pSettings, SIGNAL(triggered()),
184 this, SLOT(slotSettings()));
199 QString szMsg =
"The CConnecter is not parameters! "
200 "please first create parameters, "
201 "then call SetParameter in the ";
202 szMsg += metaObject()->className() + QString(
"::")
203 + metaObject()->className();
204 szMsg += QString(
" or ") + metaObject()->className()
205 + QString(
"::") +
"Initial()";
206 szMsg +=
" to set the parameters pointer. "
207 "Default set CParameterClient for the parameters of connecter "
208 "(CParameterConnecter or its derived classes) "
209 "See: CClient::CreateConnecter. "
210 "If you are sure the parameter of connecter "
211 "does not need CParameterClient. "
212 "Please overload the SetParameterClient in the ";
213 szMsg += QString(metaObject()->className()) +
" . don't set it";
214 qCritical(log) << szMsg.toStdString().c_str();
224 m_pParameter->disconnect(
this);
238 return m_pPluginClient;
241void CConnecter::slotShowServerName()
246void CConnecter::slotUpdateName()
251QObject* CConnecter::createObject(
const QString& className, QObject* parent)
255#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
256 QMetaType::fromName(className.toStdString().c_str()).id();
258 QMetaType::type(className.toStdString().c_str());
260 if(QMetaType::UnknownType == type)
262 qCritical(log) << className <<
" is QMetaType::UnknownType";
266#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
267 (QObject*)QMetaType(type).create();
269 (QObject*)QMetaType::create(type);
273 qCritical(log) <<
"QMetaType::create fail: " << type;
284 QObject *obj = createObject(className);
285 Q_ASSERT_X(obj,
"Connecter", QString(
"Create object failed: " + className).toStdString().c_str());
293 if(-1 == obj->metaObject()->indexOfMethod(
"SetContext(void*)"))
296 szErr =
"The class " + className +
" is not method SetContext. It must be SetContext(void*) method.";
297 qCritical(log) << szErr;
298 Q_ASSERT_X(
false,
"Connecter", szErr.toStdString().c_str());
300 obj->metaObject()->invokeMethod(obj,
"SetContext", Q_ARG(
void*, pContext));
301 if(-1 < obj->metaObject()->indexOfMethod(
"SetConnecter(CConnecter*)"))
303 obj->metaObject()->invokeMethod(obj,
"SetConnecter", Q_ARG(
CConnecter*,
this));
306 if(obj->inherits(
"QDialog"))
308 QDialog* pDlg = qobject_cast<QDialog*>(obj);
309 pDlg->setAttribute(Qt::WA_DeleteOnClose);
311 pDlg, SLOT(reject()));
313 nRet = RC_SHOW_WINDOW(pDlg);
314 }
else if(obj->inherits(
"QWidget")) {
315 QWidget* pWdg = qobject_cast<QWidget*>(obj);
316 pWdg->setAttribute(Qt::WA_DeleteOnClose);
318 pWdg, SLOT(close()));
320 nRet = RC_SHOW_WINDOW(pWdg);
325 QMessageBox::StandardButtons buttons,
326 QMessageBox::StandardButton &nRet,
328 QString szCheckBoxContext)
330 QCheckBox* pBox =
nullptr;
331 QMessageBox msg(QMessageBox::Information,
332 szTitle, szMessage, buttons,
GetViewer());
333 if(!szCheckBoxContext.isEmpty())
335 pBox =
new QCheckBox(szCheckBoxContext);
337 pBox->setCheckable(
true);
338 msg.setCheckBox(pBox);
340 nRet = (QMessageBox::StandardButton)RC_SHOW_WINDOW(&msg);
342 checkBox = pBox->isChecked();
346 const QString &szMessage,
350 QString t = QInputDialog::getText(
nullptr,
356 if(ok && !t.isEmpty())
360void CConnecter::slotSettings()
void sigUpdateName(const QString &szName)
virtual void slotBlockShowWidget(const QString &className, int &nRet, void *pContext)
阻塞后台线程,并在前台线程中显示窗口。
virtual const QIcon Icon() const
Icon
virtual void slotBlockInputDialog(const QString &szTitle, const QString &szLable, const QString &szMessage, QString &szText)
Block background threads and display input dialogs in foreground threads (QInputDialog)
virtual int Load(QSettings &set)
加载参数
virtual Q_INVOKABLE int SetParameterClient(CParameterClient *pPara)
Set CParameterClient
virtual Q_INVOKABLE int Clean()
Clean parameters and resource
virtual QDialog * OnOpenDialogSettings(QWidget *parent=nullptr)=0
得到设置对话框
virtual int OpenDialogSettings(QWidget *parent=nullptr)
打开设置对话框
virtual QWidget * GetViewer()=0
得到显示视图
void sigDisconnected()
断开连接成功信号。仅由插件触发
virtual int Save(QSettings &set)
保存参数
virtual int SetParameter(CParameter *p)
设置参数
virtual const QString Description()
Description
virtual const QString Protocol() const
Protocol
virtual const QString Id()
Identity
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get operate menu
virtual void slotSetClipboard(QMimeData *data)
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
virtual const QString Name()
Name
virtual void slotBlockShowMessageBox(const QString &szTitle, const QString &szMessage, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton &nRet, bool &checkBox, QString szCheckBoxContext=QString())
阻塞后台线程,并在前台线程中显示消息对话框(QMessageBox)
客户端库 (CClient) 参数。仅在客户端库 (CClient) 和插件中使用。
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file
virtual int Load(QString szFile=QString())
Load from file
客户端插件接口。用于建立 CConnecter 实例,它由协议插件实现。
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Description() const =0
描述
virtual const QString Name() const =0
插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。
virtual const QString Protocol() const =0
协议