玉兔远程控制 0.1.0-alpha.2
载入中...
搜索中...
未找到
OperateRawStream.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include "OperateRawStream.h"
5#include "DlgSettingsRawStream.h"
6#include "Plugin.h"
7
8static Q_LOGGING_CATEGORY(log, "RawStream.Operate")
9
11 : COperateTerminal(plugin)
12{
13 SetParameter(&m_Parameter);
14}
15
16COperateRawStream::~COperateRawStream()
17{}
18
20{
21 return new CDlgSettingsRawStream(&m_Parameter, parent);
22}
23
25{
26 return nullptr;
27}
28
29int COperateRawStream::Start()
30{
31 if(!m_pTerminal)
32 return -1;
33
34 slotUpdateParameter(this);
35
36 bool check = false;
37 check = connect(m_pTerminal, &QTermWidget::sendData,
38 this, [&](const char* buf, int len){
39 if(!m_TcpSocket.isOpen()) return;
40 QByteArray data(buf, len);
41 //qDebug(log) << "Send data:" << data << data.toHex(':');
42 qint64 nLen = 0;
43 switch(m_Parameter.GetType()) {
44 case CParameterRawStream::TYPE::TCP:
45 nLen = m_TcpSocket.write(data);
46 break;
47 case CParameterRawStream::TYPE::NamePipe:
48 break;
49 }
50 if(GetStats())
51 GetStats()->AddSends(nLen);
52 });
53 Q_ASSERT(check);
54
55 check = connect(&m_TcpSocket, SIGNAL(connected()),
56 this, SIGNAL(sigRunning()));
57 Q_ASSERT(check);
58 check = connect(&m_TcpSocket, SIGNAL(readyRead()),
59 this, SLOT(slotReadyRead()));
60 Q_ASSERT(check);
61 check = connect(&m_TcpSocket, &QTcpSocket::errorOccurred,
62 this, [&](QAbstractSocket::SocketError error) {
63 qCritical(log) << m_TcpSocket.errorString() << error;
64 if(m_TcpSocket.isOpen())
65 emit sigError(error, m_TcpSocket.errorString());
66 });
67 Q_ASSERT(check);
68
69 switch(m_Parameter.GetType()) {
70 case CParameterRawStream::TYPE::TCP: {
71 auto &net = m_Parameter.m_Net;
72 m_TcpSocket.connectToHost(net.GetHost(), net.GetPort());
73 break;
74 }
75 case CParameterRawStream::TYPE::NamePipe:
76 break;
77 default:
78 emit sigRunning();
79 }
80
81 m_pTerminal->startTerminalTeletype();
82
83 return 0;
84}
85
86int COperateRawStream::Stop()
87{
88 if(m_pTerminal)
89 m_pTerminal->close();
90
91 m_TcpSocket.close();
92 emit sigFinished();
93 return 0;
94}
95
96void COperateRawStream::slotReadyRead()
97{
98 if(!m_TcpSocket.isOpen())
99 return;
100 auto data = m_TcpSocket.readAll();
101 if(GetStats())
102 GetStats()->AddReceives(data.length());
103 WriteTerminal(data.data(), data.length());
104}
105
107{
108 QString szId;
109 szId = COperate::Id();
110 if(CParameterRawStream::TYPE::TCP == m_Parameter.GetType()) {
111 auto &net = m_Parameter.m_Net;
112 if(!net.GetHost().isEmpty())
113 szId += "_" + net.GetHost()
114 + "_" + QString::number(net.GetPort());
115 }
116 static QRegularExpression exp("[-@:/#%!^&* \\.]");
117 szId = szId.replace(exp, "_");
118 return szId;
119}
120
122{
123 QString szName = m_Parameter.GetName();
124
125 if(szName.isEmpty()) {
126 if(CParameterRawStream::TYPE::TCP == m_Parameter.GetType()) {
127 auto &net = m_Parameter.m_Net;
128 if(!net.GetHost().isEmpty()) {
129 if(m_Parameter.GetGlobalParameters()
130 && m_Parameter.GetGlobalParameters()->GetShowProtocolPrefix()
131 && !Protocol().isEmpty())
132 szName = Protocol() + ":";
133 szName += net.GetHost()
134 + ":" + QString::number(net.GetPort());
135 }
136 }
137 }
138
139 if(szName.isEmpty())
140 szName = COperateTerminal::Name();
141 return szName;
142}
143
145{
146 QString szDescription;
147 if(!Name().isEmpty())
148 szDescription = tr("Name: ") + Name() + "\n";
149
150 if(!GetTypeName().isEmpty())
151 szDescription += tr("Type: ") + GetTypeName() + "\n";
152
153 if(!Protocol().isEmpty()) {
154 szDescription += tr("Protocol: ") + Protocol();
155#ifdef DEBUG
156 if(!GetPlugin()->DisplayName().isEmpty())
157 szDescription += " - " + GetPlugin()->DisplayName();
158#endif
159 szDescription += "\n";
160 }
161
162 szDescription += tr("Raw stream type: ") + CParameterRawStream::GetTypeName(m_Parameter.GetType()) + "\n";
163
164 if(CParameterRawStream::TYPE::TCP == m_Parameter.GetType()) {
165 auto &net = m_Parameter.m_Net;
166 if(!net.GetHost().isEmpty())
167 szDescription += tr("Server address: ") + net.GetHost()
168 + ":" + QString::number(net.GetPort()) + "\n";
169 }
170
171 if(GetSecurityLevel() != SecurityLevel::No)
172 szDescription += tr("Security level: ") + GetSecurityLevelString() + "\n";
173
174 if(!GetPlugin()->Description().isEmpty())
175 szDescription += tr("Description: ") + GetPlugin()->Description();
176
177 return szDescription;
178}
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
Definition Backend.h:42
const QString Description() override
Description
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
得到设置对话框
virtual CBackend * InstanceBackend() override
新建后端实例。它的所有者是调用者, 如果调用者不再使用它,调用者必须负责释放它。
const QString Name() override
Name
const QString Id() override
Identity
终端操作接口
virtual const QString Name() override
Name
void sigFinished()
断开连接成功信号。仅由插件触发
void sigRunning()
开始成功信号。仅由插件触发。
void sigError(const int nError, const QString &szError)
当有错误产生时触发。
virtual const QString Protocol() const
Protocol
Definition Operate.cpp:71
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
Definition Operate.cpp:259
virtual const QString Id()
Identity
Definition Operate.cpp:33
virtual const QString GetTypeName() const
Get type name
Definition Operate.cpp:76
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin
插件接口
Definition Plugin.h:15
virtual const QString DisplayName() const
在界面上显示的名称
Definition Plugin.cpp:73
virtual const QString Description() const =0
描述