diff --git a/src/net/clientthread.h b/src/net/clientthread.h index 7009ed28..452c238b 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -108,6 +108,7 @@ protected: void InitGame(); void SendSessionPacket(boost::shared_ptr packet); + void SendQueuedPackets(); bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const; void RequestPlayerInfo(unsigned id, bool requestAvatar = false); diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index 620ef13a..302970ef 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -481,25 +481,28 @@ ClientThread::SendSessionPacket(boost::shared_ptr packet) { // Put packets in a buffer until the session is established. if (IsSessionEstablished()) - { - if (!m_outPacketList.empty()) - { - NetPacketList::iterator i = m_outPacketList.begin(); - NetPacketList::iterator end = m_outPacketList.end(); - - while (i != end) - { - GetSender().Send(GetContext().GetSessionData(), *i); - ++i; - } - m_outPacketList.clear(); - } GetSender().Send(GetContext().GetSessionData(), packet); - } else m_outPacketList.push_back(packet); } +void +ClientThread::SendQueuedPackets() +{ + if (!m_outPacketList.empty()) + { + NetPacketList::iterator i = m_outPacketList.begin(); + NetPacketList::iterator end = m_outPacketList.end(); + + while (i != end) + { + GetSender().Send(GetContext().GetSessionData(), *i); + ++i; + } + m_outPacketList.clear(); + } +} + bool ClientThread::GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const { @@ -1297,7 +1300,12 @@ ClientThread::IsSessionEstablished() const void ClientThread::SetSessionEstablished(bool flag) { - m_sessionEstablished = flag; + if (m_sessionEstablished != flag) + { + m_sessionEstablished = flag; + if (flag) + SendQueuedPackets(); + } } bool diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 2b1d81f1..88f9efb2 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -180,12 +180,9 @@ AbstractServerGameStateReceiving::~AbstractServerGameStateReceiving() { } -int +void AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) { - // This is the receive loop for the server. - int retVal = MSG_SOCK_INTERNAL_PENDING; - if (packet->IsClientActivity()) session.sessionData->ResetActivityTimer(); if (packet->ToNetPacketRetrievePlayerInfo()) @@ -267,10 +264,8 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se else { // Packet processing in subclass. - retVal = InternalProcessPacket(server, session, packet); + InternalProcessPacket(server, session, packet); } - - return retVal; } //----------------------------------------------------------------------------- @@ -423,11 +418,9 @@ ServerGameStateInit::TimerAdminTimeout(const boost::system::error_code &ec, boos } } -int +void ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) { - int retVal = MSG_SOCK_INTERNAL_PENDING; - if (packet->ToNetPacketStartEvent()) { // Only admins are allowed to start the game. @@ -476,8 +469,6 @@ ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, { server->SessionError(session, ERR_SOCK_INVALID_PACKET); } - - return retVal; } boost::shared_ptr @@ -532,11 +523,9 @@ ServerGameStateStartGame::HandleNewSession(boost::shared_ptr server, server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); } -int +void ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) { - int retVal = MSG_SOCK_INTERNAL_PENDING; - if (packet->ToNetPacketStartEventAck()) { session.sessionData->SetReadyFlag(); @@ -545,11 +534,8 @@ ServerGameStateStartGame::InternalProcessPacket(boost::shared_ptr se // Everyone is ready. server->GetSessionManager().ResetAllReadyFlags(); DoStart(server); - retVal = MSG_SOCK_INIT_DONE; } } - - return retVal; } void @@ -651,11 +637,10 @@ ServerGameStateHand::HandleNewSession(boost::shared_ptr server, Sess server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); } -int +void ServerGameStateHand::InternalProcessPacket(boost::shared_ptr /*server*/, SessionWrapper /*session*/, boost::shared_ptr /*packet*/) { // TODO: maybe reject packet. - return MSG_SOCK_INTERNAL_PENDING; } void @@ -1116,11 +1101,9 @@ ServerGameStateWaitPlayerAction::HandleNewSession(boost::shared_ptr server->MoveSessionToLobby(session, NTF_NET_REMOVED_ALREADY_RUNNING); } -int +void ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) { - int retVal = MSG_SOCK_INTERNAL_PENDING; - if (packet->ToNetPacketPlayersAction()) { NetPacketPlayersAction::Data actionData; @@ -1171,7 +1154,6 @@ ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptrSetState(ServerGameStateHand::Instance()); - retVal = MSG_NET_GAME_SERVER_ACTION; } else { @@ -1186,8 +1168,6 @@ ServerGameStateWaitPlayerAction::InternalProcessPacket(boost::shared_ptrGetLobbyThread().GetSender().Send(session.sessionData, reject); } } - - return retVal; } void diff --git a/src/net/servergamestate.h b/src/net/servergamestate.h index a14b9c0d..e8ecea7b 100644 --- a/src/net/servergamestate.h +++ b/src/net/servergamestate.h @@ -50,7 +50,7 @@ public: virtual void HandleNewSession(boost::shared_ptr server, SessionWrapper session) = 0; // Main processing function of the current state. - virtual int ProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) = 0; + virtual void ProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) = 0; }; // Abstract State: Receiving. @@ -61,11 +61,11 @@ public: // Globally handle packets which are allowed in all running states. // Calls InternalProcess if packet has not been processed. - virtual int ProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void ProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); protected: - virtual int InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) = 0; + virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet) = 0; }; // State: Initialization. @@ -90,7 +90,7 @@ protected: void TimerAdminWarning(const boost::system::error_code &ec, boost::shared_ptr server); void TimerAdminTimeout(const boost::system::error_code &ec, boost::shared_ptr server); - virtual int InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); static boost::shared_ptr CreateNetPacketPlayerJoined(const PlayerData &playerData); @@ -114,7 +114,7 @@ public: protected: ServerGameStateStartGame(); - virtual int InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr server); void DoStart(boost::shared_ptr server); @@ -138,7 +138,7 @@ public: protected: ServerGameStateHand(); - virtual int InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); void TimerLoop(const boost::system::error_code &ec, boost::shared_ptr server); void EngineLoop(boost::shared_ptr server); void TimerShowCards(const boost::system::error_code &ec, boost::shared_ptr server); @@ -170,7 +170,7 @@ public: protected: ServerGameStateWaitPlayerAction(); - virtual int InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); + virtual void InternalProcessPacket(boost::shared_ptr server, SessionWrapper session, boost::shared_ptr packet); void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr server); private: @@ -192,7 +192,7 @@ public: virtual void HandleNewSession(boost::shared_ptr /*server*/, SessionWrapper /*session*/) {} // Main processing function of the current state. - virtual int ProcessPacket(boost::shared_ptr /*server*/, SessionWrapper /*session*/, boost::shared_ptr /*packet*/) {return 0;} + virtual void ProcessPacket(boost::shared_ptr /*server*/, SessionWrapper /*session*/, boost::shared_ptr /*packet*/) {} protected: ServerGameStateFinal() {}