3#include <QLoggingCategory>
4#include "OperateRawStream.h"
5#include "DlgSettingsRawStream.h"
8static Q_LOGGING_CATEGORY(log,
"RawStream.Operate")
13 SetParameter(&m_Parameter);
16COperateRawStream::~COperateRawStream()
29int COperateRawStream::Start()
34 slotUpdateParameter(
this);
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);
43 switch(m_Parameter.GetType()) {
44 case CParameterRawStream::TYPE::TCP:
45 nLen = m_TcpSocket.write(data);
47 case CParameterRawStream::TYPE::NamePipe:
51 GetStats()->AddSends(nLen);
55 check = connect(&m_TcpSocket, SIGNAL(connected()),
58 check = connect(&m_TcpSocket, SIGNAL(readyRead()),
59 this, SLOT(slotReadyRead()));
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());
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());
75 case CParameterRawStream::TYPE::NamePipe:
81 m_pTerminal->startTerminalTeletype();
86int COperateRawStream::Stop()
96void COperateRawStream::slotReadyRead()
98 if(!m_TcpSocket.isOpen())
100 auto data = m_TcpSocket.readAll();
102 GetStats()->AddReceives(data.length());
103 WriteTerminal(data.data(), data.length());
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());
116 static QRegularExpression exp(
"[-@:/#%!^&* \\.]");
117 szId = szId.replace(exp,
"_");
123 QString szName = m_Parameter.GetName();
125 if(szName.isEmpty()) {
126 if(CParameterRawStream::TYPE::TCP == m_Parameter.GetType()) {
127 auto &net = m_Parameter.m_Net;
128 if(!net.GetHost().isEmpty()) {
133 szName += net.GetHost()
134 +
":" + QString::number(net.GetPort());
146 QString szDescription;
147 if(!
Name().isEmpty())
148 szDescription = tr(
"Name: ") +
Name() +
"\n";
151 szDescription += tr(
"Type: ") +
GetTypeName() +
"\n";
154 szDescription += tr(
"Protocol: ") +
Protocol();
156 if(!
GetPlugin()->DisplayName().isEmpty())
159 szDescription +=
"\n";
162 szDescription += tr(
"Raw stream type: ") + CParameterRawStream::GetTypeName(m_Parameter.GetType()) +
"\n";
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";
171 if(GetSecurityLevel() != SecurityLevel::No)
172 szDescription += tr(
"Security level: ") + GetSecurityLevelString() +
"\n";
177 return szDescription;
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
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
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
virtual const QString Id()
Identity
virtual const QString GetTypeName() const
Get type name
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Description() const =0
描述