4const char QTelnet::IACWILL[2] = { IAC, WILL };
5const char QTelnet::IACWONT[2] = { IAC, WONT };
6const char QTelnet::IACDO[2] = { IAC, DO };
7const char QTelnet::IACDONT[2] = { IAC, DONT };
8const char QTelnet::IACSB[2] = { IAC, SB };
9const char QTelnet::IACSE[2] = { IAC, SE };
11char QTelnet::_sendCodeArray[2] = { IAC, 0 };
12char QTelnet::_arrCRLF[2] = { 13, 10 };
13char QTelnet::_arrCR[2] = { 13, 0 };
15QTelnet::QTelnet(SocketType type, QObject *parent) :
16 QObject(parent), m_socketType(type), m_actualSB(0)
18 connect(&m_tcpSocket, &QTcpSocket::errorOccurred,
this, &QTelnet::socketError);
19 connect(&m_tcpSocket, &QTcpSocket::readyRead,
this, &QTelnet::onTcpReadyRead);
20 connect(&m_tcpSocket, &QTcpSocket::stateChanged,
this, &QTelnet::onStateChanged);
21#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
22 connect(&m_webSocket, &QWebSocket::errorOccurred,
this, &QTelnet::socketError);
24 connect(&m_webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
this, &QTelnet::socketError);
26 connect(&m_webSocket, &QWebSocket::binaryMessageReceived,
this, &QTelnet::binaryMessageReceived);
27 connect(&m_webSocket, &QWebSocket::stateChanged,
this, &QTelnet::onStateChanged);
30void QTelnet::setType(SocketType type)
32 if(type != TCP && type != WEBSOCKET && type != SECUREWEBSOCKET)
38QString QTelnet::peerInfo()
const
40 if(m_socketType == TCP)
41 return m_tcpSocket.peerName()+
" ("+m_tcpSocket.peerAddress().toString()+
" ):"+m_tcpSocket.peerPort();
42 else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
43 return m_webSocket.peerName()+
" ("+m_webSocket.peerAddress().toString()+
" ):"+QString::number(m_webSocket.peerPort());
48QString QTelnet::peerName()
const
50 if(m_socketType == TCP)
51 return m_tcpSocket.peerName();
52 else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
53 return m_webSocket.peerName();
58bool QTelnet::isConnected()
const
60 if(m_socketType == TCP)
61 return m_tcpSocket.state() == QAbstractSocket::ConnectedState;
62 else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
63 return m_webSocket.state() == QAbstractSocket::ConnectedState;
68void QTelnet::connectToHost(
const QString &host, quint16 port)
72 if(m_socketType == TCP) {
74 m_tcpSocket.connectToHost(host, port, QAbstractSocket::ReadWrite, QAbstractSocket::AnyIPProtocol);
75 }
else if(m_socketType == WEBSOCKET) {
77 m_webSocket.open(QUrl(
"ws://"+host+
":"+QString::number(port)));
78 }
else if(m_socketType == SECUREWEBSOCKET) {
80 m_webSocket.open(QUrl(
"wss://"+host+
":"+QString::number(port)));
85void QTelnet::disconnectFromHost(
void)
87 if(m_socketType == TCP)
88 m_tcpSocket.disconnectFromHost();
89 else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
93void QTelnet::write(
const char c)
97 if(m_socketType == TCP)
98 m_tcpSocket.write( (
char*)&c, 1 );
99 else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
100 m_webSocket.sendBinaryMessage(QByteArray(&c, 1));
103qint64 QTelnet::write(
const char *data, qint64 len)
107 if(m_socketType == TCP) {
108 return m_tcpSocket.write( data, len );
109 }
else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET) {
110 return m_webSocket.sendBinaryMessage(QByteArray(data, len));
115qint64 QTelnet::read(
char *data, qint64 maxlen)
119 if(m_socketType == TCP)
120 return m_tcpSocket.read(data, maxlen);
121 else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET) {
127bool QTelnet::testBinaryMode()
const
129 return m_receivedDX[(
unsigned char)TELOPT_BINARY] == DO;
132void QTelnet::sendData(
const QByteArray &ba)
135 transpose( ba.constData(), ba.length() );
138void QTelnet::sendData(
const char *data,
int len)
141 transpose( data, len );
144void QTelnet::socketError(QAbstractSocket::SocketError err)
146 disconnectFromHost();
150QString QTelnet::errorString()
152 if(m_socketType == TCP)
153 return m_tcpSocket.errorString();
154 else if(m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
155 return m_webSocket.errorString();
160void QTelnet::setCustomCR(
char cr,
char cr2)
166void QTelnet::setCustomCRLF(
char lf,
char cr)
173void QTelnet::sendTelnetControl(
char codigo)
175 _sendCodeArray[1] = codigo;
176 write(_sendCodeArray, 2);
179void QTelnet::writeCustomCRLF()
184void QTelnet::writeCustomCR()
192 for(
int i = 0; i < 256; i++ )
198 m_negotiationState = STATE_DATA;
202 m_oldWinSize.setHeight(-1);
203 m_oldWinSize.setWidth(-1);
206void QTelnet::sendSB(
char code,
char *arr,
int iLen)
217void QTelnet::sendWindowSize()
219 if( isConnected() && (m_receivedDX[TELOPT_NAWS] == DO) && (m_oldWinSize != m_winSize) )
223 m_oldWinSize = m_winSize;
224 size[0] = (m_winSize.width()>>8) & 0xFF;
225 size[1] = m_winSize.width() & 0xFF;
226 size[2] = (m_winSize.height()>>8) & 0xFF;
227 size[3] = m_winSize.height() & 0xFF;
228 sendSB(TELOPT_NAWS, size, 4);
233void QTelnet::handleSB()
238 if( (m_buffSB.length() > 0) &&
239 ((
unsigned char)m_buffSB[0] == (
unsigned char)TELQUAL_SEND) )
247 write(
"SiraggaTerminal", 15);
256void QTelnet::transpose(
const char *buf,
int iLen)
258 for(
int i = 0; i < iLen; i++ )
274 if( testBinaryMode() || m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
283 if( testBinaryMode() || m_socketType == WEBSOCKET || m_socketType == SECUREWEBSOCKET)
296void QTelnet::willsReply(
char action,
char reply)
298 if( (reply != m_sentDX[(
unsigned char)action]) ||
299 (WILL != m_receivedWX[(
unsigned char)action]) )
305 m_sentDX[(
unsigned char)action] = reply;
306 m_receivedWX[(
unsigned char)action] = WILL;
310void QTelnet::wontsReply(
char action,
char reply)
312 if( (reply != m_sentDX[(
unsigned char)action]) ||
313 (WONT != m_receivedWX[(
unsigned char)action]) )
319 m_sentDX[(
unsigned char)action] = reply;
320 m_receivedWX[(
unsigned char)action] = WONT;
324void QTelnet::doesReply(
char action,
char reply)
326 if( (reply != m_sentWX[(
unsigned char)action]) ||
327 (DO != m_receivedDX[(
unsigned char)action]) )
333 m_sentWX[(
unsigned char)action] = reply;
334 m_receivedDX[(
unsigned char)action] = DO;
338void QTelnet::dontsReply(
char action,
char reply)
340 if( (reply != m_sentWX[(
unsigned char)action]) ||
341 (DONT != m_receivedDX[(
unsigned char)action]) )
347 m_sentWX[(
unsigned char)action] = reply;
348 m_receivedDX[(
unsigned char)action] = DONT;
353qint64 QTelnet::doTelnetInProtocol(qint64 buffSize)
357 for( iIn = 0, iOut = 0; iIn < buffSize; iIn++ )
359 char b = m_buffIncoming[iIn];
361 switch( m_negotiationState )
368 m_negotiationState = STATE_IAC;
371 m_buffProcessed[iOut++] =
'\r';
372 m_negotiationState = STATE_DATAR;
375 m_buffProcessed[iOut++] =
'\n';
376 m_negotiationState = STATE_DATAN;
379 m_buffProcessed[iOut++] = b;
388 m_negotiationState = STATE_IAC;
391 m_buffProcessed[iOut++] =
'\r';
392 m_negotiationState = STATE_DATA;
395 m_buffProcessed[iOut++] =
'\n';
396 m_negotiationState = STATE_DATA;
399 m_buffProcessed[iOut++] = b;
400 m_negotiationState = STATE_DATA;
408 m_negotiationState = STATE_DATA;
409 m_buffProcessed[iOut++] = IAC;
412 m_negotiationState = STATE_IACWILL;
415 m_negotiationState = STATE_IACWONT;
418 m_negotiationState = STATE_IACDONT;
421 m_negotiationState = STATE_IACDO;
425 m_negotiationState = STATE_DATA;
428 m_negotiationState = STATE_IACSB;
432 m_negotiationState = STATE_DATA;
440 emitEchoLocal(
false);
456 m_negotiationState = STATE_DATA;
478 m_negotiationState = STATE_DATA;
497 m_receivedDX[(
unsigned char)b] = (
unsigned char)DO;
498 m_sentWX[(
unsigned char)b] = (
unsigned char)WILL;
510 m_negotiationState = STATE_DATA;
517 emitEchoLocal(
false);
532 m_negotiationState = STATE_DATA;
539 m_negotiationState = STATE_IACSBIAC;
545 m_negotiationState = STATE_IACSBDATA;
549 case STATE_IACSBDATA:
553 m_negotiationState = STATE_IACSBDATAIAC;
567 m_negotiationState = STATE_IACSBDATA;
571 m_negotiationState = STATE_DATA;
575 case STATE_IACSBDATAIAC:
579 m_negotiationState = STATE_IACSBDATA;
580 m_buffSB.append(IAC);
586 m_negotiationState = STATE_DATA;
591 m_negotiationState = STATE_IACSB;
596 m_negotiationState = STATE_DATA;
601 m_negotiationState = STATE_DATA;
608void QTelnet::onTcpReadyRead()
613 while( (readed = read(m_buffIncoming, IncommingBufferSize)) != 0 )
618 disconnectFromHost();
621 processed = doTelnetInProtocol(readed);
623 emit newData(m_buffProcessed, processed);
630void QTelnet::binaryMessageReceived(
const QByteArray &message)
632 emit newData(message.constData(), message.length());
635void QTelnet::onStateChanged(QAbstractSocket::SocketState s)
637 emit stateChanged(s);
void resetProtocol()
Resetea los datos del protocolo. Debe llamarse cada vez que se inicia una conexión nueva.