diff --git a/stepmania/src/NetworkSyncManager.cpp b/stepmania/src/NetworkSyncManager.cpp index adcf31ac81..98c2edd360 100644 --- a/stepmania/src/NetworkSyncManager.cpp +++ b/stepmania/src/NetworkSyncManager.cpp @@ -22,6 +22,11 @@ void NetworkSyncManager::Update( float fDeltaTime ) { } bool NetworkSyncManager::ChangedScoreboard(int Column) { return false; } void NetworkSyncManager::SendChat(const CString& message) { } void NetworkSyncManager::SelectUserSong() { } + +void NetworkSyncManager::SendSMOnline( int command, char * data, int size ) { } +SMOnlinePacket & NetworkSyncManager::GetSMOnline( ) { } +SMOnlinePacket & NetworkSyncManager::PeekSMOnline( ) { } + #else #include "ezsockets.h" #include "ProfileManager.h" @@ -42,6 +47,8 @@ void NetworkSyncManager::SelectUserSong() { } const ScreenMessage SM_AddToChat = ScreenMessage(SM_User+4); const ScreenMessage SM_ChangeSong = ScreenMessage(SM_User+5); const ScreenMessage SM_GotEval = ScreenMessage(SM_User+6); +const ScreenMessage SM_UsersUpdate = ScreenMessage(SM_User+7); +const ScreenMessage SM_SMOnlinePack = ScreenMessage(SM_User+8); NetworkSyncManager::NetworkSyncManager( LoadingWindow *ld ) @@ -203,10 +210,6 @@ bool NetworkSyncManager::Connect(const CString& addy, unsigned short port) LOG->Info("Beginning to connect"); if (port != 8765) return false; - //Make sure using port 8765 - //This may change in future versions - //It is this way now for protocol's purpose. - //If there is a new protocol developed down the road NetPlayerClient->create(); // Initilize Socket useSMserver = NetPlayerClient->connect(addy, port); @@ -322,6 +325,8 @@ void NetworkSyncManager::ReportSongOver() void NetworkSyncManager::ReportStyle() { + LOG->Trace( "Sending \"Style\" to server" ); + if (!useSMserver) return; m_packet.ClearPacket(); @@ -414,7 +419,7 @@ void NetworkSyncManager::StartRequest(short position) for (int i=0; iblocking=false; @@ -508,8 +514,11 @@ void NetworkSyncManager::ProcessInput() m_packet.ClearPacket(); - while (NetPlayerClient->ReadPack((char *)&m_packet, NETMAXBUFFERSIZE)>0) + int packetSize; + + while ( (packetSize = NetPlayerClient->ReadPack((char *)&m_packet, NETMAXBUFFERSIZE) ) > 0 ) { + m_packet.size = packetSize; int command = m_packet.Read1(); //Check to make sure command is valid from server if (command < NSServerOffset) @@ -623,6 +632,7 @@ void NetworkSyncManager::ProcessInput() { /*int ServerMaxPlayers=*/m_packet.Read1(); int PlayersInThisPacket=m_packet.Read1(); + m_ActivePlayer.clear(); m_PlayerStatus.clear(); m_PlayerNames.clear(); m_ActivePlayers = 0; @@ -637,6 +647,7 @@ void NetworkSyncManager::ProcessInput() m_PlayerStatus.push_back( PStatus ); m_PlayerNames.push_back( m_packet.ReadNT() ); } + SCREENMAN->SendMessageToTopScreen( SM_UsersUpdate ); } break; case NSCSMS: @@ -651,6 +662,16 @@ void NetworkSyncManager::ProcessInput() SCREENMAN->SetNewScreen( "ScreenNetSelectMusic" ); //Should this be metric'd out? } break; + case NSCSMOnline: + { + PacketFunctions smoPack; + smoPack.size = packetSize - 1; + smoPack.Position = 0; + memcpy( smoPack.Data, m_packet.Data, packetSize-1 ); + LOG->Trace( "Received SMOnline Command: %d, size:%d", command, packetSize - 1 ); + m_SMOnlineStack.push_front( smoPack ); + SCREENMAN->SendMessageToTopScreen( SM_SMOnlinePack ); + } } m_packet.ClearPacket(); } @@ -689,9 +710,52 @@ void NetworkSyncManager::SelectUserSong() m_packet.WriteNT( m_sMainTitle ); m_packet.WriteNT( m_sArtist ); m_packet.WriteNT( m_sSubTitle ); - NetPlayerClient->SendPack((char*)&m_packet.Data, m_packet.Position); + NetPlayerClient->SendPack( (char*)&m_packet.Data, m_packet.Position ); } +void NetworkSyncManager::SendSMOnline( PacketFunctions &PackData ) +{ + NetPlayerClient->SendPack( (char*)&PackData.Data , PackData.size ); +} + +PacketFunctions NetworkSyncManager::GetSMOnline( ) +{ + PacketFunctions Pack; + + if ( m_SMOnlineStack.empty() ) + { + Pack.Position = 0; + Pack.size = 0; + return Pack; + } + + Pack = m_SMOnlineStack.back(); + + memcpy( Pack.Data, m_SMOnlineStack.back().Data, Pack.size ); + + m_SMOnlineStack.pop_back(); + return Pack; +} + +PacketFunctions NetworkSyncManager::PeekSMOnline( ) +{ + PacketFunctions Pack; + + if ( m_SMOnlineStack.empty() ) + { + Pack.Position = 0; + Pack.size = 0; + return Pack; + } + + Pack = m_SMOnlineStack.back(); + + memcpy( Pack.Data, m_SMOnlineStack.back().Data, Pack.size ); + + return Pack; +} + + //Packet functions diff --git a/stepmania/src/NetworkSyncManager.h b/stepmania/src/NetworkSyncManager.h index c0c18c1ca0..ad648ab12a 100644 --- a/stepmania/src/NetworkSyncManager.h +++ b/stepmania/src/NetworkSyncManager.h @@ -5,6 +5,7 @@ #include "PlayerNumber.h" #include "Difficulty.h" +#include class LoadingWindow; @@ -27,6 +28,7 @@ enum NSCommand NSCUUL, //9 NSCSMS, //10 NSCUPOpts, //11 + NSCSMOnline, //12 NUM_NS_COMMANDS }; @@ -59,6 +61,8 @@ class PacketFunctions public: unsigned char Data[NETMAXBUFFERSIZE]; //Data int Position; //Other info (Used for following functions) + int size; //When sending these pacs, Position should + //be used; NOT size. //Commands used to operate on NetPackets uint8_t Read1(); @@ -87,6 +91,12 @@ public: void ReportStyle(); //Report to server the style, players, and names void ReportNSSOnOff(int i); //Report song selection screen on/off void StartRequest(short position); //Request a start. Block until granted. + + //SMOnline stuff + void SendSMOnline( PacketFunctions &PackData ); + PacketFunctions GetSMOnline( ); + PacketFunctions PeekSMOnline( ); + bool Connect(const CString& addy, unsigned short port); // Connect to SM Server void PostStartUp(const CString& ServerIP); @@ -159,6 +169,8 @@ private: bool Listen(unsigned short port); PacketFunctions m_packet; + + deque m_SMOnlineStack; #endif };