玉兔远程控制 0.0.36
载入中...
搜索中...
未找到
ConnecterConnect.cpp
1#include <QLoggingCategory>
2#include <QRegularExpression>
3#include "ConnecterConnect.h"
4#include "PluginClientThread.h"
5
6static Q_LOGGING_CATEGORY(log, "Client.Connecter.Connect")
8 : CConnecter(plugin)
9 , m_pConnect(nullptr)
10{
11 qDebug(log) << Q_FUNC_INFO;
12}
13
14CConnecterConnect::~CConnecterConnect()
15{
16 qDebug(log) << Q_FUNC_INFO;
17}
18
19const QString CConnecterConnect::Id()
20{
21 QString szId = Protocol() + "_" + GetPlugClient()->Name();
22 if(GetParameter())
23 {
24 if(!GetParameter()->GetName().isEmpty())
25 szId += "_" + GetParameter()->GetName();
26 if(!GetParameter()->m_Net.GetHost().isEmpty())
27 szId += "_" + GetParameter()->m_Net.GetHost()
28 + "_" + QString::number(GetParameter()->m_Net.GetPort());
29 }
30 static QRegularExpression exp("[-@:/#%!^&* \\.]");
31 szId = szId.replace(exp, "_");
32 return szId;
33}
34
52{
53 QString szName;
54 if(GetParameter() && GetParameter()->GetParameterClient()
55 && GetParameter()->GetParameterClient()->GetShowProtocolPrefix())
56 szName = Protocol() + ":";
57
58 if(GetParameter() && !(GetParameter()->GetName().isEmpty()))
59 szName += GetParameter()->GetName();
60 else
61 szName += ServerName();
62 return szName;
63}
64
66{
67 QString szDescription;
68 if(!Name().isEmpty())
69 szDescription = tr("Name: ") + Name() + "\n";
70
71 if(!Protocol().isEmpty()) {
72 szDescription += tr("Protocol: ") + Protocol()
73#ifdef DEBUG
74 + " - " + GetPlugClient()->DisplayName()
75#endif
76 + "\n";
77 }
78
79 if(!ServerName().isEmpty())
80 szDescription += tr("Server name: ") + ServerName() + "\n";
81
82 if(GetParameter()) {
83 if(!GetParameter()->m_Net.GetHost().isEmpty())
84 szDescription += tr("Server address: ") + GetParameter()->m_Net.GetHost() + ":"
85 + QString::number(GetParameter()->m_Net.GetPort()) + "\n";
86
87 QString szProxy(tr("Proxy") + " ");
88 auto &proxy = GetParameter()->m_Proxy;
89 switch(proxy.GetUsedType()) {
90 case CParameterProxy::TYPE::SSHTunnel:
91 {
92 auto &sshNet = proxy.m_SSH.m_Net;
93 szProxy += "(" + tr("SSH tunnel") + "): " + sshNet.GetHost() + ":"
94 + QString::number(sshNet.GetPort());
95 break;
96 }
97 case CParameterProxy::TYPE::SockesV5:
98 {
99 auto &sockesV5 = proxy.m_SockesV5;
100 szProxy += "(" + tr("Sockes v5") + "): " + sockesV5.GetHost() + ":"
101 + QString::number(sockesV5.GetPort());
102 break;
103 }
104 default:
105 szProxy.clear();
106 break;
107 }
108
109 if(!szProxy.isEmpty())
110 szDescription += szProxy + "\n";
111 }
112
113 if(!GetPlugClient()->Description().isEmpty())
114 szDescription += tr("Description: ") + GetPlugClient()->Description();
115
116 return szDescription;
117}
118
120{
121 return qobject_cast<CParameterBase*>(CConnecter::GetParameter());
122}
123
124int CConnecterConnect::SetParameter(CParameterBase *p)
125{
126 int nRet = CConnecter::SetParameter(p);
127 if(nRet) return nRet;
128 if(GetParameter())
129 {
130 bool check = false;
131 check = connect(GetParameter(), SIGNAL(sigNameChanged()),
132 this, SLOT(slotUpdateName()));
133 Q_ASSERT(check);
134 check = connect(GetParameter(), SIGNAL(sigShowServerNameChanged()),
135 this, SLOT(slotShowServerName()));
136 Q_ASSERT(check);
137 check = connect(GetParameter(), &CParameter::sigChanged,
138 this, [&](){
139 emit this->sigUpdateParameters(this);
140 });
141 Q_ASSERT(check);
142 CFrmViewer* pViewer = qobject_cast<CFrmViewer*>(GetViewer());
143 if(pViewer) {
144 check = connect(GetParameter(), SIGNAL(sigZoomFactorChanged(double)),
145 pViewer, SLOT(slotSetZoomFactor(double)));
146 Q_ASSERT(check);
147 check = connect(
148 GetParameter(),
149 SIGNAL(sigAdaptWindowsChanged(CFrmViewer::ADAPT_WINDOWS)),
150 pViewer, SLOT(slotSetAdaptWindows(CFrmViewer::ADAPT_WINDOWS)));
151 Q_ASSERT(check);
152 }
153 }
154 return 0;
155}
156
158{
159 if(GetParameter())
160 {
161 GetParameter()->SetParameterClient(pPara);
162 if(pPara)
163 {
164 bool check = connect(pPara, SIGNAL(sigShowProtocolPrefixChanged()),
165 this, SLOT(slotUpdateName()));
166 Q_ASSERT(check);
167 check = connect(pPara, SIGNAL(sigSHowIpPortInNameChanged()),
168 this, SLOT(slotUpdateName()));
169 Q_ASSERT(check);
170 }
171 return 0;
172 } else {
173 QString szMsg = "The CConnecter is not parameters! "
174 "please first create parameters, "
175 "then call SetParameter in the ";
176 szMsg += metaObject()->className() + QString("::")
177 + metaObject()->className();
178 szMsg += QString(" or ") + metaObject()->className()
179 + QString("::") + "Initial()";
180 szMsg += " to set the parameters pointer. "
181 "Default set CParameterClient for the parameters of connecter "
182 "(CParameterConnecter or its derived classes) "
183 "See: CClient::CreateConnecter. "
184 "If you are sure the parameter of connecter "
185 "does not need CParameterClient. "
186 "Please overload the SetParameterClient in the ";
187 szMsg += QString(metaObject()->className()) + " . don't set it";
188 qCritical(log) << szMsg.toStdString().c_str();
189 Q_ASSERT(false);
190 }
191 return -1;
192}
193
195{
196 qDebug(log) << Q_FUNC_INFO;
198 = qobject_cast<CPluginClientThread*>(GetPlugClient());
199 if(pPlug)
200 emit sigOpenConnect(this);
201 else {
202 m_pConnect = InstanceConnect();
203 if(m_pConnect) {
204 int nRet = m_pConnect->Connect();
205 if(nRet)
206 emit sigDisconnect();
207 else
208 emit sigConnected();
209 return nRet;
210 }
211 }
212 return 0;
213}
214
216{
217 qDebug(log) << Q_FUNC_INFO;
219 = qobject_cast<CPluginClientThread*>(GetPlugClient());
220 if(pPlug)
221 emit sigCloseconnect(this);
222 else {
223 if(m_pConnect) {
224 int nRet = m_pConnect->Disconnect();
225 m_pConnect->deleteLater();
226 m_pConnect = nullptr;
227 emit sigDisconnected();
228 return nRet;
229 }
230 }
231 return 0;
232}
233
235{
236 if(GetParameter() && GetParameter()->GetParameterClient()
237 && GetParameter()->GetParameterClient()->GetShowIpPortInName())
238 {
239 return GetParameter()->m_Net.GetHost()
240 + ":" + QString::number(GetParameter()->m_Net.GetPort());
241 }
242
243 if(m_szServerName.isEmpty() && GetParameter())
244 return GetParameter()->GetServerName();
245 return m_szServerName;
246}
247
248void CConnecterConnect::slotSetServerName(const QString& szName)
249{
250 if(m_szServerName == szName)
251 return;
252
253 m_szServerName = szName;
254 if(GetParameter())
255 {
256 if(GetParameter()->GetServerName() == szName)
257 return;
258 GetParameter()->SetServerName(szName);
259 }
260
261 emit sigUpdateName(Name());
262}
virtual int Disconnect()
断开
Definition Connect.cpp:89
virtual int Connect()
开始连接。根据 OnInit() 返回值来决定是否开始定时器来支持非 qt 事件
Definition Connect.cpp:77
插件的连接者接口,此接口仅由插件使用。 所有的需要 CConnect 的插件连接者均需要从此接口派生。
virtual const QString Id() override
Identity
virtual int DisConnect() override
在此函数中触发 sigDisconnected()
virtual const QString Description() override
Description
virtual int Connect() override
virtual void slotSetServerName(const QString &szName)
virtual CParameterBase * GetParameter()
Get parameter
virtual const QString Name() override
显示顺序:
virtual int SetParameterClient(CParameterClient *pPara) override
Set CParameterClient
virtual CConnect * InstanceConnect()=0
新建 CConnect 对象。它的所有者是调用者, 如果调用者不再使用它,调用者必须负责释放它。
virtual QString ServerName()
当前连接名(远程桌面的名称,如果没有,则是 IP:端口)。例如:服务名或 IP:端口
连接者应用接口。
Definition Connecter.h:62
void sigUpdateName(const QString &szName)
void sigConnected()
连接成功信号。仅由插件触发。 应用程序需要在此时设置视图属性 Enabled 为 true 。允许接收键盘和鼠标事件
virtual QWidget * GetViewer()=0
得到显示视图
void sigDisconnected()
断开连接成功信号。仅由插件触发
virtual int SetParameter(CParameter *p)
设置参数
void sigDisconnect()
通知用户断开连接。仅由插件触发。 当从插件中需要要断开连接时触发。例如:对端断开连接、重置连接或者连接出错。 当应用接收到此信号后,调用 DisConnect() 关闭连接。
virtual const QString Protocol() const
Protocol
Definition Connecter.cpp:61
void sigUpdateParameters(CConnecter *pConnecter)
更新参数,通知应用程序保存或显示参数
用于显示从 CConnectDesktop 输出的图像,和向 CConnectDesktop 发送键盘、鼠标事件。
Definition FrmViewer.h:48
ADAPT_WINDOWS
窗口适配枚举常量
Definition FrmViewer.h:60
连接基础参数接口。包括基本参数(网络参数等)。 所有插件的连接参数都应从此类派生。
客户端库 (CClient) 参数。仅在客户端库 (CClient) 和插件中使用。
void sigChanged()
当参数改变时,触发 通常如果需要,则相应的参数会对应一个改变事件。
它默认启动一个后台线程。 它与 CConnecterConnect 一起可实现一个后台线程处理多个远程桌面连接。
客户端插件接口。用于建立 CConnecter 实例,它由协议插件实现。
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Description() const =0
描述
virtual const QString Name() const =0
插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。