summaryrefslogtreecommitdiff
path: root/common/networksystem/inetworkmessage.h
blob: 152512efa4d38228c8832b5ecf3e8a2ed261aa64 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: INetworkMessage interface
//
// $NoKeywords: $
//===========================================================================//

#ifndef INETWORKMESSAGE_H
#define INETWORKMESSAGE_H

#ifdef _WIN32
#pragma once
#endif

#include "tier0/platform.h"
#include "tier0/dbg.h"

//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class bf_read;
class bf_write;
class INetMsgHandler;
class INetMessage;
class INetChannel;


//-----------------------------------------------------------------------------
// First valid group number users of the network system can use
//-----------------------------------------------------------------------------
enum
{
	NETWORKSYSTEM_FIRST_GROUP = 1,
};


//-----------------------------------------------------------------------------
// A network message
//-----------------------------------------------------------------------------
abstract_class INetworkMessage
{
public:
	// Use these to setup who can hear whose voice.
	// Pass in client indices (which are their ent indices - 1).
	virtual void	SetNetChannel(INetChannel * netchan) = 0; // netchannel this message is from/for
	virtual void	SetReliable( bool state ) = 0;	// set to true if it's a reliable message
		
	virtual	bool	ReadFromBuffer( bf_read &buffer ) = 0; // returns true if parsing was OK
	virtual	bool	WriteToBuffer( bf_write &buffer ) = 0;	// returns true if writing was OK
		
	virtual bool	IsReliable( void ) const = 0;  // true, if message needs reliable handling
	
	virtual int				GetGroup( void ) const = 0;	// returns net message group of this message
	virtual int				GetType( void ) const = 0;	// returns module specific header tag eg svc_serverinfo
	virtual const char		*GetGroupName( void ) const = 0;	// returns network message group name
	virtual const char		*GetName( void ) const = 0;	// returns network message name, eg "svc_serverinfo"
	virtual INetChannel		*GetNetChannel( void ) const = 0;
	virtual const char		*ToString( void ) const = 0; // returns a human readable string about message content

	virtual void Release() = 0;

protected:
	virtual	~INetworkMessage() {};
};


//-----------------------------------------------------------------------------
// Helper utilities for clients to create messages
//-----------------------------------------------------------------------------
#define DECLARE_BASE_MESSAGE( group, msgtype, description )		\
	public:														\
		virtual bool			ReadFromBuffer( bf_read &buffer );	\
		virtual bool			WriteToBuffer( bf_write &buffer );	\
		virtual const char		*ToString() const { return description; } \
		virtual int				GetGroup() const { return group; } \
		virtual const char		*GetGroupName( void ) const { return #group; } \
		virtual int				GetType() const { return msgtype; } \
		virtual const char		*GetName() const { return #msgtype;}\
					

//-----------------------------------------------------------------------------
// Default empty base class for net messages
//-----------------------------------------------------------------------------
class CNetworkMessage : public INetworkMessage
{
public:
	CNetworkMessage() 
	{	
		m_bReliable = true;
		m_pNetChannel = NULL; 
	}

	virtual void Release()
	{
		delete this;
	}

	virtual ~CNetworkMessage() {};

	virtual void SetReliable( bool state ) 
	{ 
		m_bReliable = state;
	}

	virtual bool IsReliable() const 
	{ 
		return m_bReliable;
	}

	virtual void SetNetChannel(INetChannel * netchan)
	{ 
		m_pNetChannel = netchan; 
	}

	virtual bool Process()
	{
		// no handler set
		Assert( 0 ); 
		return false; 
	}	

	INetChannel	*GetNetChannel() const
	{ 
		return m_pNetChannel; 
	}
		
protected:
	bool m_bReliable;			// true if message should be send reliable
	INetChannel *m_pNetChannel;	// netchannel this message is from/for
};


#endif // INETWORKMESSAGE_H