/* $Id: serverconnectiontcp.cpp,v 1.8.2.2 2006/03/26 08:34:28 chfreund Exp $ */ #include "serverconnectiontcp.hpp" #include "global.hpp" #include "message.hpp" #include "client.hpp" #include "tcpconnection.hpp" ServerConnectionTCP::ServerConnectionTCP( RemoteServerEntry& entry ) : m_serverEntry( entry ), m_world( 0 ) { LOG( 2 ) INFO( "ServerConnectionTCP::ServerConnectionTCP: creating\n" ); m_socketSet = SDLNet_AllocSocketSet( 1 ); } ServerConnectionTCP::~ServerConnectionTCP() { LOG( 2 ) INFO( "ServerConnectionTCP::~ServerConnectionTCP: cleaning up\n" ); // clean up remaining messages for ( std::deque::iterator it = m_messageQueue.begin(); it != m_messageQueue.end(); it++ ) delete *it; for ( std::deque::iterator it = m_echoMessageQueue.begin(); it != m_echoMessageQueue.end(); it++ ) delete *it; if ( m_socketSet ) { SDLNet_FreeSocketSet( m_socketSet ); } } bool ServerConnectionTCP::checkConnection( ServerEntry* entry ) { // TODO: implement this return true; } bool ServerConnectionTCP::openConnection() { LOG( 2 ) INFO( "ServerConnectionTCP::openConnection: opening connection\n" ); m_socket = SDLNet_TCP_Open( &m_serverEntry.address ); if ( !m_socket ) { LOG( 2 ) INFO( "ServerConnectionTCP::openConnection: could not open " "connection: %s\n", SDLNet_GetError() ); return false; } SDLNet_TCP_AddSocket( m_socketSet, m_socket ); RequestMessage requestMessage; requestMessage.request = Message::CONNECT; TCPConnection::sendMessage( m_socket, &requestMessage ); Message* message = 0; int result = TCPConnection::recvMessage( m_socket, message ); ASSERT( !result, "ServerConnectionTCP::openConnection: lost connection\n" ); ASSERT( message->type == Message::CONNECT, "ServerConnectionTCP::openConnection: expected CONNECT message\n" ); ConnectMessage* connectMessage = static_cast( message ); Uint8 clientID = connectMessage->clientID; delete connectMessage; m_clientID = clientID; return true; } void ServerConnectionTCP::closeConnection() { LOG( 2 ) INFO( "ServerConnectionTCP::closeConnection: closing connection\n" ); // Send quit message to the server QuitMessage quitMessage; TCPConnection::sendMessage( m_socket, &quitMessage ); if ( m_socketSet && m_socket ) { SDLNet_TCP_DelSocket( m_socketSet, m_socket ); } if ( m_socket ) { SDLNet_TCP_Close( m_socket ); m_socket = 0; } } void ServerConnectionTCP::sendMessage( Message* message ) { TCPConnection::sendMessage( m_socket, message, m_compress, m_listener ); } EchoMessage* ServerConnectionTCP::getEchoMessage( Uint32 frame ) { while ( recvMessage() ) ; if ( m_echoMessageQueue.size() > 0 ) { EchoMessage* message = m_echoMessageQueue.front(); m_echoMessageQueue.pop_front(); return message; } return 0; } Message* ServerConnectionTCP::popMessage() { while ( recvMessage() ) ; if ( m_messageQueue.size() > 0 ) { Message* message = m_messageQueue.front(); m_messageQueue.pop_front(); return message; } return 0; } Message* ServerConnectionTCP::peekMessage() { while ( recvMessage() ) ; if ( m_messageQueue.size() > 0 ) { Message* message = m_messageQueue.front(); return message; } return 0; } bool ServerConnectionTCP::recvMessage() { if ( SDLNet_CheckSockets( m_socketSet, 0 ) == 0 ) return false; Message* message = 0; int result = TCPConnection::recvMessage( m_socket, message, m_listener ); if ( result == -1 ) { m_valid = false; } else { if ( message ) { if ( message->type == Message::ECHO ) { m_echoMessageQueue.push_back( static_cast( message ) ); // check regularly for hanging progress windows if ( m_client && !( static_cast( message )->frame % 100 ) ) m_client->hideJoinProgress(); } else if ( message->type == Message::SYNC_PROGRESS ) { SyncProgressMessage* syncMessage = static_cast( message ); if ( m_client ) m_client->showJoinProgress( syncMessage->messageSize, syncMessage->dataSent ); DBG( 4 ) INFO( "ServerConnectionTCP::recvMessage: sync progress is " "%d of %d\n", syncMessage->dataSent, syncMessage->messageSize ); delete syncMessage; } else m_messageQueue.push_back( message ); return true; } } return false; }