1 // ==============================================================
2 //	This file is part of Glest (www.glest.org)
3 //
4 //	Copyright (C) 2001-2008 Marti�o Figueroa
5 //
6 //	You can redistribute this code and/or modify it under
7 //	the terms of the GNU General Public License as published
8 //	by the Free Software Foundation; either version 2 of the
9 //	License, or (at your option) any later version
10 // ==============================================================
11 
12 #include "network_message.h"
13 
14 #include <cassert>
15 #include <stdexcept>
16 
17 #include "types.h"
18 #include "util.h"
19 #include "game_settings.h"
20 
21 #include "leak_dumper.h"
22 
23 using namespace Shared::Platform;
24 using namespace Shared::Util;
25 using namespace std;
26 
27 namespace Glest{ namespace Game{
28 
29 // =====================================================
30 //	class NetworkMessage
31 // =====================================================
32 
receive(Socket * socket,void * data,int dataSize)33 bool NetworkMessage::receive(Socket* socket, void* data, int dataSize){
34 	if(socket->getDataToRead()>=dataSize){
35 		if(socket->receive(data, dataSize)!=dataSize){
36 			throw runtime_error("Error receiving NetworkMessage");
37 		}
38 		return true;
39 	}
40 	return false;
41 }
42 
send(Socket * socket,const void * data,int dataSize) const43 void NetworkMessage::send(Socket* socket, const void* data, int dataSize) const{
44 	if(socket->send(data, dataSize)!=dataSize){
45 		throw runtime_error("Error sending NetworkMessage");
46 	}
47 }
48 
49 // =====================================================
50 //	class NetworkMessageIntro
51 // =====================================================
52 
NetworkMessageIntro()53 NetworkMessageIntro::NetworkMessageIntro(){
54 	data.messageType= -1;
55 	data.playerIndex= -1;
56 }
57 
NetworkMessageIntro(const string & versionString,const string & name,int playerIndex)58 NetworkMessageIntro::NetworkMessageIntro(const string &versionString, const string &name, int playerIndex){
59 	data.messageType=nmtIntro;
60 	data.versionString= versionString;
61 	data.name= name;
62 	data.playerIndex= static_cast<int16>(playerIndex);
63 }
64 
receive(Socket * socket)65 bool NetworkMessageIntro::receive(Socket* socket){
66 	return NetworkMessage::receive(socket, &data, sizeof(data));
67 }
68 
send(Socket * socket) const69 void NetworkMessageIntro::send(Socket* socket) const{
70 	assert(data.messageType==nmtIntro);
71 	NetworkMessage::send(socket, &data, sizeof(data));
72 }
73 
74 // =====================================================
75 //	class NetworkMessageReady
76 // =====================================================
77 
NetworkMessageReady()78 NetworkMessageReady::NetworkMessageReady(){
79 	data.messageType= nmtReady;
80 }
81 
NetworkMessageReady(int32 checksum)82 NetworkMessageReady::NetworkMessageReady(int32 checksum){
83 	data.messageType= nmtReady;
84 	data.checksum= checksum;
85 }
86 
receive(Socket * socket)87 bool NetworkMessageReady::receive(Socket* socket){
88 	return NetworkMessage::receive(socket, &data, sizeof(data));
89 }
90 
send(Socket * socket) const91 void NetworkMessageReady::send(Socket* socket) const{
92 	assert(data.messageType==nmtReady);
93 	NetworkMessage::send(socket, &data, sizeof(data));
94 }
95 
96 // =====================================================
97 //	class NetworkMessageLaunch
98 // =====================================================
99 
NetworkMessageLaunch()100 NetworkMessageLaunch::NetworkMessageLaunch(){
101 	data.messageType=-1;
102 }
103 
NetworkMessageLaunch(const GameSettings * gameSettings)104 NetworkMessageLaunch::NetworkMessageLaunch(const GameSettings *gameSettings){
105 	data.messageType=nmtLaunch;
106 
107 	data.description= gameSettings->getDescription();
108 	data.map= gameSettings->getMap();
109 	data.tileset= gameSettings->getTileset();
110 	data.tech= gameSettings->getTech();
111 	data.factionCount= gameSettings->getFactionCount();
112 	data.thisFactionIndex= gameSettings->getThisFactionIndex();
113 	data.defaultResources= gameSettings->getDefaultResources();
114     data.defaultUnits= gameSettings->getDefaultUnits();
115     data.defaultVictoryConditions= gameSettings->getDefaultVictoryConditions();
116 
117 	for(int i= 0; i<data.factionCount; ++i){
118 		data.factionTypeNames[i]= gameSettings->getFactionTypeName(i);
119 		data.factionControls[i]= gameSettings->getFactionControl(i);
120 		data.teams[i]= gameSettings->getTeam(i);
121 		data.startLocationIndex[i]= gameSettings->getStartLocationIndex(i);
122 	}
123 }
124 
buildGameSettings(GameSettings * gameSettings) const125 void NetworkMessageLaunch::buildGameSettings(GameSettings *gameSettings) const{
126 	gameSettings->setDescription(data.description.getString());
127 	gameSettings->setMap(data.map.getString());
128 	gameSettings->setTileset(data.tileset.getString());
129 	gameSettings->setTech(data.tech.getString());
130 	gameSettings->setFactionCount(data.factionCount);
131 	gameSettings->setThisFactionIndex(data.thisFactionIndex);
132 	gameSettings->setDefaultResources(data.defaultResources);
133     gameSettings->setDefaultUnits(data.defaultUnits);
134     gameSettings->setDefaultVictoryConditions(data.defaultVictoryConditions);
135 
136 	for(int i= 0; i<data.factionCount; ++i){
137 		gameSettings->setFactionTypeName(i, data.factionTypeNames[i].getString());
138 		gameSettings->setFactionControl(i, static_cast<ControlType>(data.factionControls[i]));
139 		gameSettings->setTeam(i, data.teams[i]);
140 		gameSettings->setStartLocationIndex(i, data.startLocationIndex[i]);
141 	}
142 }
143 
receive(Socket * socket)144 bool NetworkMessageLaunch::receive(Socket* socket){
145 	return NetworkMessage::receive(socket, &data, sizeof(data));
146 }
147 
send(Socket * socket) const148 void NetworkMessageLaunch::send(Socket* socket) const{
149 	assert(data.messageType==nmtLaunch);
150 	NetworkMessage::send(socket, &data, sizeof(data));
151 }
152 
153 // =====================================================
154 //	class NetworkMessageLaunch
155 // =====================================================
156 
NetworkMessageCommandList(int32 frameCount)157 NetworkMessageCommandList::NetworkMessageCommandList(int32 frameCount){
158 	data.messageType= nmtCommandList;
159 	data.frameCount= frameCount;
160 	data.commandCount= 0;
161 }
162 
addCommand(const NetworkCommand * networkCommand)163 bool NetworkMessageCommandList::addCommand(const NetworkCommand* networkCommand){
164 	if(data.commandCount<maxCommandCount){
165 		data.commands[static_cast<int>(data.commandCount)]= *networkCommand;
166 		data.commandCount++;
167 		return true;
168 	}
169 	return false;
170 }
171 
receive(Socket * socket)172 bool NetworkMessageCommandList::receive(Socket* socket){
173 	return NetworkMessage::receive(socket, &data, sizeof(data));
174 }
175 
send(Socket * socket) const176 void NetworkMessageCommandList::send(Socket* socket) const{
177 	assert(data.messageType==nmtCommandList);
178 	NetworkMessage::send(socket, &data, sizeof(data));
179 }
180 
181 // =====================================================
182 //	class NetworkMessageText
183 // =====================================================
184 
NetworkMessageText(const string & text,const string & sender,int teamIndex)185 NetworkMessageText::NetworkMessageText(const string &text, const string &sender, int teamIndex){
186 	data.messageType= nmtText;
187 	data.text= text;
188 	data.sender= sender;
189 	data.teamIndex= teamIndex;
190 }
191 
receive(Socket * socket)192 bool NetworkMessageText::receive(Socket* socket){
193 	return NetworkMessage::receive(socket, &data, sizeof(data));
194 }
195 
send(Socket * socket) const196 void NetworkMessageText::send(Socket* socket) const{
197 	assert(data.messageType==nmtText);
198 	NetworkMessage::send(socket, &data, sizeof(data));
199 }
200 
201 // =====================================================
202 //	class NetworkMessageQuit
203 // =====================================================
204 
NetworkMessageQuit()205 NetworkMessageQuit::NetworkMessageQuit(){
206 	data.messageType= nmtQuit;
207 }
208 
receive(Socket * socket)209 bool NetworkMessageQuit::receive(Socket* socket){
210 	return NetworkMessage::receive(socket, &data, sizeof(data));
211 }
212 
send(Socket * socket) const213 void NetworkMessageQuit::send(Socket* socket) const{
214 	assert(data.messageType==nmtQuit);
215 	NetworkMessage::send(socket, &data, sizeof(data));
216 }
217 
218 }}//end namespace
219