2010-03-17 07:25:19 +01:00
// ==============================================================
// This file is part of Glest (www.glest.org)
//
2010-04-03 06:30:28 +02:00
// Copyright (C) 2001-2008 Martio Figueroa
2010-03-17 07:25:19 +01:00
//
// 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 <cassert>
# include <stdexcept>
# include "types.h"
# include "util.h"
# include "game_settings.h"
# include "leak_dumper.h"
# include "checksum.h"
# include "map.h"
# include "platform_util.h"
# include "config.h"
2010-08-22 10:00:05 +02:00
# include <algorithm>
2010-03-17 07:25:19 +01:00
using namespace Shared : : Platform ;
using namespace Shared : : Util ;
using namespace std ;
2010-08-22 10:00:05 +02:00
using std : : min ;
2010-03-17 07:25:19 +01:00
namespace Glest { namespace Game {
// =====================================================
// class NetworkMessage
// =====================================================
2011-04-24 06:22:19 +02:00
/*
2011-01-09 05:49:21 +01:00
bool NetworkMessage : : peek ( Socket * socket , void * data , int dataSize ) {
2010-04-12 22:32:47 +02:00
if ( socket ! = NULL ) {
int ipeekdatalen = socket - > getDataToRead ( ) ;
2011-01-09 05:49:21 +01:00
if ( ipeekdatalen > = dataSize ) {
if ( socket - > peek ( data , dataSize ) ! = dataSize ) {
if ( socket ! = NULL & & socket - > getSocketId ( ) > 0 ) {
2010-04-12 22:32:47 +02:00
throw runtime_error ( " Error peeking NetworkMessage " ) ;
}
2011-01-09 05:49:21 +01:00
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s] Line: %d socket has been disconnected \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-04-12 22:32:47 +02:00
}
}
2011-01-09 05:49:21 +01:00
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s] dataSize = %d \n " , __FILE__ , __FUNCTION__ , dataSize ) ;
2010-04-12 22:32:47 +02:00
}
return true ;
2010-03-24 14:39:08 +01:00
}
2011-01-09 05:49:21 +01:00
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s] socket->getDataToRead() returned %d \n " , __FILE__ , __FUNCTION__ , ipeekdatalen ) ;
2010-03-24 14:39:08 +01:00
}
}
return false ;
}
2011-04-24 06:22:19 +02:00
*/
2010-03-24 14:39:08 +01:00
2011-04-24 06:22:19 +02:00
bool NetworkMessage : : receive ( Socket * socket , void * data , int dataSize , bool tryReceiveUntilDataSizeMet ) {
/*
2010-04-12 22:32:47 +02:00
if ( socket ! = NULL ) {
int ipeekdatalen = socket - > getDataToRead ( ) ;
2011-01-09 05:49:21 +01:00
if ( ipeekdatalen > = dataSize ) {
if ( socket - > receive ( data , dataSize ) ! = dataSize ) {
if ( socket ! = NULL & & socket - > getSocketId ( ) > 0 ) {
2010-04-12 22:32:47 +02:00
throw runtime_error ( " Error receiving NetworkMessage " ) ;
}
2011-01-09 05:49:21 +01:00
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s] socket has been disconnected \n " , __FILE__ , __FUNCTION__ ) ;
2010-04-12 22:32:47 +02:00
}
}
2011-01-09 05:49:21 +01:00
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s] dataSize = %d \n " , __FILE__ , __FUNCTION__ , dataSize ) ;
2010-04-12 22:32:47 +02:00
}
return true ;
2010-03-17 07:25:19 +01:00
}
2011-01-09 05:49:21 +01:00
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s] socket->getDataToRead() returned %d \n " , __FILE__ , __FUNCTION__ , ipeekdatalen ) ;
2010-03-17 07:25:19 +01:00
}
}
return false ;
2011-04-24 06:22:19 +02:00
*/
if ( socket ! = NULL ) {
int dataReceived = socket - > receive ( data , dataSize , tryReceiveUntilDataSizeMet ) ;
if ( dataReceived ! = dataSize ) {
if ( socket ! = NULL & & socket - > getSocketId ( ) > 0 ) {
throw runtime_error ( " Error receiving NetworkMessage, dataReceived = " + intToStr ( dataReceived ) + " , dataSize = " + intToStr ( dataSize ) ) ;
}
else {
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] socket has been disconnected \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
}
else {
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] dataSize = %d, dataReceived = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , dataSize , dataReceived ) ;
return true ;
}
}
return false ;
2010-03-17 07:25:19 +01:00
}
2010-08-07 05:26:38 +02:00
void NetworkMessage : : send ( Socket * socket , const void * data , int dataSize ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] socket = %p, data = %p, dataSize = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , socket , data , dataSize ) ;
2010-08-07 05:26:38 +02:00
2010-06-03 08:03:41 +02:00
if ( socket ! = NULL ) {
int sendResult = socket - > send ( data , dataSize ) ;
if ( sendResult ! = dataSize ) {
if ( socket ! = NULL & & socket - > getSocketId ( ) > 0 ) {
char szBuf [ 1024 ] = " " ;
sprintf ( szBuf , " Error sending NetworkMessage, sendResult = %d, dataSize = %d " , sendResult , dataSize ) ;
throw runtime_error ( szBuf ) ;
}
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s] Line: %d socket has been disconnected \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-06-03 08:03:41 +02:00
}
}
2010-03-17 07:25:19 +01:00
}
}
// =====================================================
// class NetworkMessageIntro
// =====================================================
2010-12-30 16:56:02 +01:00
NetworkMessageIntro : : NetworkMessageIntro ( ) {
2010-03-17 07:25:19 +01:00
data . messageType = - 1 ;
2010-08-23 17:40:43 +02:00
data . sessionId = - 1 ;
2010-03-17 07:25:19 +01:00
data . playerIndex = - 1 ;
2010-05-12 17:25:56 +02:00
data . gameState = nmgstInvalid ;
2010-12-30 16:56:02 +01:00
data . externalIp = 0 ;
2010-03-17 07:25:19 +01:00
}
2010-08-23 17:40:43 +02:00
NetworkMessageIntro : : NetworkMessageIntro ( int32 sessionId , const string & versionString ,
const string & name , int playerIndex ,
2010-12-30 16:56:02 +01:00
NetworkGameStateType gameState ,
2011-01-15 19:56:03 +01:00
uint32 externalIp ,
2011-04-05 20:39:47 +02:00
uint32 ftpPort ,
const string & playerLanguage ) {
2010-05-12 17:25:56 +02:00
data . messageType = nmtIntro ;
2010-08-23 17:40:43 +02:00
data . sessionId = sessionId ;
2010-05-12 17:25:56 +02:00
data . versionString = versionString ;
data . name = name ;
data . playerIndex = static_cast < int16 > ( playerIndex ) ;
data . gameState = static_cast < int8 > ( gameState ) ;
2010-12-30 16:56:02 +01:00
data . externalIp = externalIp ;
2011-01-15 19:56:03 +01:00
data . ftpPort = ftpPort ;
2011-04-05 20:39:47 +02:00
data . language = playerLanguage ;
2010-03-17 07:25:19 +01:00
}
2011-01-15 19:56:03 +01:00
bool NetworkMessageIntro : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-08-21 01:53:10 +02:00
data . name . nullTerminate ( ) ;
data . versionString . nullTerminate ( ) ;
2011-04-05 20:39:47 +02:00
data . language . nullTerminate ( ) ;
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] get nmtIntro, data.playerIndex = %d, data.sessionId = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . playerIndex , data . sessionId ) ;
2010-08-21 01:53:10 +02:00
return result ;
2010-03-17 07:25:19 +01:00
}
2011-01-15 19:56:03 +01:00
void NetworkMessageIntro : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] sending nmtIntro, data.playerIndex = %d, data.sessionId = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . playerIndex , data . sessionId ) ;
2011-01-15 19:56:03 +01:00
assert ( data . messageType = = nmtIntro ) ;
2010-03-17 07:25:19 +01:00
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
2010-07-09 17:01:49 +02:00
// =====================================================
// class NetworkMessagePing
// =====================================================
NetworkMessagePing : : NetworkMessagePing ( ) {
data . messageType = nmtPing ;
2010-07-09 20:49:01 +02:00
pingReceivedLocalTime = 0 ;
2010-07-09 17:01:49 +02:00
}
NetworkMessagePing : : NetworkMessagePing ( int32 pingFrequency , int64 pingTime ) {
data . messageType = nmtPing ;
data . pingFrequency = pingFrequency ;
data . pingTime = pingTime ;
}
bool NetworkMessagePing : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-07-09 20:49:01 +02:00
pingReceivedLocalTime = time ( NULL ) ;
return result ;
2010-07-09 17:01:49 +02:00
}
void NetworkMessagePing : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] nmtPing \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-07-09 17:01:49 +02:00
assert ( data . messageType = = nmtPing ) ;
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
2010-03-17 07:25:19 +01:00
// =====================================================
// class NetworkMessageReady
// =====================================================
2011-01-09 05:49:21 +01:00
NetworkMessageReady : : NetworkMessageReady ( ) {
2010-03-17 07:25:19 +01:00
data . messageType = nmtReady ;
}
2011-01-09 05:49:21 +01:00
NetworkMessageReady : : NetworkMessageReady ( int32 checksum ) {
2010-03-17 07:25:19 +01:00
data . messageType = nmtReady ;
data . checksum = checksum ;
}
bool NetworkMessageReady : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
return NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-03-17 07:25:19 +01:00
}
2011-01-09 05:49:21 +01:00
void NetworkMessageReady : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] nmtReady \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-03-17 07:25:19 +01:00
assert ( data . messageType = = nmtReady ) ;
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
// =====================================================
// class NetworkMessageLaunch
// =====================================================
2011-01-09 05:49:21 +01:00
NetworkMessageLaunch : : NetworkMessageLaunch ( ) {
2010-03-17 07:25:19 +01:00
data . messageType = - 1 ;
2011-03-19 13:04:18 +01:00
for ( unsigned int i = 0 ; i < maxFactionCRCCount ; + + i ) {
data . factionNameList [ i ] = " " ;
data . factionCRCList [ i ] = 0 ;
}
2010-03-17 07:25:19 +01:00
}
2011-01-09 05:49:21 +01:00
NetworkMessageLaunch : : NetworkMessageLaunch ( const GameSettings * gameSettings , int8 messageType ) {
2010-04-22 01:13:39 +02:00
data . messageType = messageType ;
2010-03-17 07:25:19 +01:00
2011-01-09 05:49:21 +01:00
data . mapCRC = gameSettings - > getMapCRC ( ) ;
data . tilesetCRC = gameSettings - > getTilesetCRC ( ) ;
data . techCRC = gameSettings - > getTechCRC ( ) ;
2011-03-19 13:04:18 +01:00
for ( unsigned int i = 0 ; i < maxFactionCRCCount ; + + i ) {
data . factionNameList [ i ] = " " ;
data . factionCRCList [ i ] = 0 ;
}
vector < pair < string , int32 > > factionCRCList = gameSettings - > getFactionCRCList ( ) ;
for ( unsigned int i = 0 ; i < factionCRCList . size ( ) & & i < maxFactionCRCCount ; + + i ) {
data . factionNameList [ i ] = factionCRCList [ i ] . first ;
data . factionCRCList [ i ] = factionCRCList [ i ] . second ;
}
2010-03-17 07:25:19 +01:00
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 ( ) ;
2010-03-27 08:09:34 +01:00
data . fogOfWar = gameSettings - > getFogOfWar ( ) ;
2010-09-04 03:24:17 +02:00
data . allowObservers = gameSettings - > getAllowObservers ( ) ;
2010-06-03 09:52:17 +02:00
data . enableObserverModeAtEndGame = gameSettings - > getEnableObserverModeAtEndGame ( ) ;
data . enableServerControlledAI = gameSettings - > getEnableServerControlledAI ( ) ;
2010-06-05 09:52:14 +02:00
data . networkFramePeriod = gameSettings - > getNetworkFramePeriod ( ) ;
2010-08-05 01:39:12 +02:00
data . networkPauseGameForLaggedClients = gameSettings - > getNetworkPauseGameForLaggedClients ( ) ;
data . pathFinderType = gameSettings - > getPathFinderType ( ) ;
2010-12-19 09:04:25 +01:00
data . flagTypes1 = gameSettings - > getFlagTypes1 ( ) ;
2010-03-17 07:25:19 +01:00
2011-01-09 05:49:21 +01:00
for ( int i = 0 ; i < data . factionCount ; + + i ) {
2010-03-17 07:25:19 +01:00
data . factionTypeNames [ i ] = gameSettings - > getFactionTypeName ( i ) ;
2010-04-23 01:18:04 +02:00
data . networkPlayerNames [ i ] = gameSettings - > getNetworkPlayerName ( i ) ;
2011-03-11 12:11:46 +01:00
data . networkPlayerStatuses [ i ] = gameSettings - > getNetworkPlayerStatuses ( i ) ;
2011-04-05 20:39:47 +02:00
data . networkPlayerLanguages [ i ] = gameSettings - > getNetworkPlayerLanguages ( i ) ;
2010-03-17 07:25:19 +01:00
data . factionControls [ i ] = gameSettings - > getFactionControl ( i ) ;
2010-11-25 23:45:08 +01:00
data . resourceMultiplierIndex [ i ] = gameSettings - > getResourceMultiplierIndex ( i ) ;
2010-03-17 07:25:19 +01:00
data . teams [ i ] = gameSettings - > getTeam ( i ) ;
data . startLocationIndex [ i ] = gameSettings - > getStartLocationIndex ( i ) ;
}
}
2011-01-09 05:49:21 +01:00
void NetworkMessageLaunch : : buildGameSettings ( GameSettings * gameSettings ) const {
2010-03-17 07:25:19 +01:00
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 ) ;
2010-10-21 19:42:45 +02:00
gameSettings - > setDefaultResources ( ( data . defaultResources ! = 0 ) ) ;
gameSettings - > setDefaultUnits ( ( data . defaultUnits ! = 0 ) ) ;
gameSettings - > setDefaultVictoryConditions ( ( data . defaultVictoryConditions ! = 0 ) ) ;
gameSettings - > setFogOfWar ( ( data . fogOfWar ! = 0 ) ) ;
gameSettings - > setAllowObservers ( ( data . allowObservers ! = 0 ) ) ;
gameSettings - > setEnableObserverModeAtEndGame ( ( data . enableObserverModeAtEndGame ! = 0 ) ) ;
gameSettings - > setEnableServerControlledAI ( ( data . enableServerControlledAI ! = 0 ) ) ;
2010-06-05 09:52:14 +02:00
gameSettings - > setNetworkFramePeriod ( data . networkFramePeriod ) ;
2010-10-21 19:42:45 +02:00
gameSettings - > setNetworkPauseGameForLaggedClients ( ( data . networkPauseGameForLaggedClients ! = 0 ) ) ;
2010-08-05 01:39:12 +02:00
gameSettings - > setPathFinderType ( static_cast < PathFinderType > ( data . pathFinderType ) ) ;
2010-12-19 09:04:25 +01:00
gameSettings - > setFlagTypes1 ( data . flagTypes1 ) ;
2010-06-03 09:52:17 +02:00
2011-01-09 05:49:21 +01:00
gameSettings - > setMapCRC ( data . mapCRC ) ;
gameSettings - > setTilesetCRC ( data . tilesetCRC ) ;
gameSettings - > setTechCRC ( data . techCRC ) ;
2011-03-19 13:04:18 +01:00
vector < pair < string , int32 > > factionCRCList ;
for ( unsigned int i = 0 ; i < maxFactionCRCCount ; + + i ) {
if ( data . factionNameList [ i ] . getString ( ) ! = " " ) {
factionCRCList . push_back ( make_pair ( data . factionNameList [ i ] . getString ( ) , data . factionCRCList [ i ] ) ) ;
}
}
gameSettings - > setFactionCRCList ( factionCRCList ) ;
for ( int i = 0 ; i < data . factionCount ; + + i ) {
2010-03-17 07:25:19 +01:00
gameSettings - > setFactionTypeName ( i , data . factionTypeNames [ i ] . getString ( ) ) ;
2010-04-23 01:18:04 +02:00
gameSettings - > setNetworkPlayerName ( i , data . networkPlayerNames [ i ] . getString ( ) ) ;
2011-03-11 12:11:46 +01:00
gameSettings - > setNetworkPlayerStatuses ( i , data . networkPlayerStatuses [ i ] ) ;
2011-04-05 20:39:47 +02:00
gameSettings - > setNetworkPlayerLanguages ( i , data . networkPlayerLanguages [ i ] . getString ( ) ) ;
2010-03-17 07:25:19 +01:00
gameSettings - > setFactionControl ( i , static_cast < ControlType > ( data . factionControls [ i ] ) ) ;
2010-11-25 23:45:08 +01:00
gameSettings - > setResourceMultiplierIndex ( i , data . resourceMultiplierIndex [ i ] ) ;
2010-03-17 07:25:19 +01:00
gameSettings - > setTeam ( i , data . teams [ i ] ) ;
gameSettings - > setStartLocationIndex ( i , data . startLocationIndex [ i ] ) ;
}
}
2011-03-19 13:04:18 +01:00
vector < pair < string , int32 > > NetworkMessageLaunch : : getFactionCRCList ( ) const {
vector < pair < string , int32 > > factionCRCList ;
for ( unsigned int i = 0 ; i < maxFactionCRCCount ; + + i ) {
if ( data . factionNameList [ i ] . getString ( ) ! = " " ) {
factionCRCList . push_back ( make_pair ( data . factionNameList [ i ] . getString ( ) , data . factionCRCList [ i ] ) ) ;
}
}
return factionCRCList ;
}
2011-01-09 05:49:21 +01:00
bool NetworkMessageLaunch : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-08-21 01:53:10 +02:00
data . description . nullTerminate ( ) ;
data . map . nullTerminate ( ) ;
data . tileset . nullTerminate ( ) ;
data . tech . nullTerminate ( ) ;
2011-03-19 13:04:18 +01:00
for ( int i = 0 ; i < GameConstants : : maxPlayers ; + + i ) {
2010-08-21 01:53:10 +02:00
data . factionTypeNames [ i ] . nullTerminate ( ) ;
data . networkPlayerNames [ i ] . nullTerminate ( ) ;
2011-04-05 20:39:47 +02:00
data . networkPlayerLanguages [ i ] . nullTerminate ( ) ;
2010-08-21 01:53:10 +02:00
}
2011-03-19 13:04:18 +01:00
for ( unsigned int i = 0 ; i < maxFactionCRCCount ; + + i ) {
data . factionNameList [ i ] . nullTerminate ( ) ;
}
2010-08-21 01:53:10 +02:00
return result ;
2010-03-17 07:25:19 +01:00
}
void NetworkMessageLaunch : : send ( Socket * socket ) const {
2010-08-22 10:00:05 +02:00
if ( data . messageType = = nmtLaunch ) {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] nmtLaunch \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-22 10:00:05 +02:00
}
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] messageType = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . messageType ) ;
2010-08-22 10:00:05 +02:00
}
2010-03-17 07:25:19 +01:00
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
// =====================================================
// class NetworkMessageLaunch
// =====================================================
2011-01-02 01:39:13 +01:00
NetworkMessageCommandList : : NetworkMessageCommandList ( int32 frameCount ) {
2010-06-08 09:40:32 +02:00
data . header . messageType = nmtCommandList ;
data . header . frameCount = frameCount ;
data . header . commandCount = 0 ;
2010-03-17 07:25:19 +01:00
}
bool NetworkMessageCommandList : : addCommand ( const NetworkCommand * networkCommand ) {
2010-06-08 09:40:32 +02:00
if ( data . header . commandCount < maxCommandCount ) {
data . commands [ static_cast < int > ( data . header . commandCount ) ] = * networkCommand ;
data . header . commandCount + + ;
2010-03-17 07:25:19 +01:00
return true ;
}
2011-01-02 01:39:13 +01:00
else {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] WARNING / ERROR too many commands in commandlist data.header.commandCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . commandCount ) ;
2011-01-02 01:39:13 +01:00
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " In [%s::%s Line: %d] WARNING / ERROR too many commands in commandlist data.header.commandCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . commandCount ) ;
}
2010-03-17 07:25:19 +01:00
return false ;
}
2010-06-08 09:40:32 +02:00
bool NetworkMessageCommandList : : receive ( Socket * socket ) {
2010-03-24 14:39:08 +01:00
// _peek_ type, commandCount & frame num first.
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-06-08 09:40:32 +02:00
2011-04-24 06:22:19 +02:00
/*
const double MAX_MSG_WAIT_SECONDS = 3 ;
2011-01-03 03:16:00 +01:00
// Wait a max of x seconds for this message
for ( time_t elapsedWait = time ( NULL ) ; difftime ( time ( NULL ) , elapsedWait ) < = MAX_MSG_WAIT_SECONDS ; ) {
2010-06-08 09:40:32 +02:00
if ( NetworkMessage : : peek ( socket , & data , commandListHeaderSize ) = = true ) {
break ;
}
}
if ( NetworkMessage : : peek ( socket , & data , commandListHeaderSize ) = = false ) {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] ERROR / WARNING!!! NetworkMessage::peek failed! \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-01-02 01:39:13 +01:00
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " In [%s::%s Line: %d] ERROR / WARNING!!! NetworkMessage::peek failed! \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-03-17 07:25:19 +01:00
return false ;
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] messageType = %d, frameCount = %d, data.commandCount = %d \n " ,
2010-06-08 09:40:32 +02:00
__FILE__ , __FUNCTION__ , __LINE__ , data . header . messageType , data . header . frameCount , data . header . commandCount ) ;
2010-03-17 07:25:19 +01:00
2010-03-24 14:39:08 +01:00
// read header + data.commandCount commands.
2010-06-08 09:40:32 +02:00
int totalMsgSize = commandListHeaderSize + ( sizeof ( NetworkCommand ) * data . header . commandCount ) ;
2010-06-14 08:38:24 +02:00
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-06-14 08:38:24 +02:00
// _peek_ type, commandCount & frame num first.
2011-01-03 03:16:00 +01:00
// Wait a max of x seconds for this message
for ( time_t elapsedWait = time ( NULL ) ; difftime ( time ( NULL ) , elapsedWait ) < = MAX_MSG_WAIT_SECONDS ; ) {
2010-06-14 08:38:24 +02:00
if ( NetworkMessage : : peek ( socket , & data , totalMsgSize ) = = true ) {
break ;
}
}
2010-03-24 14:39:08 +01:00
if ( socket - > getDataToRead ( ) < totalMsgSize ) {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] ERROR / WARNING!!! Insufficient data to read entire command list [need %d bytes, only %d available]. \n " ,
2010-03-24 14:39:08 +01:00
__FILE__ , __FUNCTION__ , __LINE__ , totalMsgSize , socket - > getDataToRead ( ) ) ;
2011-01-02 01:39:13 +01:00
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " In [%s::%s Line: %d] ERROR / WARNING!!! Insufficient data to read entire command list [need %d bytes, only %d available]. \n " ,
__FILE__ , __FUNCTION__ , __LINE__ , totalMsgSize , socket - > getDataToRead ( ) ) ;
2010-03-24 14:39:08 +01:00
return false ;
}
bool result = NetworkMessage : : receive ( socket , & data , totalMsgSize ) ;
2010-04-27 05:36:36 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled = = true ) {
2010-06-08 09:40:32 +02:00
for ( int idx = 0 ; idx < data . header . commandCount ; + + idx ) {
2010-03-24 14:39:08 +01:00
const NetworkCommand & cmd = data . commands [ idx ] ;
2010-03-17 07:25:19 +01:00
2010-05-31 08:11:31 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] index = %d, received networkCommand [%s] \n " ,
2010-05-29 13:12:45 +02:00
__FILE__ , __FUNCTION__ , __LINE__ , idx , cmd . toString ( ) . c_str ( ) ) ;
2010-03-24 14:39:08 +01:00
}
2010-03-17 07:25:19 +01:00
}
2010-03-24 14:39:08 +01:00
return result ;
2011-04-24 06:22:19 +02:00
*/
bool result = NetworkMessage : : receive ( socket , & data . header , commandListHeaderSize , true ) ;
if ( result = = true ) {
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] got header, messageType = %d, commandCount = %u, frameCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . messageType , data . header . commandCount , data . header . frameCount ) ;
// read header + data.commandCount commands.
//int totalMsgSize = commandListHeaderSize + (sizeof(NetworkCommand) * data.header.commandCount);
if ( data . header . commandCount > 0 ) {
int totalMsgSize = ( sizeof ( NetworkCommand ) * data . header . commandCount ) ;
result = NetworkMessage : : receive ( socket , & data . commands , totalMsgSize , true ) ;
if ( result = = true ) {
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled = = true ) {
for ( int idx = 0 ; idx < data . header . commandCount ; + + idx ) {
const NetworkCommand & cmd = data . commands [ idx ] ;
SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] index = %d, received networkCommand [%s] \n " ,
__FILE__ , __FUNCTION__ , __LINE__ , idx , cmd . toString ( ) . c_str ( ) ) ;
}
}
}
else {
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] ERROR Failed to get command data, totalMsgSize = %d. \n " , __FILE__ , __FUNCTION__ , __LINE__ , totalMsgSize ) ;
}
}
}
else {
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] ERROR header not received as expected \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " In [%s::%s Line: %d] ERROR header not received as expected \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
return result ;
2010-03-17 07:25:19 +01:00
}
2011-01-02 01:39:13 +01:00
void NetworkMessageCommandList : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] nmtCommandList, frameCount = %d, data.header.commandCount = %d, data.header.messageType = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . frameCount , data . header . commandCount , data . header . messageType ) ;
2010-08-07 05:26:38 +02:00
2010-06-08 09:40:32 +02:00
assert ( data . header . messageType = = nmtCommandList ) ;
int totalMsgSize = commandListHeaderSize + ( sizeof ( NetworkCommand ) * data . header . commandCount ) ;
NetworkMessage : : send ( socket , & data , totalMsgSize ) ;
2010-03-17 07:25:19 +01:00
2010-04-27 05:36:36 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled = = true ) {
2010-05-31 08:11:31 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] messageType = %d, frameCount = %d, data.commandCount = %d \n " ,
2010-06-08 09:40:32 +02:00
__FILE__ , __FUNCTION__ , __LINE__ , data . header . messageType , data . header . frameCount , data . header . commandCount ) ;
2010-03-17 07:25:19 +01:00
2010-06-08 09:40:32 +02:00
if ( data . header . commandCount > 0 ) {
for ( int idx = 0 ; idx < data . header . commandCount ; + + idx ) {
2010-03-17 07:25:19 +01:00
const NetworkCommand & cmd = data . commands [ idx ] ;
2010-05-31 08:11:31 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] index = %d, sent networkCommand [%s] \n " ,
2010-05-29 13:12:45 +02:00
__FILE__ , __FUNCTION__ , __LINE__ , idx , cmd . toString ( ) . c_str ( ) ) ;
2010-03-17 07:25:19 +01:00
}
2010-12-05 02:52:38 +01:00
SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] END of loop, nmtCommandList, frameCount = %d, data.header.commandCount = %d, data.header.messageType = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . frameCount , data . header . commandCount , data . header . messageType ) ;
2010-03-17 07:25:19 +01:00
}
}
}
// =====================================================
// class NetworkMessageText
// =====================================================
2011-04-05 20:39:47 +02:00
NetworkMessageText : : NetworkMessageText ( const string & text , int teamIndex , int playerIndex ,
const string targetLanguage ) {
2010-08-07 05:26:38 +02:00
if ( text . length ( ) > = maxTextStringSize ) {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] WARNING / ERROR - text [%s] length = %d, max = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , text . c_str ( ) , text . length ( ) , maxTextStringSize ) ;
2010-08-07 05:26:38 +02:00
}
2010-10-22 09:28:55 +02:00
data . messageType = nmtText ;
data . text = text ;
data . teamIndex = teamIndex ;
data . playerIndex = playerIndex ;
2011-04-05 20:39:47 +02:00
data . targetLanguage = targetLanguage ;
2010-03-17 07:25:19 +01:00
}
2011-01-13 09:17:18 +01:00
NetworkMessageText * NetworkMessageText : : getCopy ( ) const {
NetworkMessageText * copy = new NetworkMessageText ( ) ;
copy - > data = this - > data ;
return copy ;
}
2010-03-17 07:25:19 +01:00
bool NetworkMessageText : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-08-21 01:53:10 +02:00
data . text . nullTerminate ( ) ;
2011-04-05 20:39:47 +02:00
data . targetLanguage . nullTerminate ( ) ;
2010-08-21 01:53:10 +02:00
return result ;
2010-03-17 07:25:19 +01:00
}
void NetworkMessageText : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] nmtText \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-07 05:26:38 +02:00
2010-03-17 07:25:19 +01:00
assert ( data . messageType = = nmtText ) ;
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
// =====================================================
// class NetworkMessageQuit
// =====================================================
NetworkMessageQuit : : NetworkMessageQuit ( ) {
data . messageType = nmtQuit ;
}
bool NetworkMessageQuit : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
return NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-03-17 07:25:19 +01:00
}
void NetworkMessageQuit : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] nmtQuit \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-07 05:26:38 +02:00
2010-03-17 07:25:19 +01:00
assert ( data . messageType = = nmtQuit ) ;
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
// =====================================================
// class NetworkMessageSynchNetworkGameData
// =====================================================
NetworkMessageSynchNetworkGameData : : NetworkMessageSynchNetworkGameData ( const GameSettings * gameSettings )
{
2010-08-22 10:00:05 +02:00
data . header . messageType = nmtSynchNetworkGameData ;
2010-03-17 07:25:19 +01:00
2010-08-22 10:00:05 +02:00
if ( gameSettings = = NULL ) {
throw std : : runtime_error ( " gameSettings == NULL " ) ;
}
data . header . map = gameSettings - > getMap ( ) ;
data . header . tileset = gameSettings - > getTileset ( ) ;
data . header . tech = gameSettings - > getTech ( ) ;
2010-03-17 07:25:19 +01:00
2010-04-03 06:30:28 +02:00
Config & config = Config : : getInstance ( ) ;
string scenarioDir = " " ;
if ( gameSettings - > getScenarioDir ( ) ! = " " ) {
scenarioDir = gameSettings - > getScenarioDir ( ) ;
if ( EndsWith ( scenarioDir , " .xml " ) = = true ) {
scenarioDir = scenarioDir . erase ( scenarioDir . size ( ) - 4 , 4 ) ;
scenarioDir = scenarioDir . erase ( scenarioDir . size ( ) - gameSettings - > getScenario ( ) . size ( ) , gameSettings - > getScenario ( ) . size ( ) + 1 ) ;
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] gameSettings.getScenarioDir() = [%s] gameSettings.getScenario() = [%s] scenarioDir = [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , gameSettings - > getScenarioDir ( ) . c_str ( ) , gameSettings - > getScenario ( ) . c_str ( ) , scenarioDir . c_str ( ) ) ;
2010-04-03 06:30:28 +02:00
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-03-17 07:25:19 +01:00
2010-08-22 10:00:05 +02:00
data . header . tilesetCRC = getFolderTreeContentsCheckSumRecursively ( config . getPathListForType ( ptTilesets , scenarioDir ) , string ( " / " ) + gameSettings - > getTileset ( ) + string ( " /* " ) , " .xml " , NULL ) ;
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] data.tilesetCRC = %d, [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . tilesetCRC , gameSettings - > getTileset ( ) . c_str ( ) ) ;
2010-04-29 10:36:37 +02:00
2010-03-17 07:25:19 +01:00
//tech, load before map because of resources
2010-08-22 10:00:05 +02:00
data . header . techCRC = getFolderTreeContentsCheckSumRecursively ( config . getPathListForType ( ptTechs , scenarioDir ) , string ( " / " ) + gameSettings - > getTech ( ) + string ( " /* " ) , " .xml " , NULL ) ;
2010-03-17 07:25:19 +01:00
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] data.techCRC = %d, [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . techCRC , gameSettings - > getTech ( ) . c_str ( ) ) ;
2010-08-22 10:00:05 +02:00
vector < std : : pair < string , int32 > > vctFileList ;
vctFileList = getFolderTreeContentsCheckSumListRecursively ( config . getPathListForType ( ptTechs , scenarioDir ) , string ( " / " ) + gameSettings - > getTech ( ) + string ( " /* " ) , " .xml " , & vctFileList ) ;
data . header . techCRCFileCount = min ( ( int ) vctFileList . size ( ) , ( int ) maxFileCRCCount ) ;
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] vctFileList.size() = %d, maxFileCRCCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , vctFileList . size ( ) , maxFileCRCCount ) ;
2010-08-22 10:00:05 +02:00
for ( int idx = 0 ; idx < data . header . techCRCFileCount ; + + idx ) {
const std : : pair < string , int32 > & fileInfo = vctFileList [ idx ] ;
data . detail . techCRCFileList [ idx ] = fileInfo . first ;
data . detail . techCRCFileCRCList [ idx ] = fileInfo . second ;
}
2010-04-29 10:36:37 +02:00
2010-03-17 07:25:19 +01:00
//map
Checksum checksum ;
2010-09-17 10:26:22 +02:00
string file = Map : : getMapPath ( gameSettings - > getMap ( ) , scenarioDir , false ) ;
2010-03-17 07:25:19 +01:00
checksum . addFile ( file ) ;
2010-08-22 10:00:05 +02:00
data . header . mapCRC = checksum . getSum ( ) ;
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] data.mapCRC = %d, [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . mapCRC , gameSettings - > getMap ( ) . c_str ( ) ) ;
2010-08-22 10:00:05 +02:00
}
string NetworkMessageSynchNetworkGameData : : getTechCRCFileMismatchReport ( vector < std : : pair < string , int32 > > & vctFileList ) {
2010-08-26 05:15:36 +02:00
string result = " Techtree: [ " + data . header . tech . getString ( ) + " ] Filecount local: " + intToStr ( vctFileList . size ( ) ) + " remote: " + intToStr ( data . header . techCRCFileCount ) + " \n " ;
2010-08-27 01:04:14 +02:00
if ( vctFileList . size ( ) < = 0 ) {
result = result + " Local player has no files. \n " ;
2010-08-22 10:00:05 +02:00
}
2010-08-27 01:14:55 +02:00
else if ( data . header . techCRCFileCount < = 0 ) {
result = result + " Remote player has no files. \n " ;
}
2010-08-27 01:04:14 +02:00
else {
2010-08-22 10:00:05 +02:00
for ( int idx = 0 ; idx < vctFileList . size ( ) ; + + idx ) {
std : : pair < string , int32 > & fileInfo = vctFileList [ idx ] ;
2010-08-27 01:04:14 +02:00
bool fileFound = false ;
int32 remoteCRC = - 1 ;
for ( int j = 0 ; j < data . header . techCRCFileCount ; + + j ) {
string networkFile = data . detail . techCRCFileList [ j ] . getString ( ) ;
int32 & networkFileCRC = data . detail . techCRCFileCRCList [ j ] ;
if ( fileInfo . first = = networkFile ) {
fileFound = true ;
remoteCRC = networkFileCRC ;
break ;
}
2010-08-22 10:00:05 +02:00
}
2010-08-27 01:04:14 +02:00
if ( fileFound = = false ) {
result = result + " local file [ " + fileInfo . first + " ] missing remotely. \n " ;
}
else if ( fileInfo . second ! = remoteCRC ) {
result = result + " local file [ " + fileInfo . first + " ] CRC mismatch. \n " ;
}
2010-08-22 10:00:05 +02:00
}
2010-08-27 01:04:14 +02:00
for ( int i = 0 ; i < data . header . techCRCFileCount ; + + i ) {
string networkFile = data . detail . techCRCFileList [ i ] . getString ( ) ;
int32 & networkFileCRC = data . detail . techCRCFileCRCList [ i ] ;
bool fileFound = false ;
int32 localCRC = - 1 ;
for ( int idx = 0 ; idx < vctFileList . size ( ) ; + + idx ) {
std : : pair < string , int32 > & fileInfo = vctFileList [ idx ] ;
if ( networkFile = = fileInfo . first ) {
fileFound = true ;
localCRC = fileInfo . second ;
break ;
}
}
if ( fileFound = = false ) {
result = result + " remote file [ " + networkFile + " ] missing locally. \n " ;
}
else if ( networkFileCRC ! = localCRC ) {
result = result + " remote file [ " + networkFile + " ] CRC mismatch. \n " ;
}
2010-08-22 10:00:05 +02:00
}
}
return result ;
2010-03-17 07:25:19 +01:00
}
2010-08-21 01:53:10 +02:00
bool NetworkMessageSynchNetworkGameData : : receive ( Socket * socket ) {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] about to get nmtSynchNetworkGameData \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-21 01:53:10 +02:00
2011-04-24 06:22:19 +02:00
/*
2010-08-22 10:00:05 +02:00
data . header . techCRCFileCount = 0 ;
2011-01-03 03:16:00 +01:00
const double MAX_MSG_WAIT_SECONDS = 10 ;
2010-08-21 01:53:10 +02:00
2011-01-03 03:16:00 +01:00
// Wait a max of x seconds for this message
for ( time_t elapsedWait = time ( NULL ) ; difftime ( time ( NULL ) , elapsedWait ) < = MAX_MSG_WAIT_SECONDS ; ) {
2010-08-22 10:00:05 +02:00
if ( NetworkMessage : : peek ( socket , & data , HeaderSize ) = = true ) {
break ;
}
}
if ( NetworkMessage : : peek ( socket , & data , HeaderSize ) = = false ) {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] ERROR / WARNING!!! NetworkMessage::peek failed! \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-22 10:00:05 +02:00
return false ;
}
data . header . map . nullTerminate ( ) ;
data . header . tileset . nullTerminate ( ) ;
data . header . tech . nullTerminate ( ) ;
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] messageType = %d, data.techCRCFileCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . messageType , data . header . techCRCFileCount ) ;
2010-08-22 10:00:05 +02:00
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , HeaderSize , true ) ;
2010-08-22 10:00:05 +02:00
if ( result = = true & & data . header . techCRCFileCount > 0 ) {
2010-08-26 04:36:17 +02:00
// Here we loop possibly multiple times
int packetLoopCount = 1 ;
2010-08-26 16:48:04 +02:00
if ( data . header . techCRCFileCount > NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ) {
packetLoopCount = ( data . header . techCRCFileCount / NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ) ;
if ( data . header . techCRCFileCount % NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount > 0 ) {
2010-08-26 04:36:17 +02:00
packetLoopCount + + ;
2010-08-22 10:00:05 +02:00
}
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] packetLoopCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , packetLoopCount ) ;
2010-08-26 04:36:17 +02:00
2010-08-26 22:28:26 +02:00
for ( int iPacketLoop = 0 ; result = = true & & iPacketLoop < packetLoopCount ; + + iPacketLoop ) {
2010-08-26 04:36:17 +02:00
2010-08-26 16:48:04 +02:00
int packetIndex = iPacketLoop * NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ;
2010-08-26 17:00:50 +02:00
int maxFileCountPerPacket = maxFileCRCPacketCount ;
int packetFileCount = min ( maxFileCountPerPacket , data . header . techCRCFileCount - packetIndex ) ;
2010-08-26 22:28:26 +02:00
int packetDetail1DataSize = ( DetailSize1 * packetFileCount ) ;
int packetDetail2DataSize = ( DetailSize2 * packetFileCount ) ;
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] iPacketLoop = %d, packetIndex = %d, maxFileCountPerPacket = %d, packetFileCount = %d, packetDetail1DataSize = %d, packetDetail2DataSize = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , iPacketLoop , packetIndex , maxFileCountPerPacket , packetFileCount , packetDetail1DataSize , packetDetail2DataSize ) ;
2010-08-22 10:00:05 +02:00
2011-01-03 03:16:00 +01:00
// Wait a max of x seconds for this message
for ( time_t elapsedWait = time ( NULL ) ; difftime ( time ( NULL ) , elapsedWait ) < = MAX_MSG_WAIT_SECONDS ; ) {
2010-08-26 22:28:26 +02:00
if ( NetworkMessage : : peek ( socket , & data . detail . techCRCFileList [ packetIndex ] , packetDetail1DataSize ) = = true ) {
2010-08-22 10:00:05 +02:00
break ;
}
}
2011-04-24 06:22:19 +02:00
result = NetworkMessage : : receive ( socket , & data . detail . techCRCFileList [ packetIndex ] , packetDetail1DataSize , true ) ;
2010-08-26 04:36:17 +02:00
if ( result = = true ) {
for ( int i = 0 ; i < data . header . techCRCFileCount ; + + i ) {
data . detail . techCRCFileList [ i ] . nullTerminate ( ) ;
}
2011-01-03 03:16:00 +01:00
// Wait a max of x seconds for this message
for ( time_t elapsedWait = time ( NULL ) ; difftime ( time ( NULL ) , elapsedWait ) < = MAX_MSG_WAIT_SECONDS ; ) {
2010-08-26 22:28:26 +02:00
if ( NetworkMessage : : peek ( socket , & data . detail . techCRCFileCRCList [ packetIndex ] , packetDetail2DataSize ) = = true ) {
2010-08-26 04:36:17 +02:00
break ;
}
}
2011-04-24 06:22:19 +02:00
result = NetworkMessage : : receive ( socket , & data . detail . techCRCFileCRCList [ packetIndex ] , packetDetail2DataSize , true ) ;
2010-08-26 04:36:17 +02:00
}
2010-08-22 10:00:05 +02:00
}
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] result = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , result ) ;
2010-08-21 01:53:10 +02:00
return result ;
2011-04-24 06:22:19 +02:00
*/
data . header . techCRCFileCount = 0 ;
bool result = NetworkMessage : : receive ( socket , & data , HeaderSize , true ) ;
if ( result = = true & & data . header . techCRCFileCount > 0 ) {
data . header . map . nullTerminate ( ) ;
data . header . tileset . nullTerminate ( ) ;
data . header . tech . nullTerminate ( ) ;
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] messageType = %d, data.techCRCFileCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . messageType , data . header . techCRCFileCount ) ;
// Here we loop possibly multiple times
int packetLoopCount = 1 ;
if ( data . header . techCRCFileCount > NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ) {
packetLoopCount = ( data . header . techCRCFileCount / NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ) ;
if ( data . header . techCRCFileCount % NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount > 0 ) {
packetLoopCount + + ;
}
}
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] packetLoopCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , packetLoopCount ) ;
for ( int iPacketLoop = 0 ; result = = true & & iPacketLoop < packetLoopCount ; + + iPacketLoop ) {
int packetIndex = iPacketLoop * NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ;
int maxFileCountPerPacket = maxFileCRCPacketCount ;
int packetFileCount = min ( maxFileCountPerPacket , data . header . techCRCFileCount - packetIndex ) ;
int packetDetail1DataSize = ( DetailSize1 * packetFileCount ) ;
int packetDetail2DataSize = ( DetailSize2 * packetFileCount ) ;
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] iPacketLoop = %d, packetIndex = %d, maxFileCountPerPacket = %d, packetFileCount = %d, packetDetail1DataSize = %d, packetDetail2DataSize = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , iPacketLoop , packetIndex , maxFileCountPerPacket , packetFileCount , packetDetail1DataSize , packetDetail2DataSize ) ;
// Wait a max of x seconds for this message
result = NetworkMessage : : receive ( socket , & data . detail . techCRCFileList [ packetIndex ] , packetDetail1DataSize , true ) ;
if ( result = = true ) {
for ( int i = 0 ; i < data . header . techCRCFileCount ; + + i ) {
data . detail . techCRCFileList [ i ] . nullTerminate ( ) ;
}
result = NetworkMessage : : receive ( socket , & data . detail . techCRCFileCRCList [ packetIndex ] , packetDetail2DataSize , true ) ;
}
}
}
return result ;
2010-03-17 07:25:19 +01:00
}
2010-08-07 05:26:38 +02:00
void NetworkMessageSynchNetworkGameData : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] about to send nmtSynchNetworkGameData \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-07 05:26:38 +02:00
2010-08-22 10:42:43 +02:00
assert ( data . header . messageType = = nmtSynchNetworkGameData ) ;
2010-08-22 10:00:05 +02:00
NetworkMessage : : send ( socket , & data , HeaderSize ) ;
if ( data . header . techCRCFileCount > 0 ) {
2010-08-26 04:36:17 +02:00
// Here we loop possibly multiple times
int packetLoopCount = 1 ;
2010-08-26 16:48:04 +02:00
if ( data . header . techCRCFileCount > NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ) {
packetLoopCount = ( data . header . techCRCFileCount / NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ) ;
if ( data . header . techCRCFileCount % NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount > 0 ) {
2010-08-26 04:36:17 +02:00
packetLoopCount + + ;
}
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] packetLoopCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , packetLoopCount ) ;
2010-08-26 04:36:17 +02:00
for ( int iPacketLoop = 0 ; iPacketLoop < packetLoopCount ; + + iPacketLoop ) {
2010-08-26 16:48:04 +02:00
int packetIndex = iPacketLoop * NetworkMessageSynchNetworkGameData : : maxFileCRCPacketCount ;
2010-08-26 17:00:50 +02:00
int maxFileCountPerPacket = maxFileCRCPacketCount ;
int packetFileCount = min ( maxFileCountPerPacket , data . header . techCRCFileCount - packetIndex ) ;
2010-08-26 04:36:17 +02:00
NetworkMessage : : send ( socket , & data . detail . techCRCFileList [ packetIndex ] , ( DetailSize1 * packetFileCount ) ) ;
NetworkMessage : : send ( socket , & data . detail . techCRCFileCRCList [ packetIndex ] , ( DetailSize2 * packetFileCount ) ) ;
}
2010-08-22 10:00:05 +02:00
}
2010-03-17 07:25:19 +01:00
}
// =====================================================
// class NetworkMessageSynchNetworkGameDataStatus
// =====================================================
2010-08-22 10:00:05 +02:00
NetworkMessageSynchNetworkGameDataStatus : : NetworkMessageSynchNetworkGameDataStatus ( int32 mapCRC , int32 tilesetCRC , int32 techCRC , vector < std : : pair < string , int32 > > & vctFileList )
2010-03-17 07:25:19 +01:00
{
2010-08-22 10:00:05 +02:00
data . header . messageType = nmtSynchNetworkGameDataStatus ;
2010-03-17 07:25:19 +01:00
2010-08-22 10:00:05 +02:00
data . header . tilesetCRC = tilesetCRC ;
data . header . techCRC = techCRC ;
data . header . mapCRC = mapCRC ;
data . header . techCRCFileCount = min ( ( int ) vctFileList . size ( ) , ( int ) maxFileCRCCount ) ;
for ( int idx = 0 ; idx < data . header . techCRCFileCount ; + + idx ) {
const std : : pair < string , int32 > & fileInfo = vctFileList [ idx ] ;
data . detail . techCRCFileList [ idx ] = fileInfo . first ;
data . detail . techCRCFileCRCList [ idx ] = fileInfo . second ;
}
2010-03-17 07:25:19 +01:00
}
2010-08-26 05:15:36 +02:00
string NetworkMessageSynchNetworkGameDataStatus : : getTechCRCFileMismatchReport ( string techtree , vector < std : : pair < string , int32 > > & vctFileList ) {
string result = " Techtree: [ " + techtree + " ] Filecount local: " + intToStr ( vctFileList . size ( ) ) + " remote: " + intToStr ( data . header . techCRCFileCount ) + " \n " ;
2010-08-27 01:04:14 +02:00
if ( vctFileList . size ( ) < = 0 ) {
result = result + " Local player has no files. \n " ;
2010-08-22 10:00:05 +02:00
}
2010-08-27 01:14:55 +02:00
else if ( data . header . techCRCFileCount < = 0 ) {
result = result + " Remote player has no files. \n " ;
}
2010-08-27 01:04:14 +02:00
else {
2010-08-22 10:00:05 +02:00
for ( int idx = 0 ; idx < vctFileList . size ( ) ; + + idx ) {
std : : pair < string , int32 > & fileInfo = vctFileList [ idx ] ;
2010-08-27 01:04:14 +02:00
bool fileFound = false ;
int32 remoteCRC = - 1 ;
for ( int j = 0 ; j < data . header . techCRCFileCount ; + + j ) {
string networkFile = data . detail . techCRCFileList [ j ] . getString ( ) ;
int32 & networkFileCRC = data . detail . techCRCFileCRCList [ j ] ;
if ( fileInfo . first = = networkFile ) {
fileFound = true ;
remoteCRC = networkFileCRC ;
break ;
}
}
2010-08-22 10:00:05 +02:00
2010-08-27 01:04:14 +02:00
if ( fileFound = = false ) {
result = result + " local file [ " + fileInfo . first + " ] missing remotely. \n " ;
}
else if ( fileInfo . second ! = remoteCRC ) {
result = result + " local file [ " + fileInfo . first + " ] CRC mismatch. \n " ;
2010-08-22 10:00:05 +02:00
}
}
2010-08-27 01:04:14 +02:00
for ( int i = 0 ; i < data . header . techCRCFileCount ; + + i ) {
string networkFile = data . detail . techCRCFileList [ i ] . getString ( ) ;
int32 & networkFileCRC = data . detail . techCRCFileCRCList [ i ] ;
bool fileFound = false ;
int32 localCRC = - 1 ;
for ( int idx = 0 ; idx < vctFileList . size ( ) ; + + idx ) {
std : : pair < string , int32 > & fileInfo = vctFileList [ idx ] ;
if ( networkFile = = fileInfo . first ) {
fileFound = true ;
localCRC = fileInfo . second ;
break ;
}
}
if ( fileFound = = false ) {
result = result + " remote file [ " + networkFile + " ] missing locally. \n " ;
}
else if ( networkFileCRC ! = localCRC ) {
result = result + " remote file [ " + networkFile + " ] CRC mismatch. \n " ;
}
2010-08-22 10:00:05 +02:00
}
}
return result ;
}
bool NetworkMessageSynchNetworkGameDataStatus : : receive ( Socket * socket ) {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] about to get nmtSynchNetworkGameDataStatus \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-04-24 06:22:19 +02:00
/*
2010-08-22 10:00:05 +02:00
data . header . techCRCFileCount = 0 ;
2011-01-03 03:16:00 +01:00
const double MAX_MSG_WAIT_SECONDS = 3 ;
// Wait a max of x seconds for this message
for ( time_t elapsedWait = time ( NULL ) ; difftime ( time ( NULL ) , elapsedWait ) < = MAX_MSG_WAIT_SECONDS ; ) {
2010-08-22 10:00:05 +02:00
if ( NetworkMessage : : peek ( socket , & data , HeaderSize ) = = true ) {
break ;
}
}
if ( NetworkMessage : : peek ( socket , & data , HeaderSize ) = = false ) {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] ERROR / WARNING!!! NetworkMessage::peek failed! \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-22 10:00:05 +02:00
return false ;
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] messageType = %d, data.techCRCFileCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . messageType , data . header . techCRCFileCount ) ;
2010-08-22 10:00:05 +02:00
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , HeaderSize , true ) ;
2010-08-22 10:00:05 +02:00
if ( result = = true & & data . header . techCRCFileCount > 0 ) {
2010-08-26 04:36:17 +02:00
// Here we loop possibly multiple times
int packetLoopCount = 1 ;
2010-08-26 16:48:04 +02:00
if ( data . header . techCRCFileCount > NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ) {
packetLoopCount = ( data . header . techCRCFileCount / NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ) ;
if ( data . header . techCRCFileCount % NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount > 0 ) {
2010-08-26 04:36:17 +02:00
packetLoopCount + + ;
2010-08-22 10:00:05 +02:00
}
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] packetLoopCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , packetLoopCount ) ;
2010-08-26 04:36:17 +02:00
for ( int iPacketLoop = 0 ; iPacketLoop < packetLoopCount ; + + iPacketLoop ) {
2010-08-26 16:48:04 +02:00
int packetIndex = iPacketLoop * NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ;
2010-08-26 17:00:50 +02:00
int maxFileCountPerPacket = maxFileCRCPacketCount ;
int packetFileCount = min ( maxFileCountPerPacket , data . header . techCRCFileCount - packetIndex ) ;
2010-08-26 04:36:17 +02:00
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] iPacketLoop = %d, packetIndex = %d, packetFileCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , iPacketLoop , packetIndex , packetFileCount ) ;
2010-08-22 10:00:05 +02:00
2011-01-03 03:16:00 +01:00
// Wait a max of x seconds for this message
for ( time_t elapsedWait = time ( NULL ) ; difftime ( time ( NULL ) , elapsedWait ) < = MAX_MSG_WAIT_SECONDS ; ) {
2010-08-26 04:36:17 +02:00
if ( NetworkMessage : : peek ( socket , & data . detail . techCRCFileList [ packetIndex ] , ( DetailSize1 * packetFileCount ) ) = = true ) {
2010-08-22 10:00:05 +02:00
break ;
}
}
2011-04-24 06:22:19 +02:00
result = NetworkMessage : : receive ( socket , & data . detail . techCRCFileList [ packetIndex ] , ( DetailSize1 * packetFileCount ) , true ) ;
2010-08-26 04:36:17 +02:00
if ( result = = true ) {
for ( int i = 0 ; i < data . header . techCRCFileCount ; + + i ) {
data . detail . techCRCFileList [ i ] . nullTerminate ( ) ;
}
2011-01-03 03:16:00 +01:00
// Wait a max of x seconds for this message
for ( time_t elapsedWait = time ( NULL ) ; difftime ( time ( NULL ) , elapsedWait ) < = MAX_MSG_WAIT_SECONDS ; ) {
2010-08-26 04:36:17 +02:00
if ( NetworkMessage : : peek ( socket , & data . detail . techCRCFileCRCList [ packetIndex ] , ( DetailSize2 * packetFileCount ) ) = = true ) {
break ;
}
}
2011-04-24 06:22:19 +02:00
result = NetworkMessage : : receive ( socket , & data . detail . techCRCFileCRCList [ packetIndex ] , ( DetailSize2 * packetFileCount ) , true ) ;
}
}
}
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] result = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , result ) ;
return result ;
*/
data . header . techCRCFileCount = 0 ;
bool result = NetworkMessage : : receive ( socket , & data , HeaderSize , true ) ;
if ( result = = true & & data . header . techCRCFileCount > 0 ) {
// Here we loop possibly multiple times
int packetLoopCount = 1 ;
if ( data . header . techCRCFileCount > NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ) {
packetLoopCount = ( data . header . techCRCFileCount / NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ) ;
if ( data . header . techCRCFileCount % NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount > 0 ) {
packetLoopCount + + ;
}
}
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] packetLoopCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , packetLoopCount ) ;
for ( int iPacketLoop = 0 ; iPacketLoop < packetLoopCount ; + + iPacketLoop ) {
int packetIndex = iPacketLoop * NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ;
int maxFileCountPerPacket = maxFileCRCPacketCount ;
int packetFileCount = min ( maxFileCountPerPacket , data . header . techCRCFileCount - packetIndex ) ;
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] iPacketLoop = %d, packetIndex = %d, packetFileCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , iPacketLoop , packetIndex , packetFileCount ) ;
result = NetworkMessage : : receive ( socket , & data . detail . techCRCFileList [ packetIndex ] , ( DetailSize1 * packetFileCount ) , true ) ;
if ( result = = true ) {
for ( int i = 0 ; i < data . header . techCRCFileCount ; + + i ) {
data . detail . techCRCFileList [ i ] . nullTerminate ( ) ;
}
// Wait a max of x seconds for this message
result = NetworkMessage : : receive ( socket , & data . detail . techCRCFileCRCList [ packetIndex ] , ( DetailSize2 * packetFileCount ) , true ) ;
2010-08-26 04:36:17 +02:00
}
2010-08-22 10:00:05 +02:00
}
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] result = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , result ) ;
2010-08-22 10:00:05 +02:00
return result ;
2010-03-17 07:25:19 +01:00
}
2010-08-07 05:26:38 +02:00
void NetworkMessageSynchNetworkGameDataStatus : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] about to send nmtSynchNetworkGameDataStatus, data.header.techCRCFileCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . header . techCRCFileCount ) ;
2010-08-07 05:26:38 +02:00
2010-08-22 10:42:43 +02:00
assert ( data . header . messageType = = nmtSynchNetworkGameDataStatus ) ;
2010-08-22 10:00:05 +02:00
NetworkMessage : : send ( socket , & data , HeaderSize ) ;
if ( data . header . techCRCFileCount > 0 ) {
2010-08-26 04:36:17 +02:00
// Here we loop possibly multiple times
int packetLoopCount = 1 ;
2010-08-26 16:48:04 +02:00
if ( data . header . techCRCFileCount > NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ) {
packetLoopCount = ( data . header . techCRCFileCount / NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ) ;
if ( data . header . techCRCFileCount % NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount > 0 ) {
2010-08-26 04:36:17 +02:00
packetLoopCount + + ;
}
}
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] packetLoopCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , packetLoopCount ) ;
2010-08-26 04:36:17 +02:00
for ( int iPacketLoop = 0 ; iPacketLoop < packetLoopCount ; + + iPacketLoop ) {
2010-08-26 16:48:04 +02:00
int packetIndex = iPacketLoop * NetworkMessageSynchNetworkGameDataStatus : : maxFileCRCPacketCount ;
2010-08-26 17:00:50 +02:00
int maxFileCountPerPacket = maxFileCRCPacketCount ;
int packetFileCount = min ( maxFileCountPerPacket , data . header . techCRCFileCount - packetIndex ) ;
2010-08-26 04:36:17 +02:00
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] packetLoop = %d, packetIndex = %d, packetFileCount = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , iPacketLoop , packetIndex , packetFileCount ) ;
2010-08-26 04:36:17 +02:00
NetworkMessage : : send ( socket , & data . detail . techCRCFileList [ packetIndex ] , ( DetailSize1 * packetFileCount ) ) ;
NetworkMessage : : send ( socket , & data . detail . techCRCFileCRCList [ packetIndex ] , ( DetailSize2 * packetFileCount ) ) ;
}
2010-08-22 10:00:05 +02:00
}
2010-03-17 07:25:19 +01:00
}
// =====================================================
// class NetworkMessageSynchNetworkGameDataFileCRCCheck
// =====================================================
NetworkMessageSynchNetworkGameDataFileCRCCheck : : NetworkMessageSynchNetworkGameDataFileCRCCheck ( int32 totalFileCount , int32 fileIndex , int32 fileCRC , const string fileName )
{
data . messageType = nmtSynchNetworkGameDataFileCRCCheck ;
data . totalFileCount = totalFileCount ;
data . fileIndex = fileIndex ;
data . fileCRC = fileCRC ;
data . fileName = fileName ;
}
2010-08-21 01:53:10 +02:00
bool NetworkMessageSynchNetworkGameDataFileCRCCheck : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-08-21 01:53:10 +02:00
data . fileName . nullTerminate ( ) ;
return result ;
2010-03-17 07:25:19 +01:00
}
2010-08-07 05:26:38 +02:00
void NetworkMessageSynchNetworkGameDataFileCRCCheck : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] nmtSynchNetworkGameDataFileCRCCheck \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-07 05:26:38 +02:00
2010-03-17 07:25:19 +01:00
assert ( data . messageType = = nmtSynchNetworkGameDataFileCRCCheck ) ;
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
// =====================================================
// class NetworkMessageSynchNetworkGameDataFileGet
// =====================================================
NetworkMessageSynchNetworkGameDataFileGet : : NetworkMessageSynchNetworkGameDataFileGet ( const string fileName )
{
data . messageType = nmtSynchNetworkGameDataFileGet ;
data . fileName = fileName ;
}
2010-08-21 01:53:10 +02:00
bool NetworkMessageSynchNetworkGameDataFileGet : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-08-21 01:53:10 +02:00
data . fileName . nullTerminate ( ) ;
return result ;
2010-03-17 07:25:19 +01:00
}
2010-08-07 05:26:38 +02:00
void NetworkMessageSynchNetworkGameDataFileGet : : send ( Socket * socket ) const {
2011-03-28 05:54:23 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] nmtSynchNetworkGameDataFileGet \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-08-07 05:26:38 +02:00
2010-03-17 07:25:19 +01:00
assert ( data . messageType = = nmtSynchNetworkGameDataFileGet ) ;
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
2010-04-29 01:59:37 +02:00
// =====================================================
2010-08-23 06:33:21 +02:00
// class SwitchSetupRequest
2010-04-29 01:59:37 +02:00
// =====================================================
2010-08-23 06:33:21 +02:00
SwitchSetupRequest : : SwitchSetupRequest ( ) {
2010-04-29 01:59:37 +02:00
data . messageType = nmtSwitchSetupRequest ;
data . selectedFactionName = " " ;
data . currentFactionIndex = - 1 ;
data . toFactionIndex = - 1 ;
data . toTeam = - 1 ;
2010-08-21 15:04:52 +02:00
data . networkPlayerName = " " ;
2011-03-11 12:11:46 +01:00
data . networkPlayerStatus = npst_None ;
2010-08-23 06:33:21 +02:00
data . switchFlags = ssrft_None ;
2011-04-05 20:39:47 +02:00
data . language = " " ;
2010-04-29 01:59:37 +02:00
}
2010-08-23 06:33:21 +02:00
SwitchSetupRequest : : SwitchSetupRequest ( string selectedFactionName , int8 currentFactionIndex ,
int8 toFactionIndex , int8 toTeam , string networkPlayerName ,
2011-04-05 20:39:47 +02:00
int8 networkPlayerStatus , int8 flags ,
string language ) {
2010-04-29 01:59:37 +02:00
data . messageType = nmtSwitchSetupRequest ;
data . selectedFactionName = selectedFactionName ;
data . currentFactionIndex = currentFactionIndex ;
data . toFactionIndex = toFactionIndex ;
data . toTeam = toTeam ;
2010-08-21 15:04:52 +02:00
data . networkPlayerName = networkPlayerName ;
2011-03-11 12:11:46 +01:00
data . networkPlayerStatus = networkPlayerStatus ;
2010-08-23 06:33:21 +02:00
data . switchFlags = flags ;
2011-04-05 20:39:47 +02:00
data . language = language ;
2010-04-29 01:59:37 +02:00
}
2010-08-21 01:53:10 +02:00
bool SwitchSetupRequest : : receive ( Socket * socket ) {
2011-04-24 06:22:19 +02:00
bool result = NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-08-21 01:53:10 +02:00
data . selectedFactionName . nullTerminate ( ) ;
2010-08-21 15:04:52 +02:00
data . networkPlayerName . nullTerminate ( ) ;
2011-04-05 20:39:47 +02:00
data . language . nullTerminate ( ) ;
2010-08-21 01:53:10 +02:00
2011-03-26 17:51:26 +01:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line %d] data.networkPlayerName [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . networkPlayerName . getString ( ) . c_str ( ) ) ;
2010-08-21 01:53:10 +02:00
return result ;
2010-04-29 01:59:37 +02:00
}
2010-08-23 06:33:21 +02:00
void SwitchSetupRequest : : send ( Socket * socket ) const {
2010-04-29 01:59:37 +02:00
assert ( data . messageType = = nmtSwitchSetupRequest ) ;
2011-03-26 17:51:26 +01:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line %d] data.networkPlayerName [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , data . networkPlayerName . getString ( ) . c_str ( ) ) ;
2010-04-29 01:59:37 +02:00
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
2010-04-30 03:08:29 +02:00
// =====================================================
// class PlayerIndexMessage
// =====================================================
PlayerIndexMessage : : PlayerIndexMessage ( int16 playerIndex )
{
data . messageType = nmtPlayerIndexMessage ;
data . playerIndex = playerIndex ;
}
2011-04-24 06:22:19 +02:00
bool PlayerIndexMessage : : receive ( Socket * socket ) {
return NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2010-04-30 03:08:29 +02:00
}
2011-04-24 06:22:19 +02:00
void PlayerIndexMessage : : send ( Socket * socket ) const {
2010-04-30 03:08:29 +02:00
assert ( data . messageType = = nmtPlayerIndexMessage ) ;
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
2010-04-29 01:59:37 +02:00
2011-03-31 20:13:02 +02:00
// =====================================================
// class NetworkMessageLoadingStatus
// =====================================================
NetworkMessageLoadingStatus : : NetworkMessageLoadingStatus ( uint32 status )
{
data . messageType = nmtLoadingStatusMessage ;
data . status = status ;
}
2011-04-24 06:22:19 +02:00
bool NetworkMessageLoadingStatus : : receive ( Socket * socket ) {
return NetworkMessage : : receive ( socket , & data , sizeof ( data ) , true ) ;
2011-03-31 20:13:02 +02:00
}
void NetworkMessageLoadingStatus : : send ( Socket * socket ) const
{
assert ( data . messageType = = nmtLoadingStatusMessage ) ;
NetworkMessage : : send ( socket , & data , sizeof ( data ) ) ;
}
2010-04-29 01:59:37 +02:00
2010-03-17 07:25:19 +01:00
} } //end namespace