Rabbit Remote Control 0.1.0-alpha.2
Loading...
Searching...
No Matches
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}
Backend interface.
Definition Backend.h:42
const QString Description() override
Description.
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
Open settgins dialog.
virtual CBackend * InstanceBackend() override
New CBackend.
const QString Name() override
Name.
const QString Id() override
Identity.
Terminal operate interface.
virtual const QString Name() override
Name.
void sigFinished()
Successful disconnection signal.
void sigRunning()
Start success signal.
void sigError(const int nError, const QString &szError)
Triggered when an error is generated.
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.
Plugin interface.
Definition Plugin.h:15
virtual const QString DisplayName() const
The plugin display name.
Definition Plugin.cpp:73
virtual const QString Description() const =0
Plugin description.