#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; }