玉兔远程控制 0.1.0-bate8
载入中...
搜索中...
未找到
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 && (GetParameter()->GetGlobalParameters()->GetNameStyles()
131 & CParameterPlugin::NameStyle::Protocol)
132 && !Protocol().isEmpty())
133 szName = Protocol() + ":";
134 szName += net.GetHost()
135 + ":" + QString::number(net.GetPort());
136 }
137 }
138 }
139
140 if(szName.isEmpty())
141 szName = COperateTerminal::Name();
142 return szName;
143}
144
146{
147 QString szDescription;
148 if(!Name().isEmpty())
149 szDescription = tr("Name: ") + Name() + "\n";
150
151 if(!GetTypeName().isEmpty())
152 szDescription += tr("Type: ") + GetTypeName() + "\n";
153
154 if(!Protocol().isEmpty()) {
155 szDescription += tr("Protocol: ") + Protocol();
156#ifdef DEBUG
157 if(!GetPlugin()->DisplayName().isEmpty())
158 szDescription += " - " + GetPlugin()->DisplayName();
159#endif
160 szDescription += "\n";
161 }
162
163 szDescription += tr("Raw stream type: ") + CParameterRawStream::GetTypeName(m_Parameter.GetType()) + "\n";
164
165 if(CParameterRawStream::TYPE::TCP == m_Parameter.GetType()) {
166 auto &net = m_Parameter.m_Net;
167 if(!net.GetHost().isEmpty())
168 szDescription += tr("Server address: ") + net.GetHost()
169 + ":" + QString::number(net.GetPort()) + "\n";
170 }
171
173 if(GetSecurityLevel() != CSecurityLevel::Level::No) {
174 szDescription += tr("Security level: ");
175 if(!sl.GetUnicodeIcon().isEmpty())
176 szDescription += sl.GetUnicodeIcon() + " ";
177 szDescription += sl.GetString() + "\n";
178 }
179
180 if(!GetPlugin()->Description().isEmpty())
181 szDescription += tr("Description: ") + GetPlugin()->Description();
182
183 return szDescription;
184}
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
Definition Backend.h:42
const QString Description() override
描述
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
得到设置对话框
virtual CBackend * InstanceBackend() override
新建后端实例。它的所有者是调用者, 如果调用者不再使用它,调用者必须负责释放它。
const QString Name() override
名称
const QString Id() override
标识
终端操作接口
CStats * GetStats() override
得到统计信息。如果有,其派生类则需要重载此函数提供统计信息。
virtual const QString Name() override
名称
virtual CParameterTerminalBase * GetParameter() const
Get parameters
virtual CSecurityLevel::Levels GetSecurityLevel() const
Get Security Level
Definition Operate.cpp:129
void sigFinished()
断开连接成功信号。仅由插件触发
void sigRunning()
开始成功信号。仅由插件触发。
void sigError(const int nError, const QString &szError)
当有错误产生时触发。
virtual const QString Protocol() const
协议
Definition Operate.cpp:81
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
Definition Operate.cpp:219
virtual const QString Id()
标识
Definition Operate.cpp:36
virtual const QString GetTypeName() const
类型名
Definition Operate.cpp:86
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin
插件接口
Definition Plugin.h:15
virtual const QString DisplayName() const
在界面上显示的名称
Definition Plugin.cpp:76
virtual const QString Description() const =0
描述
安全级别
Definition Stats.h:79