⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messagebuffer.cpp

📁 hl2 source code. Do not use it illegal.
💻 CPP
字号:
// MessageBuffer.cpp: implementation of the CMessageBuffer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MasterTest.h"
#include "MessageBuffer.h"

// For handling endian issues:
extern BOOL  bigendien;

extern short   (*BigShort) (short l);
extern short   (*LittleShort) (short l);
extern int32     (*BigLong) (int32 l);
extern int32     (*LittleLong) (int32 l);
extern float   (*BigFloat) (float l);
extern float   (*LittleFloat) (float l);

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//===================================================================
// CMessageBuffer()
//
// CMessageBuffer:  Allocate message buffer, no default size yet.
//===================================================================
CMessageBuffer::CMessageBuffer()
{
	m_bAllowOverflow = FALSE;	// if false, Error
	m_bOverFlowed    = FALSE;	// set to true if the buffer size failed
	
	m_pData		  = NULL;
	m_nMaxSize       = 0;
	m_nCurSize       = 0;

	//SZ_Alloc(NET_MAXMESSAGE);
}

//===================================================================
// CMessageBuffer()
//
// CMessageBuffer:  Allocate buffer and set up default size.
//===================================================================
CMessageBuffer::CMessageBuffer(int sz)
{
	m_bAllowOverflow = FALSE;	// if false, Error
	m_bOverFlowed    = FALSE;	// set to true if the buffer size failed
	
	m_pData		  = NULL;
	m_nMaxSize       = 0;
	m_nCurSize       = 0;

	SZ_Alloc(sz);
}

//===================================================================
// ~CMessageBuffer()
//
// ~CMessageBuffer:  Destructor, deallocate any memory used.
//===================================================================
CMessageBuffer::~CMessageBuffer()
{
	// Free any data pointed to by m_pData
	SZ_Free();
}

/*
==============================================================================

			MESSAGE IO FUNCTIONS

Handles byte ordering and avoids alignment errors
==============================================================================
*/

//
// writing functions
//
void CMessageBuffer::MSG_WriteChar (int c)
{
	unsigned char    *buf;
	
	buf = (unsigned char *)SZ_GetSpace (1);
	buf[0] = c;
}

void CMessageBuffer::MSG_WriteByte (int c)
{
	unsigned char    *buf;
	
	buf = (unsigned char *)SZ_GetSpace (1);
	buf[0] = c;
}


void CMessageBuffer::MSG_WriteShort (int c)
{
	unsigned char    *buf;
	
	buf = (unsigned char *)SZ_GetSpace (2);
	buf[0] = c&0xff;
	buf[1] = c>>8;
}

void CMessageBuffer::MSG_WriteWord (int c)
{
	unsigned char    *buf;
	
	buf = (unsigned char *)SZ_GetSpace (2);
	buf[0] = c&0xff;
	buf[1] = (c>>8)&0xff;
}

void CMessageBuffer::MSG_WriteLong (int c)
{
	unsigned char    *buf;
	
	buf = (unsigned char *)SZ_GetSpace (4);
	buf[0] = c&0xff;
	buf[1] = (c>>8)&0xff;
	buf[2] = (c>>16)&0xff;
	buf[3] = c>>24;
}

void CMessageBuffer::MSG_WriteFloat (float f)
{
	union
	{
		float   f;
		int     l;
	} dat;
	
	
	dat.f = f;
	dat.l = LittleLong (dat.l);
	
	SZ_Write (&dat.l, 4);
}

void CMessageBuffer::MSG_WriteString (char *s)
{
	if (!s)
		SZ_Write ("", 1);
	else
		SZ_Write (s, strlen(s)+1);
}

void CMessageBuffer::MSG_WriteBuf (int iSize, void *buf)
{
	if (!buf)
		return;

	SZ_Write (buf, iSize);
}

void CMessageBuffer::MSG_WriteCoord (float f)
{
	MSG_WriteShort ((int)(f*8));
}

void CMessageBuffer::MSG_WriteAngle (float f)
{
	CMessageBuffer::MSG_WriteByte (((int)(f*256/360)) & 255);
}

void CMessageBuffer::MSG_WriteHiresAngle (float f)
{
	MSG_WriteShort (((int)(f*65536/360)) & 0xFFFF);
}

//
// reading functions
//
void CMessageBuffer::MSG_BeginReading (void)
{
	m_nMsgReadCount = 0;
	m_bMsgBadRead = FALSE;
}

// returns -1 and sets m_bMsgBadRead if no more characters are available
int CMessageBuffer::MSG_ReadChar (void)
{
	int     c;
	
	if (m_nMsgReadCount+1 > m_nCurSize)
	{
		m_bMsgBadRead = TRUE;
		return -1;
	}
		
	c = (signed char)m_pData[m_nMsgReadCount];
	m_nMsgReadCount++;
	
	return c;
}

int CMessageBuffer::MSG_ReadByte (void)
{
	int     c;
	
	if (m_nMsgReadCount+1 > m_nCurSize)
	{
		m_bMsgBadRead = TRUE;
		return -1;
	}
		
	c = (unsigned char)m_pData[m_nMsgReadCount];
	m_nMsgReadCount++;
	
	return c;
}

int CMessageBuffer::MSG_ReadShort (void)
{
	int     c;
	
	if (m_nMsgReadCount+2 > m_nCurSize)
	{
		m_bMsgBadRead = TRUE;
		return -1;
	}
		
	c = (short)(m_pData[m_nMsgReadCount]
	+ (m_pData[m_nMsgReadCount+1]<<8));
	
	m_nMsgReadCount += 2;
	
	return c;
}

