Files
smartservice_native/hdssd/huslib/TelnetHandler.cpp
T
2026-05-20 03:08:08 +09:00

107 lines
2.1 KiB
C++

#include "huslib.h"
#include "huslibex.h"
#include "MultiplexSocket.h"
#include "MultiplexTransport.h"
HTelnetHandler::HTelnetHandler()
{
m_nCommandBufferedLength = 0;
m_bInitialStep = 0;
}
HTelnetHandler::~HTelnetHandler()
{
}
void HTelnetHandler::OnReceivedStatusFromTransport(int nStatus)
{
if (nStatus == HTransport::T_BEGIN_TRANSPORT)
{
char bufSend[4];
bufSend[0] = (char)IAC;
bufSend[1] = (char)WILL;
bufSend[2] = (char)SGAHEAD;
SendToTransport(bufSend, 3);
}
}
int HTelnetHandler::OnReceivedFromTransport(const char * pData, int nSize)
{
if (m_bInitialStep == 0 && pData[0] == (char)IAC && pData[1] == (char)DO &&
pData[2] == (char)SGAHEAD)
{
if (m_bInitialStep != 0)
return -1; // close connection
m_bInitialStep = 1;
char bufSend[4];
bufSend[0] = (char)IAC;
bufSend[1] = (char)WILL;
bufSend[2] = (char)ECHO;
SendToTransport(bufSend, 3);
return 0;
}
else if (m_bInitialStep == 1 && pData[0] == (char)IAC && pData[1] == (char)DO &&
pData[2] == (char)ECHO)
{
if (m_bInitialStep != 1)
return -1; // close connection
m_bInitialStep = 2;
OnEstablished();
return 0;
}
if (pData[0] == '\t' || ((nSize >= 3 && pData[0] == 0x1b && pData[1] == 0x5b) &&
(pData[2] == 0x41 || // up
pData[2] == 0x42 || // down
pData[2] == 0x43 || // right
pData[2] == 0x44))) // left
{
return 0;
}
else if (pData[0] == '\b')
{
if (m_nCommandBufferedLength > 0)
m_nCommandBufferedLength--;
SendToTransport("\b \b", 3);
return 0;
}
if (m_bInitialStep == 2 && OnInitialReceive(pData, nSize))
m_bInitialStep = 3;
if (m_bInitialStep == 3)
SendToTransport(pData, nSize);
memcpy(m_pCommandBuffer + m_nCommandBufferedLength, pData, nSize);
m_nCommandBufferedLength += nSize;
HString strTemp(pData, nSize);
if (strTemp.Find('\n') > 0)
{
for (int i = m_nCommandBufferedLength - 1; i >= 0; i--)
{
if (m_pCommandBuffer[i] == '\r' || m_pCommandBuffer[i] == '\n')
m_pCommandBuffer[i] = '\0';
}
int nResult = OnReceivedCommand(m_pCommandBuffer);
m_nCommandBufferedLength = 0;
if (nResult >= 0)
SendToTransport("> ", 2);
return nResult;
}
return 0;
}