Files
2026-05-20 03:08:08 +09:00

183 lines
4.0 KiB
C++

#include "huslib.h"
#include "huslibex.h"
HVspHandler::HVspHandler()
{
m_pRecvBuffer = new HStreamBuffer(HH_VSP_MAX_COMMAND_PACKET_SIZE);
m_nBodyOffset = -1;
m_nBodySize = -1;
m_nRemainBodySize = -1;
m_pSendBuffer = new HStreamBuffer(HH_VSP_MAX_COMMAND_PACKET_SIZE);
}
HVspHandler::~HVspHandler()
{
delete m_pRecvBuffer;
delete m_pSendBuffer;
}
int HVspHandler::SendCommand(const HString & strCommand)
{
if (m_pSendBuffer->RemainSize() < strCommand.GetLength() + 5)
return -1;
size_t nLength = sprintf(m_pSendBuffer->Tail(), "VSP %d %s", strCommand.GetLength(), strCommand.psz());
m_pSendBuffer->MoveTail(nLength);
return SendBufferCommand();
}
int HVspHandler::SendBinary(const char * pData, size_t nSize)
{
if (m_pSendBuffer->StoredSize() == 0)
{
int nSentSize = SendToTransport(pData, nSize);
if (nSentSize < 0)
return -1;
if (nSentSize != nSize)
m_pSendBuffer->Store(pData + nSentSize, nSize - nSentSize);
return nSentSize;
}
m_pSendBuffer->Store(pData, nSize);
return SendBufferCommand();
}
int HVspHandler::SendBufferCommand()
{
//if (m_pSendBuffer->StoredSize() == 0)
// return SOCKET_ERROR;
int nSentSize = SendToTransport(m_pSendBuffer->Head(), m_pSendBuffer->StoredSize());
if (nSentSize <= 0)
return nSentSize;
m_pSendBuffer->Pop(nSentSize);
return nSentSize;
}
void HVspHandler::OnReceivedStatusFromTransport(int nStatus)
{
if (nStatus == HTransport::T_BEGIN_TRANSPORT)
{
OnInitialize(true);
}
else if (nStatus == HTransport::T_FAILED_BEGIN)
{
OnInitialize(false);
}
else if (nStatus == HTransport::T_END_TRANSPORT)
{
OnTerminate();
}
}
int HVspHandler::OnReceivedFromTransport(const char * pData, int nSize)
{
if (m_pRecvBuffer->Store(pData, nSize) == false)
{
HLOGF(HLOG_ERROR, "[ERROR], VspHdler, Failed to insert data, buffer = %d, stored = %d, recv size = %d\n", m_pRecvBuffer->Size(), m_pRecvBuffer->StoredSize(), nSize);
return -1; // close connection
}
if (m_nRemainBodySize > 0)
{
int nResult = ProcPacketBodyReceive();
if (nResult < 0)
return -1; // close connection
else if (nResult == 0)
return 0;
}
for (;;)
{
if (m_pRecvBuffer->StoredSize() < 6)
return 0;
// verify protocol name
if (m_pRecvBuffer->MemCmp("VSP ", 4) != 0)
{
HLOGF(HLOG_WARNING, "[WARN], VspHdler, Invalid VSP protocol, buffer = %d, stored = %d, recv size = %d\n", m_pRecvBuffer->Size(), m_pRecvBuffer->StoredSize(), nSize);
HLOGD(HLOG_WARNING, m_pRecvBuffer->Head(), m_pRecvBuffer->StoredSize(), false);
return -1; // close connection
}
// extract body size
m_nBodyOffset = m_pRecvBuffer->Find(' ', 4);
if (m_nBodyOffset < 0)
return 0; // receive remain packet
if (m_nBodyOffset > 13) // 9 + 4
{
HLOGF(HLOG_WARNING, "[WARN], VspHdler, Invalid VSP body size, buffer = %d, stored = %d, recv size = %d\n", m_pRecvBuffer->Size(), m_pRecvBuffer->StoredSize(), nSize);
HLOGD(HLOG_WARNING, m_pRecvBuffer->Head(), m_pRecvBuffer->StoredSize(), false);
return -1; // close connection
}
HString strBodySize(m_pRecvBuffer->Head() + 4, m_nBodyOffset - 4);
m_nBodySize = strBodySize;
m_nBodyOffset++;
//if (m_nBodySize + nPos > HH_VSP_MAX_COMMAND_PACKET_SIZE)
//{
//... extra size packet
//}
int nResult = ProcPacketBodyReceive();
if (nResult < 0)
return -1;
else if (nResult == 0)
return 0;
}
return -1; // close connection
}
int HVspHandler::ProcPacketBodyReceive()
{
int nResult = 0;
m_nRemainBodySize = m_nBodySize - (m_pRecvBuffer->StoredSize() - m_nBodyOffset);
if (m_nRemainBodySize <= 0)
{
nResult = OnReceivedCommand(m_pRecvBuffer->Head() + m_nBodyOffset, m_nBodySize);
if (nResult < 0)
return -1;
if (m_nRemainBodySize < 0)
nResult = 1;
else
nResult = 0;
m_pRecvBuffer->PopAndRewind(m_nBodyOffset + m_nBodySize);
m_nBodyOffset = -1;
m_nBodySize = -1;
m_nRemainBodySize = -1;
}
return nResult;
}
int HVspHandler::OnSendRetryToTransport()
{
return SendBufferCommand();
}
bool HVspHandler::OnPrepareReceive()
{
if (m_pRecvBuffer->RemainSize() < g_nSocketReceiveBlockSize)
return false;
return true;
}