DragonNest/Server/ServiceMonitorEx/Source/IoBuffer.hpp

240 lines
7 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< I/O BUFFER >>
PRGM : B4nFter
FILE : IOBUFFER.HPP
DESC : <EFBFBD> I/O <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INIT BUILT DATE : 2005. 11. 21
LAST BUILT DATE : 2005. 11. 29
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
*///===============================================================
#pragma once
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "SYSBASEBASE.H"
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CIoBuffer
//*---------------------------------------------------------------
// DESC : <20>⺻ I/O <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
class CIoBuffer
{
private:
LPBYTE m_lpbtBuffer;
CIoBuffer* m_lpIoBufferNextNode; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1B8AE>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EBB0A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT m_iBufferSize;
INT m_iBufferHeadPtr; // <20><><EFBFBD>ۿ<EFBFBD><DBBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT m_iBufferTailPtr; // <20><><EFBFBD>ۿ<EFBFBD><DBBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL m_bLockState; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD> (<28>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>)
INT m_iType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> (<28>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>)
LPVOID m_lpParam;
public:
CIoBuffer();
virtual ~CIoBuffer();
BOOL Initialize(INT uBufferSize, CIoBuffer* lpIoBufferNextNode = NULL);
VOID Finalize();
VOID Reset();
CIoBuffer* GetIoBufferNextNode() { return m_lpIoBufferNextNode; }
VOID SetIoBufferNextNode(CIoBuffer* lpIoBufferNode) { m_lpIoBufferNextNode = lpIoBufferNode; }
BOOL GetLockState() { return m_bLockState; }
VOID SetLockState(BOOL bLockState) { m_bLockState = bLockState; }
LPBYTE GetBuffer() { return m_lpbtBuffer; }
INT GetBufferSize() { return m_iBufferSize; }
BOOL SetBuffer(LPBYTE lpbtBuffer, INT iBufferSize);
INT GetBufferHeadPtr() { return m_iBufferHeadPtr; }
VOID SetBufferHeadPtr(INT iHeadBufferPtr) { m_iBufferHeadPtr = iHeadBufferPtr; }
VOID AddBufferHeadPtr(INT iHeadBufferPtr) { m_iBufferHeadPtr += iHeadBufferPtr; }
INT& RefBufferHeadPtr() { return m_iBufferHeadPtr; }
INT GetBufferTailPtr() { return m_iBufferTailPtr; }
VOID SetBufferTailPtr(INT iTailBufferPtr) { m_iBufferTailPtr = iTailBufferPtr; }
VOID AddBufferTailPtr(INT iTailBufferPtr) { m_iBufferTailPtr += iTailBufferPtr; }
INT& RefBufferTailPtr() { return m_iBufferTailPtr; }
inline LPBYTE GetFreeBuffer(INT& iBufferSize);
INT GetFreeBufferSize() { return m_iBufferSize - m_iBufferTailPtr; } // <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><20><><EFBFBD><EFBFBD>
INT GetType() { return m_iType; }
VOID SetType(INT iType) { m_iType = iType; }
LPVOID GetParam() { return m_lpParam; }
VOID SetParam(LPVOID lpParam) { m_lpParam = lpParam; }
};
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CIoBuffer::CIoBuffer
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline CIoBuffer::CIoBuffer()
{
m_lpbtBuffer = NULL;
m_lpIoBufferNextNode = NULL;
m_iBufferSize = 0;
m_iType = -1;
m_lpParam = NULL;
Reset();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CIoBuffer::~CIoBuffer
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline CIoBuffer::~CIoBuffer()
{
Finalize();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CIoBuffer::Initialize
//*---------------------------------------------------------------
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
// PARM : 1 . uBufferSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
// 2 . lpIoBufferNode - <20><><EFBFBD>۰<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>)
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
inline BOOL CIoBuffer::Initialize(INT uBufferSize, CIoBuffer* lpIoBufferNextNode)
{
if (!uBufferSize || m_lpbtBuffer) {
return FALSE;
}
m_lpbtBuffer = NEW BYTE[uBufferSize];
m_lpIoBufferNextNode = lpIoBufferNextNode;
m_iBufferSize = uBufferSize;
Reset();
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CIoBuffer::Finalize
//*---------------------------------------------------------------
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline VOID CIoBuffer::Finalize()
{
SAFE_DELETEARRAY(m_lpbtBuffer);
m_iBufferSize = 0;
m_iBufferHeadPtr = 0;
m_iBufferTailPtr = 0;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CIoBuffer::Reset
//*---------------------------------------------------------------
// DESC : <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20>ڿ<EFBFBD> <20>ʱ<EFBFBD>ȭ
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline VOID CIoBuffer::Reset()
{
m_iBufferHeadPtr = 0;
m_iBufferTailPtr = 0;
m_bLockState = FALSE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CIoBuffer::SetBuffer
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD>۸<EFBFBD> Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lpbtBuffer - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 2 . iBufferSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
inline BOOL CIoBuffer::SetBuffer(LPBYTE lpbtBuffer, INT iBufferSize)
{
if (!lpbtBuffer || 0 >= iBufferSize || !m_lpbtBuffer) {
BASE_RETURN(FALSE);
}
if (GetFreeBufferSize() < iBufferSize) {
BASE_RETURN(FALSE);
}
::memcpy_s(m_lpbtBuffer + m_iBufferTailPtr, GetFreeBufferSize(), lpbtBuffer, iBufferSize);
AddBufferTailPtr(iBufferSize);
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CIoBuffer::GetFreeBuffer
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><20><>ȯ
// PARM : 1 . iBufferSize - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><20><>ȯ<EFBFBD>ޱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// RETV : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
inline LPBYTE CIoBuffer::GetFreeBuffer(INT& iBufferSize)
{
if (m_lpbtBuffer) {
iBufferSize = m_iBufferSize - m_iBufferTailPtr;
return m_lpbtBuffer + m_iBufferTailPtr;
}
return NULL;
}