3#include <QLoggingCategory>
6#include <QRegularExpression>
10#include <QCoreApplication>
11#include "RabbitCommonTools.h"
12#include "PluginClient.h"
14#include "ParameterWakeOnLanUI.h"
15#include "ConnecterWakeOnLan.h"
17static Q_LOGGING_CATEGORY(log,
"WakeOnLan.Connecter")
22 , m_pParameterClient(
nullptr)
24 qDebug(log) << Q_FUNC_INFO;
27CConnecterWakeOnLan::~CConnecterWakeOnLan()
29 qDebug(log) << Q_FUNC_INFO;
41 qDebug(log) << Q_FUNC_INFO;
48 if(!m_pView)
return -2;
49 m_pView->setWindowTitle(plugin->
Name());
53 check = connect(m_pView, &CFrmWakeOnLan::customContextMenuRequested,
54 this, [&](
const QPoint &pos){
55 m_Menu.exec(m_pView->mapToGlobal(pos));
59 m_Menu.addAction(QIcon::fromTheme(
"list-add"), tr(
"Add"),
60 this, SLOT(slotAdd()));
61 m_Menu.addAction(QIcon::fromTheme(
"document-edit"), tr(
"Edit"),
63 QSharedPointer<CParameterWakeOnLan> para
64 = m_pModel->GetData(m_pView->GetCurrentIndex());
66 QMessageBox::information(
69 tr(
"Please select a item"));
76 m_Menu.addAction(QIcon::fromTheme(
"list-remove"), tr(
"Remove"),
77 m_pView, SLOT(slotRemoveRow()));
79 QString szFlatpak_ID = qgetenv(
"FLATPAK_ID");
80 if(RabbitCommon::CTools::HasAdministratorPrivilege()
81 ||
"io.github.KangLin.RabbitRemoteControl" == szFlatpak_ID)
83 m_Menu.addAction(QIcon::fromTheme(
"view-refresh"), tr(
"Refresh"),
85 foreach(
auto p, m_pModel->m_Data)
89 QIcon::fromTheme(
"mac"), tr(
"Get mac address"),
91 if(!m_pModel || !m_pView)
93 foreach(
auto index, m_pView->GetSelect()) {
94 QSharedPointer<CParameterWakeOnLan> p
95 = m_pModel->GetData(index);
98 p->SetHostState(CParameterWakeOnLan::HostState::GetMac);
103 m_Menu.addAction(QIcon::fromTheme(
"view-refresh"), tr(
"Refresh"),
105 foreach(
auto p, m_pModel->m_Data)
109 QIcon::fromTheme(
"mac"), tr(
"Get mac address"),
111 if(!m_pModel || !m_pView)
113 foreach(
auto index, m_pView->GetSelect()) {
114 QSharedPointer<CParameterWakeOnLan> p = m_pModel->GetData(index);
117 p->SetHostState(CParameterWakeOnLan::HostState::GetMac);
122 QIcon::fromTheme(
"lan"), tr(
"Wake on lan"),
124 if(!m_pModel || !m_pView)
126 foreach(
auto index, m_pView->GetSelect()) {
127 QSharedPointer<CParameterWakeOnLan> p = m_pModel->GetData(index);
129 if(!m_Arp.WakeOnLan(p))
130 p->SetHostState(CParameterWakeOnLan::HostState::WakeOnLan);
139 qDebug(log) << Q_FUNC_INFO;
159 QString szId =
Protocol() +
"_" + GetPlugClient()->
Name();
167 &&
GetParameter()->GetParameterClient()->GetShowProtocolPrefix())
169 szName += GetPlugClient()->
Name();
173int CConnecterWakeOnLan::Connect()
175#if defined(Q_OS_UNIX)
176 if(!RabbitCommon::CTools::HasAdministratorPrivilege())
178 static bool bShow =
false;
183 QMessageBox::Warning, tr(
"Warning"),
184 tr(
"There are no administrator privileges, "
185 "and some functions(Get mac address) are restricted. "
186 "Please restart the program with administrative privileges."),
187 QMessageBox::Yes | QMessageBox::No);
188 msg.setCheckBox(
new QCheckBox(tr(
"Exit the program"), &msg));
189 msg.checkBox()->setCheckable(
true);
191 if(QMessageBox::Yes == nRet) {
192 QString szExec = QCoreApplication::applicationFilePath();
193 QString szAppImage = QString::fromLocal8Bit(qgetenv(
"APPIMAGE"));
194 if(!szAppImage.isEmpty())
196 if(!szExec.isEmpty()) {
197 bool bRet = RabbitCommon::CTools::ExecuteWithAdministratorPrivilege(szExec);
198 qDebug(log) <<
"Execute:" << bRet << QCoreApplication::applicationFilePath();
199 if(bRet && msg.checkBox()->isChecked()) {
200 QCoreApplication::quit();
211int CConnecterWakeOnLan::DisConnect()
224 m_pParameterClient = pPara;
230 if(!m_pModel)
return -1;
231 return m_pModel->Load(set, m_pParameterClient);
236 if(!m_pModel)
return -1;
237 return m_pModel->Save(set);
240void CConnecterWakeOnLan::slotAdd()
243 para->SetParameterClient(m_pParameterClient);
246 int nRet = RC_SHOW_WINDOW(&dlg);
247 if(QDialog::Accepted == nRet)
248 m_pModel->AddItem(para);
连接接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Connect()、 slotTimeOut()、 OnProcess() 。 当然,它仍...
插件的连接者接口,此接口仅由插件使用。 所有的需要 CConnect 的插件连接者均需要从此接口派生。
virtual CParameterBase * GetParameter()
Get parameter
virtual CConnect * InstanceConnect() override
新建 CConnect 对象。它的所有者是调用者, 如果调用者不再使用它,调用者必须负责释放它。
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
得到设置对话框
virtual int Clean() override
Clean parameters and resource
virtual const QString Name() override
显示顺序:
virtual int Save(QSettings &set) override
保存参数
virtual int Load(QSettings &set) override
加载参数
virtual QWidget * GetViewer() override
得到显示视图
virtual int Initial() override
Initial parameters and resource
virtual const QString Id() override
Identity
virtual int SetParameterClient(CParameterClient *pPara) override
Set CParameterClient
virtual qint16 Version() override
Version
void sigConnected()
连接成功信号。仅由插件触发。 应用程序需要在此时设置视图属性 Enabled 为 true 。允许接收键盘和鼠标事件
void sigDisconnected()
断开连接成功信号。仅由插件触发
virtual const QString Protocol() const
Protocol
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
void sigViewerFocusIn(QWidget *pView)
视图获得焦点
客户端库 (CClient) 参数。仅在客户端库 (CClient) 和插件中使用。
The wake on lan parameters UI
int SetParameter(CParameter *pParameter)
设置参数,并初始化界面
The wake on lan parameters.
客户端插件接口。用于建立 CConnecter 实例,它由协议插件实现。
virtual const QString Name() const =0
插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。