int CMessageBuffer::MSG_ReadWord (void)
{
	int     c;
	
	if (m_nMsgReadCount+2 > m_nCurSize)
	{
		m_bMsgBadRead = TRUE;
		return -1;
	}
		
	c = m_pData[m_nMsgReadCount]
	+ (m_pData[m_nMsgReadCount+1]<<8);
	
	m_nMsgReadCount += 2;
	
	return c;
}


int CMessageBuffer::MSG_ReadLong (void)
{
	int     c;
	
	if (m_nMsgReadCount+4 > m_nCurSize)
	{
		m_bMsgBadRead = TRUE;
		return -1;
	}
		
	c = m_pData[m_nMsgReadCount]
	+ (m_pData[m_nMsgReadCount+1]<<8)
	+ (m_pData[m_nMsgReadCount+2]<<16)
	+ (m_pData[m_nMsgReadCount+3]<<24);
	
	m_nMsgReadCount += 4;
	
	return c;
}

float CMessageBuffer::MSG_ReadFloat (void)
{
	union
	{
		unsigned char    b[4];
		float   f;
		int     l;
	} dat;
	
	dat.b[0] =      m_pData[m_nMsgReadCount];
	dat.b[1] =      m_pData[m_nMsgReadCount+1];
	dat.b[2] =      m_pData[m_nMsgReadCount+2];
	dat.b[3] =      m_pData[m_nMsgReadCount+3];
	m_nMsgReadCount += 4;
	
	dat.l = LittleLong (dat.l);

	return dat.f;   
}

int CMessageBuffer::MSG_ReadBuf(int iSize, void *pbuf)
{
	if (m_nMsgReadCount + iSize > m_nCurSize)
	{
		m_bMsgBadRead = TRUE;
		return -1;
	}
		
	memcpy(pbuf, &m_pData[m_nMsgReadCount], iSize);

	m_nMsgReadCount += iSize;
	
	return 1;
}

char *CMessageBuffer::MSG_ReadString (void)
{
	static char     string[2048];
	int             l,c;
	
	l = 0;
	do
	{
		c = MSG_ReadChar ();
		if (c == -1 || c == 0)
			break;
		string[l] = c;
		l++;
	} while (l < sizeof(string)-1);
	
	string[l] = 0;
	
	return string;
}

float CMessageBuffer::MSG_ReadCoord (void)
{
	return MSG_ReadShort() * (1.0f/8.0f);
}

float CMessageBuffer::MSG_ReadAngle (void)
{
	return MSG_ReadChar() * (360.0f/256.0f);
}

float CMessageBuffer::MSG_ReadHiresAngle (void)
{
	return MSG_ReadShort() * (360.0f/65536.0f);
}

//===========================================================================

void CMessageBuffer::SZ_Alloc (int startsize)
{
	if (startsize < 256)
		startsize = 256;
	m_pData = (unsigned char *)malloc(startsize);
	m_nMaxSize = startsize;
	m_nCurSize = 0;
}


void CMessageBuffer::SZ_Free ()
{
	if (m_pData)
		free(m_pData);
    m_pData = NULL;
	m_nCurSize = 0;
}

void CMessageBuffer::SZ_Clear ()
{
	m_nCurSize = 0;
	memset(m_pData, 0, m_nMaxSize);
}

void *CMessageBuffer::SZ_GetSpace (int length)
{
	void    *d;
	
	if (m_nCurSize + length > m_nMaxSize)
	{
		if (!m_bAllowOverflow)
		{
			AfxMessageBox("SZ_GetSpace overflow without m_bAllowOverflow set");
			exit(1);
		};
		
		if (length > m_nMaxSize)
		{
			AfxMessageBox("SZ_GetSpace requested length is greater than buffer size");
			exit(1);
		};
			
		m_bOverFlowed = TRUE;
		SZ_Clear (); 
	}

	d = m_pData + m_nCurSize;
	m_nCurSize += length;
	return d;
}

void CMessageBuffer::SZ_Write (void *m_pData, int length)
{
	memcpy (SZ_GetSpace(length), m_pData, length);         
}

void CMessageBuffer::SZ_Print (char *m_pData)
{
	int             len;
	
	len = strlen(m_pData)+1;

	// unsigned char * cast to keep VC++ happy
	if (m_pData[m_nCurSize-1])
		memcpy ((unsigned char *)SZ_GetSpace(len),m_pData,len); // no trailing 0
	else
		memcpy ((unsigned char *)SZ_GetSpace(len-1)-1,m_pData,len); // write over trailing 0
}

//===================================================================
// GetMaxSize()
//
// GetMaxSize:  Returns current maximum size.
//===================================================================
int CMessageBuffer::GetMaxSize()
{
	return m_nMaxSize;
}

//===================================================================
// GetData()
//
// GetData:  Returns pointer to data.
//===================================================================
void * CMessageBuffer::GetData()
{
	return m_pData;
}

//===================================================================
// SetCurSize()
//
// SetCurSize:  Sets current size.
//===================================================================
void CMessageBuffer::SetCurSize(int nSize)
{
	m_nCurSize = nSize;
}

//===================================================================
// GetCurSize()
//
// GetCurSize:  Retrieves current size of buffer.
//===================================================================
int CMessageBuffer::GetCurSize()
{
	return m_nCurSize;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -