summaryrefslogtreecommitdiff
path: root/tracker/common/UtlMsgBuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'tracker/common/UtlMsgBuffer.h')
-rw-r--r--tracker/common/UtlMsgBuffer.h198
1 files changed, 198 insertions, 0 deletions
diff --git a/tracker/common/UtlMsgBuffer.h b/tracker/common/UtlMsgBuffer.h
new file mode 100644
index 0000000..1b4a818
--- /dev/null
+++ b/tracker/common/UtlMsgBuffer.h
@@ -0,0 +1,198 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Generic named data buffer, declaration and implementation
+//
+//=============================================================================
+
+#ifndef UTLMSGBUFFER_H
+#define UTLMSGBUFFER_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "UtlMemory.h"
+
+#pragma warning(disable: 4244) // warning C4244: '=' : conversion from 'int' to 'short', possible loss of data
+
+//-----------------------------------------------------------------------------
+// Purpose: Generic named data buffer
+//-----------------------------------------------------------------------------
+class CUtlMsgBuffer
+{
+public:
+ CUtlMsgBuffer(unsigned short msgID, int initialSize);
+ CUtlMsgBuffer(unsigned short msgID, void const *data, int dataSize);
+ ~CUtlMsgBuffer();
+
+ unsigned short GetMsgID() const { return m_iMsgID; }
+ void SetMsgID(unsigned short msgID) { m_iMsgID = msgID; }
+
+ // read functions
+ bool ReadInt(const char *name, int &data);
+ bool ReadUInt(const char *name, unsigned int &data);
+ bool ReadString(const char *name, char *data, int dataBufferSize);
+ bool ReadBuffer(const char *name, CUtlMsgBuffer &buffer);
+ // returns number of bytes read, 0 on failure
+ int ReadBlob(const char *name, void *data, int dataBufferSize);
+
+ // reads out the next variable available in the buffer
+ // fills out parameters with var details and data
+ // returns false if no more vars available
+ bool ReadNextVar(char name[32], bool &stringData, void *data, int &dataSize);
+
+ // write functions
+ void WriteInt(const char *name, int data);
+ void WriteUInt(const char *name, unsigned int data);
+ void WriteString(const char *name, const char *data);
+ void WriteBlob(const char *name, const void *data, int dataSize);
+ void WriteBuffer(const char *name, const CUtlMsgBuffer *buffer);
+
+ // returns a pointer to the data buffer, and its size, of the specified variable
+ void *FindVar(const char *name, int &dataSizeOut);
+
+ // pads the buffer to the specified boundary (in bytes)
+ void PadBuffer(int boundary);
+
+ // makes sure the message has this much space allocated
+ void EnsureCapacity(int dataSize);
+
+ // returns the number of bytes used by the message
+ int DataSize() const;
+
+ // returns a pointer to the base data
+ void *Base();
+
+ // returns a const pointer to the base data
+ const void *Base() const;
+
+ // advances the write pointer - used when you write directly into the buffer
+ void SetWritePos(int size);
+
+ CUtlMsgBuffer& Copy(const CUtlMsgBuffer &rhs);
+
+ // copy constructor
+ CUtlMsgBuffer(const CUtlMsgBuffer &rhs)
+ {
+ m_iMsgID = rhs.m_iMsgID;
+ m_iWritePos = rhs.m_iWritePos;
+ m_iReadPos = rhs.m_iReadPos;
+ m_iNextVarPos = rhs.m_iNextVarPos;
+
+ m_Memory.EnsureCapacity(rhs.m_Memory.NumAllocated());
+ if ( rhs.m_Memory.NumAllocated() > 0 )
+ {
+ memcpy(Base(), rhs.Base(), rhs.m_Memory.NumAllocated());
+ }
+ }
+
+private:
+
+ bool Read(void *buffer, int readAmount);
+ bool ReadUntilNull(void *buffer, int bufferSize);
+ void Write(void const *data, int size);
+
+ CUtlMemory<char> m_Memory;
+
+ unsigned short m_iMsgID;
+ short m_iWritePos; // position in buffer we are currently writing to
+ short m_iReadPos; // current reading position
+ short m_iNextVarPos; // a guess at which variable is most likely to be read next
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: returns the number of bytes used by the message
+//-----------------------------------------------------------------------------
+inline int CUtlMsgBuffer::DataSize() const
+{
+ // return the highest read/write mark
+ if (m_iWritePos > m_iReadPos)
+ return m_iWritePos;
+
+ return m_iReadPos;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: returns a pointer to the base data
+//-----------------------------------------------------------------------------
+inline void *CUtlMsgBuffer::Base()
+{
+ return &m_Memory[0];
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: returns a pointer to the base data
+//-----------------------------------------------------------------------------
+inline const void *CUtlMsgBuffer::Base() const
+{
+ return &m_Memory[0];
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: ensures capacity
+//-----------------------------------------------------------------------------
+inline void CUtlMsgBuffer::EnsureCapacity(int dataSize)
+{
+ m_Memory.EnsureCapacity(dataSize);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: pads the buffer to the specified boundary (in bytes)
+//-----------------------------------------------------------------------------
+inline void CUtlMsgBuffer::PadBuffer(int boundary)
+{
+ // pad the buffer to be the right size for encryption
+ int pad = (boundary - (DataSize() % boundary));
+ Write("\0\0\0\0\0\0\0\0\0\0\0\0", pad);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Reads in a named 4-byte int, returns true on sucess, false on failure
+//-----------------------------------------------------------------------------
+inline bool CUtlMsgBuffer::ReadInt(const char *name, int &data)
+{
+ return (ReadBlob(name, &data, 4) == 4);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Reads in a named 4-byte unsigned int, returns true on sucess, false on failure
+//-----------------------------------------------------------------------------
+inline bool CUtlMsgBuffer::ReadUInt(const char *name, unsigned int &data)
+{
+ return (ReadBlob(name, &data, 4) == 4);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Reads in a named variable length character string
+// returns true on sucess, false on failure
+//-----------------------------------------------------------------------------
+inline bool CUtlMsgBuffer::ReadString(const char *name, char *data, int dataBufferSize)
+{
+ return (ReadBlob(name, data, dataBufferSize) > 0);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Writes out an integer to the message
+//-----------------------------------------------------------------------------
+inline void CUtlMsgBuffer::WriteInt(const char *name, int data)
+{
+ WriteBlob(name, &data, 4);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Writes out an unsigned integer to the message
+//-----------------------------------------------------------------------------
+inline void CUtlMsgBuffer::WriteUInt(const char *name, unsigned int data)
+{
+ WriteBlob(name, &data, 4);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+inline void CUtlMsgBuffer::SetWritePos(int size)
+{
+ m_iWritePos = size;
+}
+
+
+#endif // UTLMSGBUFFER_H