**************************************************************** *** There are two files here, a header file and the cpp file *** **************************************************************** **************************** *** messageDefinitions.h *** **************************** #ifndef MESSAGE_DEFINITIONS_H #define MESSAGE_DEFINITIONS_H #include "NetworkMessage.h" #include "stringutils.h" #define MT_ACK 1000 #define MT_CONNECTION_REQUEST 1001 #define MT_CONNECTION_REFUSE 1002 #define MT_CONNECTION_ACCEPT 1003 #define MT_CONNECTION_CLOSE 1004 #define MT_PLAYER_REGISTER_REQUEST 1005 #define MT_CHAT_MESSAGE 1006 class NM_ConnectionRequest : public NetworkMessage { public: uint8 messageVersion; NM_ConnectionRequest() { header.messageType = MT_CONNECTION_REQUEST; } NM_ConnectionRequest(uint8 _messageVersion) { header.messageType = MT_CONNECTION_REQUEST; messageVersion = _messageVersion; } NetworkMessage* getInstance() { return new NM_ConnectionRequest; } virtual ~NM_ConnectionRequest() { } void pack(char*& data, int& length) { length = nm_header_size + 1 + (0 * 2) + (0 * 4); assert(length < 1024); data = new char[length]; int pos = 0; memcpy(data, &header, nm_header_size); pos += nm_header_size; memcpy(data+pos, &messageVersion, 1); pos += 1; } void unpack(char* data, int length) { int pos = 0; memcpy(&header, data, nm_header_size); pos += nm_header_size; memcpy(&messageVersion, data+pos, 1); pos += 1; } }; class NM_ConnectionRefuse : public NetworkMessage { public: uint8 messageVersion; NM_ConnectionRefuse() { header.messageType = MT_CONNECTION_REFUSE; } NM_ConnectionRefuse(uint8 _messageVersion) { header.messageType = MT_CONNECTION_REFUSE; messageVersion = _messageVersion; } NetworkMessage* getInstance() { return new NM_ConnectionRefuse; } virtual ~NM_ConnectionRefuse() { } void pack(char*& data, int& length) { length = nm_header_size + 1 + (0 * 2) + (0 * 4); assert(length < 1024); data = new char[length]; int pos = 0; memcpy(data, &header, nm_header_size); pos += nm_header_size; memcpy(data+pos, &messageVersion, 1); pos += 1; } void unpack(char* data, int length) { int pos = 0; memcpy(&header, data, nm_header_size); pos += nm_header_size; memcpy(&messageVersion, data+pos, 1); pos += 1; } }; class NM_ConnectionAccept : public NetworkMessage { public: NM_ConnectionAccept() { header.messageType = MT_CONNECTION_ACCEPT; } NetworkMessage* getInstance() { return new NM_ConnectionAccept; } virtual ~NM_ConnectionAccept() { } void pack(char*& data, int& length) { length = nm_header_size + 0 + (0 * 2) + (0 * 4); assert(length < 1024); data = new char[length]; int pos = 0; memcpy(data, &header, nm_header_size); pos += nm_header_size; } void unpack(char* data, int length) { int pos = 0; memcpy(&header, data, nm_header_size); pos += nm_header_size; } }; class NM_ConnectionClose : public NetworkMessage { public: NM_ConnectionClose() { header.messageType = MT_CONNECTION_CLOSE; } NetworkMessage* getInstance() { return new NM_ConnectionClose; } virtual ~NM_ConnectionClose() { } void pack(char*& data, int& length) { length = nm_header_size + 0 + (0 * 2) + (0 * 4); assert(length < 1024); data = new char[length]; int pos = 0; memcpy(data, &header, nm_header_size); pos += nm_header_size; } void unpack(char* data, int length) { int pos = 0; memcpy(&header, data, nm_header_size); pos += nm_header_size; } }; class NM_PlayerRegisterRequest : public NetworkMessage { public: uint16* name; uint16 length_of_name; NM_PlayerRegisterRequest() { header.messageType = MT_PLAYER_REGISTER_REQUEST; name = NULL; } NM_PlayerRegisterRequest(uint16* _name) { header.messageType = MT_PLAYER_REGISTER_REQUEST; name = uint16strdup(_name); length_of_name = (int)uint16strlen(name) * 2; } NetworkMessage* getInstance() { return new NM_PlayerRegisterRequest; } virtual ~NM_PlayerRegisterRequest() { if (name) free(name); } void pack(char*& data, int& length) { length = nm_header_size + 0 + (1 * 2) + (0 * 4) + length_of_name; assert(length < 1024); data = new char[length]; int pos = 0; memcpy(data, &header, nm_header_size); pos += nm_header_size; memcpy(data+pos, &length_of_name, 2); pos += 2; memcpy(data+pos, name, length_of_name); pos += length_of_name; } void unpack(char* data, int length) { int pos = 0; memcpy(&header, data, nm_header_size); pos += nm_header_size; memcpy(&length_of_name, data+pos, 2); pos += 2; name = (uint16*)malloc(length_of_name + 2); name[length_of_name/2] = 0; memcpy(name, data+pos, length_of_name); pos += length_of_name; } }; class NM_ChatMessage : public NetworkMessage { public: uint8 flags; uint16* text; uint16 length_of_text; NM_ChatMessage() { header.messageType = MT_CHAT_MESSAGE; text = NULL; } NM_ChatMessage(uint8 _flags, uint16* _text) { header.messageType = MT_CHAT_MESSAGE; flags = _flags; text = uint16strdup(_text); length_of_text = (int)uint16strlen(text) * 2; } NetworkMessage* getInstance() { return new NM_ChatMessage; } virtual ~NM_ChatMessage() { if (text) free(text); } void pack(char*& data, int& length) { length = nm_header_size + 1 + (1 * 2) + (0 * 4) + length_of_text; assert(length < 1024); data = new char[length]; int pos = 0; memcpy(data, &header, nm_header_size); pos += nm_header_size; memcpy(data+pos, &flags, 1); pos += 1; memcpy(data+pos, &length_of_text, 2); pos += 2; memcpy(data+pos, text, length_of_text); pos += length_of_text; } void unpack(char* data, int length) { int pos = 0; memcpy(&header, data, nm_header_size); pos += nm_header_size; memcpy(&flags, data+pos, 1); pos += 1; memcpy(&length_of_text, data+pos, 2); pos += 2; text = (uint16*)malloc(length_of_text + 2); text[length_of_text/2] = 0; memcpy(text, data+pos, length_of_text); pos += length_of_text; } }; #endif ****************************** *** messageDefinitions.cpp *** ****************************** #include "pch.h" #include "messageDefinitions.h" void setupMessageClassMap() { NetworkMessage::nm_header_size = sizeof(nm_header); NetworkMessage::messageClassMap[MT_CONNECTION_REQUEST] = new NM_ConnectionRequest; NetworkMessage::messageClassMap[MT_CONNECTION_REFUSE] = new NM_ConnectionRefuse; NetworkMessage::messageClassMap[MT_CONNECTION_ACCEPT] = new NM_ConnectionAccept; NetworkMessage::messageClassMap[MT_CONNECTION_CLOSE] = new NM_ConnectionClose; NetworkMessage::messageClassMap[MT_PLAYER_REGISTER_REQUEST] = new NM_PlayerRegisterRequest; NetworkMessage::messageClassMap[MT_CHAT_MESSAGE] = new NM_ChatMessage; NetworkMessage::messageNameMap[MT_CONNECTION_REQUEST] = "MT_CONNECTION_REQUEST"; NetworkMessage::messageNameMap[MT_CONNECTION_REFUSE] = "MT_CONNECTION_REFUSE"; NetworkMessage::messageNameMap[MT_CONNECTION_ACCEPT] = "MT_CONNECTION_ACCEPT"; NetworkMessage::messageNameMap[MT_CONNECTION_CLOSE] = "MT_CONNECTION_CLOSE"; NetworkMessage::messageNameMap[MT_PLAYER_REGISTER_REQUEST] = "MT_PLAYER_REGISTER_REQUEST"; NetworkMessage::messageNameMap[MT_CHAT_MESSAGE] = "MT_CHAT_MESSAGE"; }