// ============================================================== // This file is part of Glest (www.glest.org) // // Copyright (C) 2001-2008 Martiņo Figueroa // // You can redistribute this code and/or modify it under // the terms of the GNU General Public License as published // by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version // ============================================================== #include "network_message.h" #include #include #include "types.h" #include "util.h" #include "game_settings.h" #include "leak_dumper.h" using namespace Shared::Platform; using namespace Shared::Util; using namespace std; namespace Glest{ namespace Game{ // ===================================================== // class NetworkMessage // ===================================================== bool NetworkMessage::receive(Socket* socket, void* data, int dataSize){ if(socket->getDataToRead()>=dataSize){ if(socket->receive(data, dataSize)!=dataSize){ throw runtime_error("Error receiving NetworkMessage"); } return true; } return false; } void NetworkMessage::send(Socket* socket, const void* data, int dataSize) const{ if(socket->send(data, dataSize)!=dataSize){ throw runtime_error("Error sending NetworkMessage"); } } // ===================================================== // class NetworkMessageIntro // ===================================================== NetworkMessageIntro::NetworkMessageIntro(){ data.messageType= -1; data.playerIndex= -1; } NetworkMessageIntro::NetworkMessageIntro(const string &versionString, const string &name, int playerIndex){ data.messageType=nmtIntro; data.versionString= versionString; data.name= name; data.playerIndex= static_cast(playerIndex); } bool NetworkMessageIntro::receive(Socket* socket){ return NetworkMessage::receive(socket, &data, sizeof(data)); } void NetworkMessageIntro::send(Socket* socket) const{ assert(data.messageType==nmtIntro); NetworkMessage::send(socket, &data, sizeof(data)); } // ===================================================== // class NetworkMessageReady // ===================================================== NetworkMessageReady::NetworkMessageReady(){ data.messageType= nmtReady; } NetworkMessageReady::NetworkMessageReady(int32 checksum){ data.messageType= nmtReady; data.checksum= checksum; } bool NetworkMessageReady::receive(Socket* socket){ return NetworkMessage::receive(socket, &data, sizeof(data)); } void NetworkMessageReady::send(Socket* socket) const{ assert(data.messageType==nmtReady); NetworkMessage::send(socket, &data, sizeof(data)); } // ===================================================== // class NetworkMessageLaunch // ===================================================== NetworkMessageLaunch::NetworkMessageLaunch(){ data.messageType=-1; } NetworkMessageLaunch::NetworkMessageLaunch(const GameSettings *gameSettings){ data.messageType=nmtLaunch; data.description= gameSettings->getDescription(); data.map= gameSettings->getMap(); data.tileset= gameSettings->getTileset(); data.tech= gameSettings->getTech(); data.factionCount= gameSettings->getFactionCount(); data.thisFactionIndex= gameSettings->getThisFactionIndex(); data.defaultResources= gameSettings->getDefaultResources(); data.defaultUnits= gameSettings->getDefaultUnits(); data.defaultVictoryConditions= gameSettings->getDefaultVictoryConditions(); for(int i= 0; igetFactionTypeName(i); data.factionControls[i]= gameSettings->getFactionControl(i); data.teams[i]= gameSettings->getTeam(i); data.startLocationIndex[i]= gameSettings->getStartLocationIndex(i); } } void NetworkMessageLaunch::buildGameSettings(GameSettings *gameSettings) const{ gameSettings->setDescription(data.description.getString()); gameSettings->setMap(data.map.getString()); gameSettings->setTileset(data.tileset.getString()); gameSettings->setTech(data.tech.getString()); gameSettings->setFactionCount(data.factionCount); gameSettings->setThisFactionIndex(data.thisFactionIndex); gameSettings->setDefaultResources(data.defaultResources); gameSettings->setDefaultUnits(data.defaultUnits); gameSettings->setDefaultVictoryConditions(data.defaultVictoryConditions); for(int i= 0; isetFactionTypeName(i, data.factionTypeNames[i].getString()); gameSettings->setFactionControl(i, static_cast(data.factionControls[i])); gameSettings->setTeam(i, data.teams[i]); gameSettings->setStartLocationIndex(i, data.startLocationIndex[i]); } } bool NetworkMessageLaunch::receive(Socket* socket){ return NetworkMessage::receive(socket, &data, sizeof(data)); } void NetworkMessageLaunch::send(Socket* socket) const{ assert(data.messageType==nmtLaunch); NetworkMessage::send(socket, &data, sizeof(data)); } // ===================================================== // class NetworkMessageLaunch // ===================================================== NetworkMessageCommandList::NetworkMessageCommandList(int32 frameCount){ data.messageType= nmtCommandList; data.frameCount= frameCount; data.commandCount= 0; } bool NetworkMessageCommandList::addCommand(const NetworkCommand* networkCommand){ if(data.commandCount(data.commandCount)]= *networkCommand; data.commandCount++; return true; } return false; } bool NetworkMessageCommandList::receive(Socket* socket){ return NetworkMessage::receive(socket, &data, sizeof(data)); } void NetworkMessageCommandList::send(Socket* socket) const{ assert(data.messageType==nmtCommandList); NetworkMessage::send(socket, &data, sizeof(data)); } // ===================================================== // class NetworkMessageText // ===================================================== NetworkMessageText::NetworkMessageText(const string &text, const string &sender, int teamIndex){ data.messageType= nmtText; data.text= text; data.sender= sender; data.teamIndex= teamIndex; } bool NetworkMessageText::receive(Socket* socket){ return NetworkMessage::receive(socket, &data, sizeof(data)); } void NetworkMessageText::send(Socket* socket) const{ assert(data.messageType==nmtText); NetworkMessage::send(socket, &data, sizeof(data)); } // ===================================================== // class NetworkMessageQuit // ===================================================== NetworkMessageQuit::NetworkMessageQuit(){ data.messageType= nmtQuit; } bool NetworkMessageQuit::receive(Socket* socket){ return NetworkMessage::receive(socket, &data, sizeof(data)); } void NetworkMessageQuit::send(Socket* socket) const{ assert(data.messageType==nmtQuit); NetworkMessage::send(socket, &data, sizeof(data)); } }}//end namespace