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