/* $Id: serverconnectiondirect.cpp,v 1.5 2005/11/30 21:36:06 chfreund Exp $ */ #include "serverconnectiondirect.hpp" #include "server.hpp" #include "servercommunicator.hpp" #include "clientconnectiondirect.hpp" ServerConnectionDirect::ServerConnectionDirect( Server* server ) { // get connection handle from server m_directConnection = server->getCommunicator()->getDirectConnection( this ); if ( !m_directConnection ) { // TODO: Implement this or delete if not needed } } ServerConnectionDirect::~ServerConnectionDirect() { } bool ServerConnectionDirect::checkConnection( ServerEntry* entry ) { return true; } bool ServerConnectionDirect::openConnection() { m_clientID = m_directConnection->openConnection(); return true; } void ServerConnectionDirect::closeConnection() { m_directConnection->closeConnection(); } void ServerConnectionDirect::sendMessage( Message* message ) { switch( message->type ) { case Message::ADD_PLAYER: { AddPlayerMessage* addPlayerMessage = static_cast( message ); Player* player = addPlayerMessage->player; // clone the player addPlayerMessage->player = NEW Player( *player ); break; } default: ASSERT( false, "ServerConnectionDirect::sendMessage: don't know how to send message of type %d\n", message->type ); break; } // Message* newMessage = message->clone(); m_directConnection->recvMessage( message ); } void ServerConnectionDirect::recvMessage( Message* message ) { if ( message->type == Message::ECHO ) m_echoMessageQueue.push_back( static_cast( message ) ); else if ( message->type == Message::SYNC_PROGRESS ) { SyncProgressMessage* syncMessage = static_cast( message ); DBG( 4 ) INFO( "ServerConnectionDirect::recvMessage: sync progress is " "%d of %d\n", syncMessage->dataSent, syncMessage->messageSize ); delete syncMessage; } else m_messageQueue.push_back( message ); } EchoMessage* ServerConnectionDirect::getEchoMessage( Uint32 frame ) { while ( m_echoMessageQueue.empty() ) ; EchoMessage* echoMessage; do { echoMessage = m_echoMessageQueue.front(); m_echoMessageQueue.pop_front(); DBG( 2 ) CHECK( echoMessage->frame == frame, "Echo frame %d != needed frame %d\n", echoMessage->frame, frame ); } while ( echoMessage->frame != frame ); return echoMessage; } Message* ServerConnectionDirect::popMessage() { if ( m_messageQueue.empty() ) return 0; Message* message = m_messageQueue.front(); m_messageQueue.pop_front(); return message; } Message* ServerConnectionDirect::peekMessage() { if ( m_messageQueue.empty() ) return 0; return m_messageQueue.front(); }