3#include <QLoggingCategory>
4#include <QAbstractSocket>
5#include <QRegularExpression>
7#include "OperateTelnet.h"
8#include "DlgSettingsTelnet.h"
11static Q_LOGGING_CATEGORY(log,
"Plugin.Telnet")
18 qDebug(log) << Q_FUNC_INFO;
19 auto &net = m_Parameters.m_Net;
21 QList<CParameterUser::TYPE> lstType;
22 lstType << CParameterUser::TYPE::UserPassword;
23 net.m_User.SetType(lstType);
24 SetParameter(&m_Parameters);
27COperateTelnet::~COperateTelnet()
29 qDebug(log) << Q_FUNC_INFO;
42int COperateTelnet::Start()
47 slotUpdateParameter(
this);
49 slotSetSecurityLevel(CSecurityLevel::Level::Risk);
52 check = connect(&m_Telnet, &QTelnet::stateChanged,
53 this, [=](QAbstractSocket::SocketState socketState){
54 if(socketState == QAbstractSocket::ConnectedState) {
56 }
else if(socketState == QAbstractSocket::UnconnectedState) {
61 check = connect(&m_Telnet, &QTelnet::error,
62 this, [=](QAbstractSocket::SocketError err){
63 QString szErr = tr(
"Telnet error:\n%1.").arg(m_Telnet.errorString());
68 check = connect(&m_Telnet, SIGNAL(newData(
const char*,
int)),
69 this, SLOT(slotNewData(
const char*,
int)));
71 check = connect(m_pTerminal, &QTermWidget::sendData,
72 this, [&](
const char* buf,
int len){
73 QByteArray data(buf, len);
75 m_Telnet.sendData(data);
80 check = connect(&m_Telnet, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
81 this, SLOT(slotStateChanged(QAbstractSocket::SocketState)));
84 auto &net = m_Parameters.m_Net;
85 m_Telnet.setCustomCR();
86 m_Telnet.connectToHost(net.GetHost(), net.GetPort());
88 m_pTerminal->startTerminalTeletype();
94int COperateTelnet::Stop()
99 m_Telnet.disconnectFromHost();
104void COperateTelnet::slotStateChanged(QAbstractSocket::SocketState state)
108 case QAbstractSocket::UnconnectedState:
109 qDebug(log) << tr(
"Unconnected");
111 case QAbstractSocket::HostLookupState:
112 qDebug(log) << tr(
"Resolve DNS %1").arg(m_Telnet.peerName());
114 case QAbstractSocket::ConnectingState:
115 qDebug(log) << tr(
"Connecting a %1").arg(m_Telnet.peerInfo());
117 case QAbstractSocket::ConnectedState:
118 qDebug(log) << tr(
"Connected a %1").arg(m_Telnet.peerInfo());
120 case QAbstractSocket::BoundState:
121 qDebug(log) << tr(
"Bound");
123 case QAbstractSocket::ListeningState:
124 qDebug(log) << tr(
"Listening");
126 case QAbstractSocket::ClosingState:
127 qDebug(log) << tr(
"Close");
137 auto &net = m_Parameters.m_Net;
138 if(!net.GetHost().isEmpty())
139 szId +=
"_" + net.GetHost()
140 +
"_" + QString::number(net.GetPort());
144 static QRegularExpression exp(
"[-@:/#%!^&* \\.]");
145 szId = szId.replace(exp,
"_");
151 QString szName = m_Parameters.GetName();
152 if(szName.isEmpty()) {
153 auto &net = m_Parameters.m_Net;
154 if(!net.GetHost().isEmpty()) {
157 & CParameterPlugin::NameStyle::Protocol)
160 szName += net.GetHost()
161 +
":" + QString::number(net.GetPort());
167 QString szSecurityLevel;
171 & CParameterPlugin::NameStyle::SecurityLevel)
173 && !sl.GetUnicodeIcon().isEmpty())
174 szSecurityLevel = sl.GetUnicodeIcon().left(2);
176 return szSecurityLevel + szName;
181 QString szDescription;
182 if(!
Name().isEmpty())
183 szDescription = tr(
"Name: ") +
Name() +
"\n";
186 szDescription += tr(
"Type: ") +
GetTypeName() +
"\n";
189 szDescription += tr(
"Protocol: ") +
Protocol();
191 if(!
GetPlugin()->DisplayName().isEmpty())
194 szDescription +=
"\n";
197 auto &net = m_Parameters.m_Net;
198 if(!net.GetHost().isEmpty())
199 szDescription += tr(
"Server address: ") + net.GetHost()
200 +
":" + QString::number(net.GetPort()) +
"\n";
204 szDescription += tr(
"Security level: ");
205 if(!sl.GetUnicodeIcon().isEmpty())
206 szDescription += sl.GetUnicodeIcon() +
" ";
207 szDescription += sl.GetString() +
"\n";
213 return szDescription;
216void COperateTelnet::slotNewData(
const char *buf,
int len)
220 WriteTerminal(buf, len);
226 QRegularExpression reLogin(m_Parameters.
GetLogin(), QRegularExpression::CaseInsensitiveOption);
227 QRegularExpressionMatch match = reLogin.match(QByteArray(buf, len));
228 bool bLogin = match.hasMatch();
230 QString user = m_Parameters.m_Net.
m_User.GetUser();
231 if(!user.isEmpty()) {
232 m_Telnet.sendData(user.toStdString().c_str(), user.length());
233 m_Telnet.sendData(
"\n", 1);
235 qDebug(log) <<
"User:" << user;
237 QRegularExpression rePassword(m_Parameters.
GetPassword(), QRegularExpression::CaseInsensitiveOption);
238 match = rePassword.match(QByteArray(buf, len));
239 bool bPassword = match.hasMatch();
241 QString password = m_Parameters.m_Net.
m_User.GetPassword();
242 if(!password.isEmpty()) {
243 m_Telnet.sendData(password.toStdString().c_str(), password.length());
244 m_Telnet.sendData(
"\n", 1);
246 slotSetSecurityLevel(CSecurityLevel::Level::Authentication);
248 qDebug(log) <<
"Password:" << password;
250 if(!m_Parameters.GetCommands().isEmpty()) {
251 foreach (
auto c, m_Parameters.GetCommands()) {
252 m_Telnet.sendData(c.toStdString().c_str(), c.length());
253 m_Telnet.sendData(
"\n", 1);
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
virtual const QString Description() override
描述
virtual const QString Name() override
名称
virtual CBackend * InstanceBackend() override
新建后端实例。它的所有者是调用者, 如果调用者不再使用它,调用者必须负责释放它。
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
得到设置对话框
virtual 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
void sigFinished()
断开连接成功信号。仅由插件触发
void sigRunning()
开始成功信号。仅由插件触发。
void sigError(const int nError, const QString &szError)
当有错误产生时触发。
void sigStop()
通知用户停止。仅由插件触发。 当从插件中需要停止时触发。例如:对端断开连接、重置连接或者连接出错。 当应用接收到此信号后,调用 Stop() 关闭连接。
virtual const QString Protocol() const
协议
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
virtual const QString Id()
标识
virtual const QString GetTypeName() const
类型名
CParameterUser m_User
[Instance user]
CParameterPlugin * GetGlobalParameters()
Get CParameterPlugin
QString GetPassword() const
Password Regular Expression
QString GetLogin() const
Login Regular Expression
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Description() const =0
描述