2010-05-20 02:59:01 +02:00
|
|
|
/* Copyright (C) 2010 Wildfire Games.
|
2009-04-18 19:00:33 +02:00
|
|
|
* This file is part of 0 A.D.
|
|
|
|
*
|
|
|
|
* 0 A.D. is free software: you can redistribute it 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.
|
|
|
|
*
|
|
|
|
* 0 A.D. is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
/**
|
|
|
|
*-----------------------------------------------------------------------------
|
|
|
|
* FILE : NetMessage.cpp
|
|
|
|
* PROJECT : 0 A.D.
|
|
|
|
* DESCRIPTION :
|
|
|
|
*-----------------------------------------------------------------------------
|
|
|
|
*/
|
2003-11-25 03:11:50 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
// INCLUDES
|
|
|
|
#include "precompiled.h"
|
2006-06-02 04:10:27 +02:00
|
|
|
#include "ps/CLogger.h"
|
2008-06-16 20:19:35 +02:00
|
|
|
#include "Network.h"
|
2010-02-18 00:38:50 +01:00
|
|
|
#include "NetMessage.h"
|
|
|
|
|
2010-05-20 02:59:01 +02:00
|
|
|
#include "ps/Game.h"
|
|
|
|
#include "simulation2/Simulation2.h"
|
|
|
|
|
2010-02-18 00:38:50 +01:00
|
|
|
#undef ALLNETMSGS_DONT_CREATE_NMTS
|
|
|
|
#define ALLNETMSGS_IMPLEMENT
|
|
|
|
#include "NetMessages.h"
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
// DEFINES
|
2009-11-03 22:46:35 +01:00
|
|
|
#define LOG_CATEGORY L"net"
|
2003-11-25 03:11:50 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CNetMessage()
|
|
|
|
// Desc: Constructor
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage::CNetMessage( void )
|
2004-09-21 16:40:43 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
m_Type = NMT_INVALID;
|
|
|
|
m_Dirty = false;
|
2004-09-21 16:40:43 +02:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CNetMessage()
|
|
|
|
// Desc: Constructor
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage::CNetMessage( NetMessageType type )
|
2003-11-25 03:11:50 +01:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
m_Type = type;
|
|
|
|
m_Dirty = false;
|
2003-11-25 03:11:50 +01:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: ~CNetMessage()
|
|
|
|
// Desc: Destructor
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage::~CNetMessage( void )
|
2004-09-21 16:40:43 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
m_Dirty = false;
|
2004-09-21 16:40:43 +02:00
|
|
|
}
|
2004-03-08 03:04:34 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: Serialize()
|
|
|
|
// Desc: Serializes the message into the buffer parameter
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
u8* CNetMessage::Serialize( u8* pBuffer ) const
|
2005-08-09 17:55:44 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
// Validate parameters
|
|
|
|
if ( !pBuffer ) return NULL;
|
|
|
|
|
2010-05-20 19:46:07 +02:00
|
|
|
size_t size = GetSerializedLength();
|
|
|
|
Serialize_int_1( pBuffer, m_Type );
|
|
|
|
Serialize_int_2( pBuffer, size );
|
2008-06-16 20:19:35 +02:00
|
|
|
|
2010-05-20 19:46:07 +02:00
|
|
|
return pBuffer;
|
2005-08-09 17:55:44 +02:00
|
|
|
}
|
2004-03-08 03:04:34 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: Deserialize()
|
2009-02-28 17:42:46 +01:00
|
|
|
// Desc: Loads this message from the specified buffer parameter
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
const u8* CNetMessage::Deserialize( const u8* pStart, const u8* pEnd )
|
2004-08-16 17:19:17 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
// Validate parameters
|
|
|
|
if ( !pStart || !pEnd ) return NULL;
|
|
|
|
|
2010-05-20 19:46:07 +02:00
|
|
|
debug_assert( pStart + 3 <= pEnd );
|
2008-06-16 20:19:35 +02:00
|
|
|
|
2010-05-20 19:46:07 +02:00
|
|
|
const u8* pBuffer = pStart;
|
2008-06-16 20:19:35 +02:00
|
|
|
|
2010-05-20 19:46:07 +02:00
|
|
|
int type;
|
|
|
|
size_t size;
|
|
|
|
Deserialize_int_1( pBuffer, type );
|
|
|
|
Deserialize_int_2( pBuffer, size );
|
|
|
|
m_Type = (NetMessageType)type;
|
2008-06-16 20:19:35 +02:00
|
|
|
|
2010-05-20 02:59:01 +02:00
|
|
|
debug_assert( pStart + size == pEnd );
|
2008-06-16 20:19:35 +02:00
|
|
|
|
2010-05-20 19:46:07 +02:00
|
|
|
return pBuffer;
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: GetSerializedLength()
|
|
|
|
// Desc: Returns the size of the serialized message
|
|
|
|
//-----------------------------------------------------------------------------
|
2008-06-26 09:25:50 +02:00
|
|
|
size_t CNetMessage::GetSerializedLength( void ) const
|
2008-06-16 20:19:35 +02:00
|
|
|
{
|
|
|
|
// By default, return header size
|
2010-05-20 19:46:07 +02:00
|
|
|
return 3;
|
2003-11-25 03:11:50 +01:00
|
|
|
}
|
2004-03-08 03:04:34 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: ToString()
|
|
|
|
// Desc: Returns a string representation for the message
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CStr CNetMessage::ToString( void ) const
|
|
|
|
{
|
|
|
|
CStr ret;
|
|
|
|
|
|
|
|
// Not defined yet?
|
|
|
|
if ( GetType() == NMT_INVALID )
|
|
|
|
{
|
|
|
|
ret = "MESSAGE_TYPE_NONE { Undefined Message }";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ret = " Unknown Message " + CStr( GetType() );
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CreateMessage()
|
|
|
|
// Desc: Creates the appropriate message based on the given data
|
|
|
|
//-----------------------------------------------------------------------------
|
2008-06-26 09:25:50 +02:00
|
|
|
CNetMessage* CNetMessageFactory::CreateMessage(const void* pData,
|
2010-05-25 22:48:06 +02:00
|
|
|
size_t dataSize,
|
|
|
|
ScriptInterface& scriptInterface)
|
2008-06-16 20:19:35 +02:00
|
|
|
{
|
|
|
|
CNetMessage* pNewMessage = NULL;
|
|
|
|
CNetMessage header;
|
|
|
|
|
|
|
|
// Validate parameters
|
|
|
|
if ( !pData ) return NULL;
|
|
|
|
|
|
|
|
// Figure out message type
|
|
|
|
header.Deserialize( ( const u8* )pData, ( const u8* )pData + dataSize );
|
|
|
|
|
|
|
|
switch ( header.GetType() )
|
2006-03-31 05:30:34 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_GAME_SETUP:
|
|
|
|
pNewMessage = new CGameSetupMessage;
|
|
|
|
break;
|
2006-03-31 05:30:34 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_ASSIGN_PLAYER_SLOT:
|
|
|
|
pNewMessage = new CAssignPlayerSlotMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PLAYER_CONFIG:
|
|
|
|
pNewMessage = new CPlayerConfigMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PLAYER_JOIN:
|
|
|
|
pNewMessage = new CPlayerJoinMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_SERVER_HANDSHAKE:
|
|
|
|
pNewMessage = new CSrvHandshakeMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_SERVER_HANDSHAKE_RESPONSE:
|
|
|
|
pNewMessage = new CSrvHandshakeResponseMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_CONNECT_COMPLETE:
|
|
|
|
pNewMessage = new CConnectCompleteMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_ERROR:
|
|
|
|
pNewMessage = new CErrorMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_CLIENT_HANDSHAKE:
|
|
|
|
pNewMessage = new CCliHandshakeMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_AUTHENTICATE:
|
|
|
|
pNewMessage = new CAuthenticateMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_AUTHENTICATE_RESULT:
|
|
|
|
pNewMessage = new CAuthenticateResultMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_GAME_START:
|
|
|
|
pNewMessage = new CGameStartMessage;
|
|
|
|
break;
|
2008-07-03 08:29:22 +02:00
|
|
|
|
|
|
|
case NMT_END_COMMAND_BATCH:
|
|
|
|
pNewMessage = new CEndCommandBatchMessage;
|
|
|
|
break;
|
2010-05-22 16:05:56 +02:00
|
|
|
|
|
|
|
case NMT_SYNC_CHECK:
|
|
|
|
pNewMessage = new CSyncCheckMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_SYNC_ERROR:
|
|
|
|
pNewMessage = new CSyncErrorMessage;
|
|
|
|
break;
|
|
|
|
|
2008-07-12 21:08:38 +02:00
|
|
|
case NMT_CHAT:
|
|
|
|
pNewMessage = new CChatMessage;
|
|
|
|
break;
|
|
|
|
|
2010-05-20 02:59:01 +02:00
|
|
|
case NMT_SIMULATION_COMMAND:
|
2010-05-25 22:48:06 +02:00
|
|
|
pNewMessage = new CSimulationMessage(scriptInterface);
|
2010-05-20 02:59:01 +02:00
|
|
|
break;
|
|
|
|
|
2008-07-12 21:08:38 +02:00
|
|
|
default:
|
2009-11-03 22:46:35 +01:00
|
|
|
LOG(CLogger::Error, LOG_CATEGORY, L"CNetMessageFactory::CreateMessage(): Unknown message received" );
|
2008-07-12 21:08:38 +02:00
|
|
|
break;
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
if ( pNewMessage )
|
|
|
|
pNewMessage->Deserialize( ( const u8* )pData, ( const u8* )pData + dataSize );
|
|
|
|
|
|
|
|
return pNewMessage;
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|