玉兔远程控制 0.0.32
载入中...
搜索中...
未找到
ConnecterWakeOnLan.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QHBoxLayout>
5#include <QVBoxLayout>
6#include <QRegularExpression>
7#include <QPushButton>
8#include <QCheckBox>
9#include <QtGlobal>
10#include <QCoreApplication>
11#include "RabbitCommonTools.h"
12#include "PluginClient.h"
13
14#include "ParameterWakeOnLanUI.h"
15#include "ConnecterWakeOnLan.h"
16
17static Q_LOGGING_CATEGORY(log, "WakeOnLan.Connecter")
19 : CConnecterConnect(plugin)
20 , m_pView(nullptr)
21 , m_pModel(nullptr)
22 , m_pParameterClient(nullptr)
23{
24 qDebug(log) << Q_FUNC_INFO;
25}
26
27CConnecterWakeOnLan::~CConnecterWakeOnLan()
28{
29 qDebug(log) << Q_FUNC_INFO;
30}
31
33{
34 return 0;
35}
36
38{
39 int nRet = CConnecter::Initial();
40 if(nRet) return nRet;
41 qDebug(log) << Q_FUNC_INFO;
42 bool check = false;
43 CPluginClient* plugin = GetPlugClient();
44 m_pModel = new CWakeOnLanModel(this);
45 if(!m_pModel)
46 return -1;
47 m_pView = new CFrmWakeOnLan(m_pModel);
48 if(!m_pView) return -2;
49 m_pView->setWindowTitle(plugin->Name());
50 check = connect(m_pView, &CFrmWakeOnLan::customContextMenuRequested,
51 this, [&](const QPoint &pos){
52 m_Menu.exec(m_pView->mapToGlobal(pos));
53 });
54 Q_ASSERT(check);
55
56 m_Menu.addAction(QIcon::fromTheme("list-add"), tr("Add"),
57 this, SLOT(slotAdd()));
58 m_Menu.addAction(QIcon::fromTheme("document-edit"), tr("Edit"),
59 this, [&](){
60 QSharedPointer<CParameterWakeOnLan> para
61 = m_pModel->GetData(m_pView->GetCurrentIndex());
62 if(!para) {
63 QMessageBox::information(
64 nullptr,
65 tr("Information"),
66 tr("Please select a item"));
67 return;
68 }
70 dlg.SetParameter(para.data());
71 RC_SHOW_WINDOW(&dlg);
72 });
73 m_Menu.addAction(QIcon::fromTheme("list-remove"), tr("Remove"),
74 m_pView, SLOT(slotRemoveRow()));
75#if defined(Q_OS_UNIX)
76 if(RabbitCommon::CTools::HasAdministratorPrivilege())
77 {
78 m_Menu.addAction(QIcon::fromTheme("view-refresh"), tr("Refresh"),
79 this, [&](){
80 foreach(auto p, m_pModel->m_Data)
81 m_Arp.GetMac(p);
82 });
83 m_Menu.addAction(
84 QIcon::fromTheme("mac"), tr("Get mac address"),
85 this, [&](){
86 if(!m_pModel || !m_pView)
87 return;
88 foreach(auto index, m_pView->GetSelect()) {
89 QSharedPointer<CParameterWakeOnLan> p
90 = m_pModel->GetData(index);
91 if(!p) continue;
92 if(m_Arp.GetMac(p))
93 p->SetHostState(CParameterWakeOnLan::HostState::GetMac);
94 }
95 });
96 }
97#else
98 m_Menu.addAction(QIcon::fromTheme("view-refresh"), tr("Refresh"),
99 this, [&](){
100 foreach(auto p, m_pModel->m_Data)
101 m_Arp.GetMac(p);
102 });
103 m_Menu.addAction(
104 QIcon::fromTheme("mac"), tr("Get mac address"),
105 this, [&](){
106 if(!m_pModel || !m_pView)
107 return;
108 foreach(auto index, m_pView->GetSelect()) {
109 QSharedPointer<CParameterWakeOnLan> p = m_pModel->GetData(index);
110 if(!p) continue;
111 if(m_Arp.GetMac(p))
112 p->SetHostState(CParameterWakeOnLan::HostState::GetMac);
113 }
114 });
115#endif
116 m_Menu.addAction(
117 QIcon::fromTheme("lan"), tr("Wake on lan"),
118 this, [&](){
119 if(!m_pModel || !m_pView)
120 return;
121 foreach(auto index, m_pView->GetSelect()) {
122 QSharedPointer<CParameterWakeOnLan> p = m_pModel->GetData(index);
123 if(!p) continue;
124 if(!m_Arp.WakeOnLan(p))
125 p->SetHostState(CParameterWakeOnLan::HostState::WakeOnLan);
126 }
127 });
128
129 return 0;
130}
131
133{
134 qDebug(log) << Q_FUNC_INFO;
135 if(m_pView)
136 delete m_pView;
137 if(m_pModel)
138 delete m_pModel;
139 return 0;
140}
141
143{
144 return m_pView;
145}
146
148{
149 return nullptr;
150}
151
153{
154 QString szId = Protocol() + "_" + GetPlugClient()->Name();
155 return szId;
156}
157
159{
160 QString szName;
161 if(GetParameter() && GetParameter()->GetParameterClient()
162 && GetParameter()->GetParameterClient()->GetShowProtocolPrefix())
163 szName = Protocol() + ":";
164 szName += GetPlugClient()->Name();
165 return szName;
166}
167
168int CConnecterWakeOnLan::Connect()
169{
170#if defined(Q_OS_UNIX)
171 if(!RabbitCommon::CTools::HasAdministratorPrivilege())
172 {
173 static bool bShow = false;
174 if(!bShow) {
175 bShow = true;
176 int nRet = 0;
177 QMessageBox msg(
178 QMessageBox::Warning, tr("Warning"),
179 tr("There are no administrator privileges, "
180 "and some functions(Get mac address) are restricted. "
181 "Please restart the program with administrative privileges."),
182 QMessageBox::Yes | QMessageBox::No);
183 msg.setCheckBox(new QCheckBox(tr("Exit the program"), &msg));
184 msg.checkBox()->setCheckable(true);
185 nRet = msg.exec();
186 if(QMessageBox::Yes == nRet) {
187 bool bRet = RabbitCommon::CTools::executeByRoot(
188 QCoreApplication::applicationFilePath());
189 qDebug(log) << "Execute:" << bRet << QCoreApplication::applicationFilePath();
190 if(bRet && msg.checkBox()->isChecked()) {
191 QCoreApplication::quit();
192 }
193 }
194 }
195 }
196#endif
197 emit sigConnected();
198 return 0;
199}
200
201int CConnecterWakeOnLan::DisConnect()
202{
203 emit sigDisconnected();
204 return 0;
205}
206
208{
209 return nullptr;
210}
211
213{
214 m_pParameterClient = pPara;
215 return 0;
216}
217
218int CConnecterWakeOnLan::Load(QSettings &set)
219{
220 if(!m_pModel) return -1;
221 return m_pModel->Load(set, m_pParameterClient);
222}
223
224int CConnecterWakeOnLan::Save(QSettings &set)
225{
226 if(!m_pModel) return -1;
227 return m_pModel->Save(set);
228}
229
230void CConnecterWakeOnLan::slotAdd()
231{
232 QSharedPointer<CParameterWakeOnLan> para(new CParameterWakeOnLan());
233 para->SetParameterClient(m_pParameterClient);
235 dlg.SetParameter(para.data());
236 int nRet = RC_SHOW_WINDOW(&dlg);
237 if(QDialog::Accepted == nRet)
238 m_pModel->AddItem(para);
239}
连接接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Connect()、 slotTimeOut()、 OnProcess() 。 当然,它仍...
Definition Connect.h:45
插件的连接者接口,此接口仅由插件使用。 所有的需要 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
Definition Connecter.cpp:60
virtual int Initial()
Initial parameters and resource
客户端库 (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))名与其相关。