107 lines
2.1 KiB
C++
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;
|
|
}
|