OpenClonk
C4PacketBase.h
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
5  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
6  *
7  * Distributed under the terms of the ISC license; see accompanying file
8  * "COPYING" for details.
9  *
10  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
11  * See accompanying file "TRADEMARK" for details.
12  *
13  * To redistribute this file separately, substitute the full license texts
14  * for the above references.
15  */
16 #ifndef INC_C4PacketBase
17 #define INC_C4PacketBase
18 
19 #include "network/C4NetIO.h"
20 
21 // *** packet base class
22 
24 {
25  friend class C4PacketList;
26 public:
28  virtual ~C4PacketBase();
29 
30  // virtual functions to implement by derived classes
31  virtual void CompileFunc(StdCompiler *pComp) = 0;
32 
33  // conversion (using above functions)
34  C4NetIOPacket pack(const C4NetIO::addr_t &addr = C4NetIO::addr_t()) const;
35  C4NetIOPacket pack(uint8_t cStatus, const C4NetIO::addr_t &addr = C4NetIO::addr_t()) const;
36  void unpack(const C4NetIOPacket &Pkt, char *pStatus = nullptr);
37 
38 };
39 
40 inline C4NetIOPacket MkC4NetIOPacket(char cStatus, const class C4PacketBase &Pkt, const C4NetIO::addr_t &addr = C4NetIO::addr_t())
41 {
42  return Pkt.pack(cStatus, addr);
43 }
44 
45 // Filename Adaptor
46 // Converts the network filename separator to the native filename separator
48 {
51  inline void CompileFunc(StdCompiler *pComp) const
52  {
53 #ifdef _WIN32
54  pComp->Value(FileName);
55 #else
56  StdCopyStrBuf FileName2;
57  if (pComp->isSerializer() && FileName)
58  {
59  FileName2.Copy(FileName);
60  SReplaceChar(FileName2.getMData(),DirectorySeparator,'\\');
61  }
62  pComp->Value(FileName2);
63  if (pComp->isDeserializer())
64  {
65  FileName.Take(FileName2);
67  }
68 #endif
69  }
70  template <class T> bool operator == (const T &rVal) { return FileName == rVal; }
71  template <class T> C4NetFilenameAdapt &operator = (const T &rVal) { FileName = rVal; return *this; }
72 };
73 inline C4NetFilenameAdapt mkNetFilenameAdapt(StdStrBuf &FileName) { return C4NetFilenameAdapt(FileName); }
74 
75 // enumaration of all used packet types
77 {
78  PID_None = 0xFF,
79 
80  // *** network
81 
82  // * base packets
83  // ping
84  PID_Ping = 0x00,
85  PID_Pong = 0x01,
86 
87  // connecting
88  PID_Conn = 0x02,
89  PID_ConnRe = 0x03,
90 
91  // msg forwarding
92  PID_FwdReq = 0x04,
93  PID_Fwd = 0x05,
94 
95  // post mortem
97 
98  // (packets before this ID won't be recovered post-mortem)
100 
101  // * game
102  // game status
103  PID_Status = 0x10,
105 
106  // client address propagation
107  PID_Addr = 0x12,
108 
109  // activation request
111 
112  // request to perform TCP simultaneous open
114 
115  // all data a client needs to get started
116  PID_JoinData = 0x15,
117 
118  // player info
120 
121  // round results league info
123 
124  // * lobby
126  PID_SetScenarioParameter = 0x21, // scenario parameter update
127 
128  // * resources
134 
135  // * control
136  PID_Control = 0x40,
140 
141  // *** control
142  CID_First = 0x80,
143 
147 
148  CID_Vote = CID_First | 0x03,
150 
153  CID_Set = CID_First | 0x07,
157 
161 
164 
168 
173 
176 
177  // Note: There are some more packet types in src/netpuncher/C4PuncherPacket.h
178  // They have been picked to be distinct from these for safety, not for necessary.
179 };
180 
181 // packet classes
183 {
184  PC_Network, // network packet - internal stuff
185  PC_Control // control packet - game data (saved in records)
186 };
187 
188 // enumeration of packet handlers
190 {
191  PH_C4Network2IO = 1 << 0, // network i/o class
192  PH_C4Network2 = 1 << 1, // main network class
193  PH_C4GUIMainDlg = 1 << 2, // network lobby class
194  PH_C4Network2ClientList = 1 << 3, // client list class
195  PH_C4Network2Players = 1 << 4, // player list class
196  PH_C4Network2ResList = 1 << 5, // resource list class
197  PH_C4GameControlNetwork = 1 << 6, // network control class
198 };
199 
200 
201 // packet handling data
203 {
206  const char *Name;
207 
210 
211  int32_t HandlerID; // (C4PacketHandlerID)
212 
213  class C4PacketBase *(*FnUnpack)(StdCompiler *pComp);
214 };
215 extern const C4PktHandlingData PktHandlingData[];
216 
217 const char *PacketNameByID(C4PacketType eID);
218 
219 
220 // *** general packet types
221 
222 // raw packet: contains std buffer
223 class C4PktBuf : public C4PacketBase
224 {
225 protected:
227 public:
229  C4PktBuf(const C4PktBuf &rCopy) { *this = rCopy; }
230  C4PktBuf(const StdBuf &rCpyData) { *this = rCpyData; }
231  C4PktBuf &operator =(const C4PktBuf &rCopy);
232  C4PktBuf &operator =(const StdBuf &rCopy);
233 
234  size_t getSize() const { return Data.getSize(); }
235  const void *getData() const { return Data.getData(); }
236 
237  void CompileFunc(StdCompiler *pComp) override;
238 };
239 
240 // "identified" packet: packet with packet type id
241 class C4IDPacket : public C4PacketBase
242 {
243  friend class C4PacketList;
244 public:
246  C4IDPacket(C4PacketType eID, C4PacketBase *pPkt, bool fTakePkt = true);
247  C4IDPacket(const C4IDPacket &Packet2);
248  ~C4IDPacket() override;
249 
250 protected:
252  C4PacketBase *pPkt{nullptr};
253  bool fOwnPkt{true};
254 
255  // used by C4PacketList
256  C4IDPacket *pNext{nullptr};
257 
258 public:
259  C4PacketType getPktType() const { return eID; }
260  C4PacketBase *getPkt() const { return pPkt; }
261  const char *getPktName() const;
262 
263  void Clear();
264  void Default();
266 
267  void CompileFunc(StdCompiler *pComp) override;
268 };
269 
270 // list of identified packets
272 {
273 public:
275  C4PacketList(const C4PacketList &List2);
276  ~C4PacketList() override;
277 
278 protected:
279  C4IDPacket *pFirst{nullptr}, *pLast{nullptr};
280 
281 public:
282  C4IDPacket *firstPkt() const { return pFirst; }
283  C4IDPacket *nextPkt(C4IDPacket *pPkt) const { return pPkt->pNext; }
284 
285  int32_t getPktCnt() const;
286 
287  void Add(C4IDPacket *pPkt);
288  void AddHead(C4IDPacket *pPkt);
289  void Add(C4PacketType eType, C4PacketBase *pPkt);
290  void AddHead(C4PacketType eType, C4PacketBase *pPkt);
291 
292  void Take(C4PacketList &List);
293  void Append(const C4PacketList &List);
294 
295  void Clear();
296  void Remove(C4IDPacket *pPkt);
297  void Delete(C4IDPacket *pPkt);
298 
299  void CompileFunc(StdCompiler *pComp) override;
300 };
301 #endif // INC_C4PacketBase
C4NetFilenameAdapt mkNetFilenameAdapt(StdStrBuf &FileName)
Definition: C4PacketBase.h:73
C4NetIOPacket MkC4NetIOPacket(char cStatus, const class C4PacketBase &Pkt, const C4NetIO::addr_t &addr=C4NetIO::addr_t())
Definition: C4PacketBase.h:40
C4PacketClass
Definition: C4PacketBase.h:183
@ PC_Network
Definition: C4PacketBase.h:184
@ PC_Control
Definition: C4PacketBase.h:185
C4PacketType
Definition: C4PacketBase.h:77
@ CID_ReInitScenario
Definition: C4PacketBase.h:171
@ PID_JoinData
Definition: C4PacketBase.h:116
@ PID_NetResDis
Definition: C4PacketBase.h:129
@ PID_StatusAck
Definition: C4PacketBase.h:104
@ PID_ControlReq
Definition: C4PacketBase.h:137
@ CID_JoinPlr
Definition: C4PacketBase.h:159
@ CID_MenuCommand
Definition: C4PacketBase.h:175
@ PID_SetScenarioParameter
Definition: C4PacketBase.h:126
@ PID_ExecSyncCtrl
Definition: C4PacketBase.h:139
@ CID_DebugRec
Definition: C4PacketBase.h:174
@ CID_SyncCheck
Definition: C4PacketBase.h:151
@ PID_PostMortem
Definition: C4PacketBase.h:96
@ CID_MsgBoardReply
Definition: C4PacketBase.h:155
@ CID_VoteEnd
Definition: C4PacketBase.h:149
@ CID_PlrInfo
Definition: C4PacketBase.h:158
@ PID_LeagueRoundResults
Definition: C4PacketBase.h:122
@ CID_Message
Definition: C4PacketBase.h:165
@ CID_PlrSelect
Definition: C4PacketBase.h:162
@ PID_TCPSimOpen
Definition: C4PacketBase.h:113
@ PID_ClientActReq
Definition: C4PacketBase.h:110
@ PID_NetResReq
Definition: C4PacketBase.h:132
@ PID_NetResDerive
Definition: C4PacketBase.h:131
@ CID_EMMoveObj
Definition: C4PacketBase.h:169
@ CID_PlrMouseMove
Definition: C4PacketBase.h:167
@ PID_Conn
Definition: C4PacketBase.h:88
@ PID_Pong
Definition: C4PacketBase.h:85
@ CID_EMDrawTool
Definition: C4PacketBase.h:170
@ PID_Control
Definition: C4PacketBase.h:136
@ CID_PlrAction
Definition: C4PacketBase.h:166
@ CID_PlrControl
Definition: C4PacketBase.h:163
@ PID_Fwd
Definition: C4PacketBase.h:93
@ PID_None
Definition: C4PacketBase.h:78
@ PID_PlayerInfoUpdReq
Definition: C4PacketBase.h:119
@ PID_NetResStat
Definition: C4PacketBase.h:130
@ CID_EditGraph
Definition: C4PacketBase.h:172
@ CID_Synchronize
Definition: C4PacketBase.h:152
@ PID_FwdReq
Definition: C4PacketBase.h:92
@ PID_PacketLogStart
Definition: C4PacketBase.h:99
@ CID_MsgBoardCmd
Definition: C4PacketBase.h:156
@ CID_First
Definition: C4PacketBase.h:142
@ CID_Script
Definition: C4PacketBase.h:154
@ CID_RemovePlr
Definition: C4PacketBase.h:160
@ CID_ClientRemove
Definition: C4PacketBase.h:146
@ CID_Vote
Definition: C4PacketBase.h:148
@ PID_ControlPkt
Definition: C4PacketBase.h:138
@ PID_Ping
Definition: C4PacketBase.h:84
@ CID_Set
Definition: C4PacketBase.h:153
@ CID_ClientJoin
Definition: C4PacketBase.h:144
@ CID_ClientUpdate
Definition: C4PacketBase.h:145
@ PID_LobbyCountdown
Definition: C4PacketBase.h:125
@ PID_Status
Definition: C4PacketBase.h:103
@ PID_ConnRe
Definition: C4PacketBase.h:89
@ PID_NetResData
Definition: C4PacketBase.h:133
@ PID_Addr
Definition: C4PacketBase.h:107
const char * PacketNameByID(C4PacketType eID)
Definition: C4Packet2.cpp:136
C4PacketHandlerID
Definition: C4PacketBase.h:190
@ PH_C4Network2
Definition: C4PacketBase.h:192
@ PH_C4GUIMainDlg
Definition: C4PacketBase.h:193
@ PH_C4Network2Players
Definition: C4PacketBase.h:195
@ PH_C4Network2ResList
Definition: C4PacketBase.h:196
@ PH_C4Network2IO
Definition: C4PacketBase.h:191
@ PH_C4Network2ClientList
Definition: C4PacketBase.h:194
@ PH_C4GameControlNetwork
Definition: C4PacketBase.h:197
const C4PktHandlingData PktHandlingData[]
Definition: C4Packet2.cpp:50
#define DirectorySeparator
void SReplaceChar(char *str, char fc, char tc)
Definition: Standard.cpp:354
void Default()
Definition: C4Packet2.cpp:218
const char * getPktName() const
Definition: C4Packet2.cpp:209
C4PacketType getPktType() const
Definition: C4PacketBase.h:259
~C4IDPacket() override
Definition: C4Packet2.cpp:204
void Set(C4PacketType eType, C4PacketBase *pPkt)
C4PacketType eID
Definition: C4PacketBase.h:251
C4IDPacket * pNext
Definition: C4PacketBase.h:256
C4PacketBase * pPkt
Definition: C4PacketBase.h:252
void Clear()
Definition: C4Packet2.cpp:223
C4PacketBase * getPkt() const
Definition: C4PacketBase.h:260
void CompileFunc(StdCompiler *pComp) override
Definition: C4Packet2.cpp:230
virtual ~C4PacketBase()
void unpack(const C4NetIOPacket &Pkt, char *pStatus=nullptr)
Definition: C4Packet2.cpp:160
virtual void CompileFunc(StdCompiler *pComp)=0
C4NetIOPacket pack(const C4NetIO::addr_t &addr=C4NetIO::addr_t()) const
Definition: C4Packet2.cpp:150
void CompileFunc(StdCompiler *pComp) override
Definition: C4Packet2.cpp:354
C4IDPacket * firstPkt() const
Definition: C4PacketBase.h:282
C4IDPacket * pFirst
Definition: C4PacketBase.h:279
C4IDPacket * pLast
Definition: C4PacketBase.h:279
void Clear()
Definition: C4Packet2.cpp:321
void Delete(C4IDPacket *pPkt)
Definition: C4Packet2.cpp:348
int32_t getPktCnt() const
Definition: C4Packet2.cpp:275
void AddHead(C4IDPacket *pPkt)
Definition: C4Packet2.cpp:290
void Take(C4PacketList &List)
Definition: C4Packet2.cpp:308
~C4PacketList() override
Definition: C4Packet2.cpp:270
void Add(C4IDPacket *pPkt)
Definition: C4Packet2.cpp:283
void Append(const C4PacketList &List)
Definition: C4Packet2.cpp:315
void Remove(C4IDPacket *pPkt)
Definition: C4Packet2.cpp:327
C4IDPacket * nextPkt(C4IDPacket *pPkt) const
Definition: C4PacketBase.h:283
const void * getData() const
Definition: C4PacketBase.h:235
void CompileFunc(StdCompiler *pComp) override
Definition: C4Packet2.cpp:182
C4PktBuf(const StdBuf &rCpyData)
Definition: C4PacketBase.h:230
C4PktBuf(const C4PktBuf &rCopy)
Definition: C4PacketBase.h:229
C4PktBuf & operator=(const C4PktBuf &rCopy)
Definition: C4Packet2.cpp:176
StdCopyBuf Data
Definition: C4PacketBase.h:226
size_t getSize() const
Definition: C4PacketBase.h:234
Definition: StdBuf.h:30
size_t getSize() const
Definition: StdBuf.h:101
const void * getData() const
Definition: StdBuf.h:99
void Value(const T &rStruct)
Definition: StdCompiler.h:161
bool isSerializer()
Definition: StdCompiler.h:54
virtual bool isDeserializer()
Definition: StdCompiler.h:53
char * getMData()
Definition: StdBuf.h:443
void Copy()
Definition: StdBuf.h:467
void Take(char *pnData)
Definition: StdBuf.h:457
C4NetFilenameAdapt(StdStrBuf &FileName)
Definition: C4PacketBase.h:50
void CompileFunc(StdCompiler *pComp) const
Definition: C4PacketBase.h:51
C4NetFilenameAdapt & operator=(const T &rVal)
Definition: C4PacketBase.h:71
StdStrBuf & FileName
Definition: C4PacketBase.h:49
bool operator==(const T &rVal)
Definition: C4PacketBase.h:70
const char * Name
Definition: C4PacketBase.h:206
C4PacketType ID
Definition: C4PacketBase.h:204
C4PacketClass Class
Definition: C4PacketBase.h:205