Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
173 lines
3.9 KiB
C++
173 lines
3.9 KiB
C++
#include "stdafx.h"
|
|
#include "SendStream.h"
|
|
|
|
#include <cassert>
|
|
|
|
#include <Log/ServerLog.h>
|
|
#include <Stream/Buffer/Buffer.h>
|
|
#include <Stream/Buffer/BufferFactory.h>
|
|
|
|
#include <Network/Session/Session.h>
|
|
#include <Network/Packet/WrapPacket.h>
|
|
#include <Network/Packet/PacketStatistics.h>
|
|
|
|
#include <Utility/Compress/MiniLZO/MiniLZOWrapper.h>
|
|
|
|
enum SendStreamConst
|
|
{
|
|
DEFAULT_BUFFER_SIZE = 16384
|
|
};
|
|
|
|
CSendStream::CSendStream(CSession& Session)
|
|
: m_Session(Session), m_lpBuffer(0)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
CSendStream::~CSendStream()
|
|
{
|
|
SAFE_RELEASE_BUFFER(m_lpBuffer);
|
|
}
|
|
|
|
|
|
bool CSendStream::ForceSend()
|
|
{
|
|
CBuffer* lpBuffer = 0;
|
|
|
|
if(0 != m_lpBuffer)
|
|
{
|
|
if(0 == m_lpBuffer->length())
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
std::swap(m_lpBuffer, lpBuffer);
|
|
if(m_Session.SendPending(lpBuffer))
|
|
{
|
|
return m_Session.Send();
|
|
}
|
|
else
|
|
{
|
|
SAFE_RELEASE_BUFFER(lpBuffer);
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
char* CSendStream::GetBuffer(unsigned long dwReserve_In)
|
|
{
|
|
unsigned long dwAllocateSize = DEFAULT_BUFFER_SIZE < dwReserve_In ? dwReserve_In : DEFAULT_BUFFER_SIZE;
|
|
|
|
if(0 == m_lpBuffer)
|
|
{
|
|
m_lpBuffer = CREATE_BUFFER(m_Session.GetPolicy().GetBufferFactory(), dwReserve_In);
|
|
}
|
|
else if(m_lpBuffer->remain() < dwReserve_In)
|
|
{
|
|
if(0 < m_lpBuffer->length())
|
|
{
|
|
m_Session.SendPending(m_lpBuffer);
|
|
}
|
|
else
|
|
{
|
|
SAFE_RELEASE_BUFFER(m_lpBuffer);
|
|
}
|
|
|
|
m_lpBuffer = CREATE_BUFFER(m_Session.GetPolicy().GetBufferFactory(), dwReserve_In);
|
|
}
|
|
|
|
return (0 != m_lpBuffer) ? m_lpBuffer->wr_ptr() : 0;
|
|
}
|
|
|
|
|
|
|
|
bool CSendStream::PutBuffer(const char* szBuffer, const unsigned long dwBufferSize, unsigned char cCMD_In)
|
|
{
|
|
// TODO : ÆÐŶ Åë°è ³»±â.
|
|
|
|
char* lpBuffer = GetBuffer(dwBufferSize);
|
|
if(0 != lpBuffer)
|
|
{
|
|
const char* lpBufferPastEnd = szBuffer + dwBufferSize;
|
|
std::copy(szBuffer, lpBufferPastEnd, lpBuffer);
|
|
m_lpBuffer->wr_ptr(dwBufferSize);
|
|
|
|
// ÆÐŶ Åë°è.
|
|
CPacketStatistics::GetInstance().Send(cCMD_In, dwBufferSize);
|
|
return ForceSend();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
bool CSendStream::WrapHeader(unsigned short usUsed_In, unsigned char cCMD_In,
|
|
unsigned short usState_In, unsigned short usError_In)
|
|
{
|
|
// TODO : ÆÐŶ Åë°è ³»±â.
|
|
|
|
char* lpBuffer = GetBuffer(usUsed_In);
|
|
if(0 != lpBuffer)
|
|
{
|
|
if (PacketWrap::WrapHeader(lpBuffer, usUsed_In, cCMD_In, usState_In, usError_In))
|
|
{
|
|
m_lpBuffer->wr_ptr(usUsed_In);
|
|
|
|
CPacketStatistics::GetInstance().Send(cCMD_In, usUsed_In);
|
|
return ForceSend();
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
bool CSendStream::WrapCrypt(unsigned short usUsed_In, unsigned char cCMD_In,
|
|
unsigned short usState_In, unsigned short usError_In)
|
|
{
|
|
// TODO : ÆÐŶ Åë°è ³»±â.
|
|
|
|
char* lpBuffer = GetBuffer(usUsed_In);
|
|
if(0 != lpBuffer)
|
|
{
|
|
if (PacketWrap::WrapCrypt(lpBuffer, usUsed_In, cCMD_In, usState_In, usError_In))
|
|
{
|
|
m_lpBuffer->wr_ptr(usUsed_In);
|
|
|
|
CPacketStatistics::GetInstance().Send(cCMD_In, usUsed_In);
|
|
return ForceSend();
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
bool CSendStream::WrapCompress(char* lpSourceData, unsigned short usSourceLength,
|
|
unsigned char cCMD_In, unsigned short usState_In, unsigned short usError_In)
|
|
{
|
|
// TODO : ÆÐŶ Åë°è ³»±â.
|
|
|
|
unsigned long dwDstBufferSize_InOut = CMiniLZO::GetLeastCompressBuffer(usSourceLength);
|
|
char* lpBuffer = GetBuffer(dwDstBufferSize_InOut);
|
|
|
|
if(0 != lpBuffer)
|
|
{
|
|
if (PacketWrap::WrapCompress(lpBuffer, dwDstBufferSize_InOut,
|
|
lpSourceData, usSourceLength, cCMD_In, usState_In, usError_In))
|
|
{
|
|
m_lpBuffer->wr_ptr(dwDstBufferSize_InOut);
|
|
|
|
CPacketStatistics::GetInstance().Send(cCMD_In, dwDstBufferSize_InOut);
|
|
return ForceSend();
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|