You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
279 lines
3.7 KiB
279 lines
3.7 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
//
|
||
|
// MessageBuffer - handy for serializing/unserializing
|
||
|
// structures to be sent as messages
|
||
|
// dal - 9/2002
|
||
|
//
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include "messbuf.h"
|
||
|
#include "tier1/strtools.h"
|
||
|
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
MessageBuffer::MessageBuffer()
|
||
|
{
|
||
|
size = DEFAULT_MESSAGE_BUFFER_SIZE;
|
||
|
data = (char *) malloc(size);
|
||
|
len = 0;
|
||
|
offset = 0;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
MessageBuffer::MessageBuffer(int minsize)
|
||
|
{
|
||
|
size = minsize;
|
||
|
data = (char *) malloc(size);
|
||
|
len = 0;
|
||
|
offset = 0;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
MessageBuffer::~MessageBuffer()
|
||
|
{
|
||
|
free(data);
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::getSize()
|
||
|
{
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::getLen()
|
||
|
{
|
||
|
return len;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::setLen(int nlen)
|
||
|
{
|
||
|
if (nlen < 0) return -1;
|
||
|
if (nlen > size) {
|
||
|
resize(nlen);
|
||
|
}
|
||
|
|
||
|
int res = len;
|
||
|
len = nlen;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::getOffset()
|
||
|
{
|
||
|
return offset;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::setOffset(int noffset)
|
||
|
{
|
||
|
if (noffset < 0 || noffset > len) return -1;
|
||
|
int res = offset;
|
||
|
offset = noffset;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::write(void const * p, int bytes)
|
||
|
{
|
||
|
if (bytes + len > size) {
|
||
|
resize(bytes + len);
|
||
|
}
|
||
|
memcpy(data + len, p, bytes);
|
||
|
int res = len;
|
||
|
len += bytes;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::update(int loc, void const * p, int bytes)
|
||
|
{
|
||
|
if (loc + bytes > size) {
|
||
|
resize(loc + bytes);
|
||
|
}
|
||
|
memcpy(data + loc, p, bytes);
|
||
|
|
||
|
if (len < loc + bytes) {
|
||
|
len = loc + bytes;
|
||
|
}
|
||
|
|
||
|
return len;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::extract(int loc, void * p, int bytes)
|
||
|
{
|
||
|
if (loc + bytes > len) return -1;
|
||
|
memcpy(p, data + loc, bytes);
|
||
|
|
||
|
return loc + bytes;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
int
|
||
|
MessageBuffer::read(void * p, int bytes)
|
||
|
{
|
||
|
if (offset + bytes > len) return -1;
|
||
|
memcpy(p, data + offset, bytes);
|
||
|
|
||
|
offset += bytes;
|
||
|
return offset;
|
||
|
}
|
||
|
|
||
|
int MessageBuffer::WriteString( const char *pString )
|
||
|
{
|
||
|
return write( pString, V_strlen( pString ) + 1 );
|
||
|
}
|
||
|
|
||
|
int MessageBuffer::ReadString( char *pOut, int bufferLength )
|
||
|
{
|
||
|
int nChars = 0;
|
||
|
while ( 1 )
|
||
|
{
|
||
|
char ch;
|
||
|
if ( read( &ch, sizeof( ch ) ) == -1 )
|
||
|
{
|
||
|
pOut[0] = 0;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if ( ch == 0 || nChars >= (bufferLength-1) )
|
||
|
break;
|
||
|
|
||
|
pOut[nChars] = ch;
|
||
|
++nChars;
|
||
|
}
|
||
|
pOut[nChars] = 0;
|
||
|
return nChars + 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
void
|
||
|
MessageBuffer::clear()
|
||
|
{
|
||
|
memset(data, 0, size);
|
||
|
offset = 0;
|
||
|
len = 0;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
void
|
||
|
MessageBuffer::clear(int minsize)
|
||
|
{
|
||
|
if (minsize > size) {
|
||
|
resize(minsize);
|
||
|
}
|
||
|
memset(data, 0, size);
|
||
|
offset = 0;
|
||
|
len = 0;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
void
|
||
|
MessageBuffer::reset(int minsize)
|
||
|
{
|
||
|
if (minsize > size) {
|
||
|
resize(minsize);
|
||
|
}
|
||
|
len = 0;
|
||
|
offset = 0;
|
||
|
}
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
void
|
||
|
MessageBuffer::resize(int minsize)
|
||
|
{
|
||
|
if (minsize < size) return;
|
||
|
|
||
|
if (size * 2 > minsize) minsize = size * 2;
|
||
|
|
||
|
char * odata = data;
|
||
|
data = (char *) malloc(minsize);
|
||
|
memcpy(data, odata, len);
|
||
|
size = minsize;
|
||
|
free(odata);
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////
|
||
|
//
|
||
|
//
|
||
|
void
|
||
|
MessageBuffer::print(FILE * ofile, int num)
|
||
|
{
|
||
|
fprintf(ofile, "Len: %d Offset: %d Size: %d\n", len, offset, size);
|
||
|
if (num > size) num = size;
|
||
|
for (int i=0; i<num; ++i) {
|
||
|
fprintf(ofile, "%02x ", (unsigned char) data[i]);
|
||
|
}
|
||
|
fprintf(ofile, "\n");
|
||
|
}
|