summaryrefslogtreecommitdiff
path: root/common/message.h
blob: 6b2744d162d39cc057ec50d418282c109957b988 (plain)
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
#ifndef MESSAGE_H
#define MESSAGE_H

#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using boost::make_shared;
using boost::dynamic_pointer_cast;

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

#include <stdint.h>
#include <vector>
#include <string>

namespace Message {
	namespace Types {
		//! Message types.
		enum Type {
			Undefined,
			Hello,
			Login,
			LoginResponse,
			LobbyStatus,
			LobbyAction,
			GameStart,
			Ready,
			RoundStart,
			RoundState,
			RoundAction,
			RoundEnd,
			GameEnd
		};
	}
	using Types::Type;
	
	class Base {
		protected:
			Base(Type t);
			
		public:
			const Type type;
			
			virtual std::pair<uint8_t*, std::size_t> serialize() = 0;
			virtual void deserialize(uint8_t* data, std::size_t bytes) = 0;
	};
	
	class NullBase : public Base {
		protected:
			NullBase(Type t);
			
		public:
			virtual std::pair<uint8_t*, std::size_t> serialize();
			virtual void deserialize(uint8_t* data, std::size_t bytes);
	};
	
	class BoostBase : public Base {
		protected:
			BoostBase(Type t);
			
		public:
			virtual std::pair<uint8_t*, std::size_t> serialize();
			virtual void deserialize(uint8_t* data, std::size_t bytes);
			
			virtual void serialize(boost::archive::text_oarchive& ar) = 0;
			virtual void deserialize(boost::archive::text_iarchive& ar) = 0;
	};
	
	class Hello : public Base {
		public:
			typedef boost::shared_ptr<Hello> p;
			
			Hello();
			Hello(const std::string& v);
			
			std::string version;
			
			virtual std::pair<uint8_t*, std::size_t> serialize();
			virtual void deserialize(uint8_t* data, std::size_t bytes);
	};
	
	class Login : public Base {
		public:
			typedef boost::shared_ptr<Login> p;
			
			Login();
			Login(const std::string& n);
			
			std::string nick;
			
			virtual std::pair<uint8_t*, std::size_t> serialize();
			virtual void deserialize(uint8_t* data, std::size_t bytes);
	};
	
	class LoginResponse : public Base {
		public:
			typedef boost::shared_ptr<LoginResponse> p;
			
			LoginResponse();
			LoginResponse(bool ok);
			
			bool login_ok;
			
			virtual std::pair<uint8_t*, std::size_t> serialize();
			virtual void deserialize(uint8_t* data, std::size_t bytes);
	};
	
	class GameStart : public BoostBase {
		public:
			typedef boost::shared_ptr<GameStart> p;
			
			GameStart();
			
			std::vector<std::string> players;
			
			virtual void serialize(boost::archive::text_oarchive& ar);
			virtual void deserialize(boost::archive::text_iarchive& ar);
	};
	
	class Ready : public NullBase {
		public:
			typedef boost::shared_ptr<Ready> p;
			
			Ready();
	};
	
	typedef boost::shared_ptr<Base> p;
};

#endif