Translate network message in main thread

This commit is contained in:
Benau 2018-08-10 16:38:38 +08:00
parent 95f3dfc01a
commit 3e95feeb0b
5 changed files with 35 additions and 35 deletions

View File

@ -75,6 +75,11 @@ ClientLobby::ClientLobby(const TransportAddress& a, std::shared_ptr<Server> s)
m_server_address = a;
m_server = s;
setHandleDisconnections(true);
m_disconnected_msg[PDI_TIMEOUT] = _("Server connection timed out.");
m_disconnected_msg[PDI_NORMAL] = _("Server has been shut down.");
m_disconnected_msg[PDI_KICK] = _("You were kicked from the server.");
m_disconnected_msg[PDI_BAD_CONNECTION] =
_("Bad network connection is detected.");
} // ClientLobby
//-----------------------------------------------------------------------------
@ -140,6 +145,12 @@ bool ClientLobby::notifyEvent(Event* event)
case LE_CHAT: handleChat(event); break;
case LE_CONNECTION_ACCEPTED: connectionAccepted(event); break;
case LE_SERVER_INFO: handleServerInfo(event); break;
case LE_PLAYER_DISCONNECTED : disconnectedPlayer(event); break;
case LE_CONNECTION_REFUSED: connectionRefused(event); break;
case LE_VOTE: displayPlayerVote(event); break;
case LE_SERVER_OWNERSHIP: becomingServerOwner(); break;
case LE_BAD_TEAM: handleBadTeam(); break;
case LE_BAD_CONNECTION: handleBadConnection(); break;
default:
return false;
break;
@ -161,13 +172,7 @@ bool ClientLobby::notifyEventAsynchronous(Event* event)
message_type);
switch(message_type)
{
case LE_PLAYER_DISCONNECTED : disconnectedPlayer(event); break;
case LE_START_RACE: startGame(event); break;
case LE_CONNECTION_REFUSED: connectionRefused(event); break;
case LE_VOTE: displayPlayerVote(event); break;
case LE_SERVER_OWNERSHIP: becomingServerOwner(); break;
case LE_BAD_TEAM: handleBadTeam(); break;
case LE_BAD_CONNECTION: handleBadConnection(); break;
default: break;
} // switch
@ -182,25 +187,8 @@ bool ClientLobby::notifyEventAsynchronous(Event* event)
// So only signal that STKHost should exit, which will be tested
// from the main thread.
STKHost::get()->disconnectAllPeers(false/*timeout_waiting*/);
switch(event->getPeerDisconnectInfo())
{
case PDI_TIMEOUT:
STKHost::get()->setErrorMessage(
_("Server connection timed out."));
break;
case PDI_NORMAL:
STKHost::get()->setErrorMessage(
_("Server has been shut down."));
break;
case PDI_KICK:
STKHost::get()->setErrorMessage(
_("You were kicked from the server."));
break;
case PDI_BAD_CONNECTION:
STKHost::get()->setErrorMessage(
_("Bad network connection is detected."));
break;
} // switch
STKHost::get()->setErrorMessage(
m_disconnected_msg.at(event->getPeerDisconnectInfo()));
STKHost::get()->requestShutdown();
return true;
} // disconnection

View File

@ -24,9 +24,12 @@
#include "utils/cpp2011.hpp"
#include <atomic>
#include <map>
#include <memory>
#include <set>
enum PeerDisconnectInfo : unsigned int;
class BareNetworkString;
class Server;
@ -80,6 +83,8 @@ private:
void finalizeConnectionRequest(NetworkString* header,
BareNetworkString* rest, bool encrypt);
std::map<PeerDisconnectInfo, irr::core::stringw> m_disconnected_msg;
public:
ClientLobby(const TransportAddress& a, std::shared_ptr<Server> s);
virtual ~ClientLobby();

View File

@ -532,6 +532,7 @@ void ServerLobby::sendBadConnectionMessageToPeer(std::shared_ptr<STKPeer> p)
" started at %lf.", p->getAddress().toString().c_str(), max_ping,
StkTime::getRealTime());
NetworkString* msg = getNetworkString();
msg->setSynchronous(true);
msg->addUInt8(LE_BAD_CONNECTION);
p->sendPacket(msg, /*reliable*/true);
delete msg;
@ -815,6 +816,7 @@ void ServerLobby::startSelection(const Event *event)
{
Log::warn("ServerLobby", "Bad team choosing.");
NetworkString* bt = getNetworkString();
bt->setSynchronous(true);
bt->addUInt8(LE_BAD_TEAM);
sendMessageToPeers(bt, true/*reliable*/);
delete bt;
@ -1251,6 +1253,7 @@ void ServerLobby::clientDisconnected(Event* event)
return;
NetworkString* msg = getNetworkString(2);
msg->setSynchronous(true);
msg->addUInt8(LE_PLAYER_DISCONNECTED);
msg->addUInt8((uint8_t)players_on_peer.size());
for (auto p : players_on_peer)
@ -1299,6 +1302,7 @@ void ServerLobby::connectionRequested(Event* event)
m_game_setup->isGrandPrixStarted())
{
NetworkString *message = getNetworkString(2);
message->setSynchronous(true);
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_BUSY);
// send only to the peer that made the request and disconect it now
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
@ -1314,6 +1318,7 @@ void ServerLobby::connectionRequested(Event* event)
version > stk_config->m_max_server_version)
{
NetworkString *message = getNetworkString(2);
message->setSynchronous(true);
message->addUInt8(LE_CONNECTION_REFUSED)
.addUInt8(RR_INCOMPATIBLE_DATA);
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
@ -1361,6 +1366,7 @@ void ServerLobby::connectionRequested(Event* event)
tracks_erase.size() == m_available_kts.second.size())
{
NetworkString *message = getNetworkString(2);
message->setSynchronous(true);
message->addUInt8(LE_CONNECTION_REFUSED)
.addUInt8(RR_INCOMPATIBLE_DATA);
peer->cleanPlayerProfiles();
@ -1395,6 +1401,7 @@ void ServerLobby::connectionRequested(Event* event)
if (is_banned)
{
NetworkString *message = getNetworkString(2);
message->setSynchronous(true);
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_BANNED);
peer->cleanPlayerProfiles();
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
@ -1408,6 +1415,7 @@ void ServerLobby::connectionRequested(Event* event)
NetworkConfig::get()->getMaxPlayers())
{
NetworkString *message = getNetworkString(2);
message->setSynchronous(true);
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_TOO_MANY_PLAYERS);
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
peer->reset();
@ -1428,6 +1436,7 @@ void ServerLobby::connectionRequested(Event* event)
NetworkConfig::get()->isRankedServer()))
{
NetworkString* message = getNetworkString(2);
message->setSynchronous(true);
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_INVALID_PLAYER);
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
peer->reset();
@ -1463,6 +1472,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr<STKPeer> peer,
if (password != NetworkConfig::get()->getPassword())
{
NetworkString *message = getNetworkString(2);
message->setSynchronous(true);
message->addUInt8(LE_CONNECTION_REFUSED)
.addUInt8(RR_INCORRECT_PASSWORD);
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
@ -1477,6 +1487,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr<STKPeer> peer,
NetworkConfig::get()->isRankedServer())
{
NetworkString* message = getNetworkString(2);
message->setSynchronous(true);
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_INVALID_PLAYER);
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
peer->reset();
@ -1601,6 +1612,7 @@ void ServerLobby::updateServerOwner()
if (owner)
{
NetworkString* ns = getNetworkString();
ns->setSynchronous(true);
ns->addUInt8(LE_SERVER_OWNERSHIP);
owner->sendPacket(ns);
delete ns;
@ -1678,6 +1690,7 @@ void ServerLobby::playerVote(Event* event)
NetworkString other = NetworkString(PROTOCOL_LOBBY_ROOM);
std::string name = StringUtils::wideToUtf8(event->getPeer()
->getPlayerProfiles()[0]->getName());
other.setSynchronous(true);
other.addUInt8(LE_VOTE).addFloat(UserConfigParams::m_voting_timeout)
.encodeString(name).addUInt32(event->getPeer()->getHostId());
other += data;

View File

@ -454,8 +454,7 @@ void TracksScreen::onUpdate(float dt)
message += L"\n";
unsigned height = GUIEngine::getFont()->getDimension(L"X").Height;
const unsigned total_height = m_votes->getDimension().Height;
m_vote_messages.lock();
for (auto& p : m_vote_messages.getData())
for (auto& p : m_vote_messages)
{
height += GUIEngine::getFont()->getDimension(L"X").Height * 2;
if (height > total_height)
@ -463,7 +462,6 @@ void TracksScreen::onUpdate(float dt)
message += p.second;
message += L"\n";
}
m_vote_messages.unlock();
m_votes->setText(message, true);
} // onUpdate

View File

@ -60,7 +60,7 @@ private:
float m_vote_timeout = -1.0f;
Synchronised<std::map<std::string, core::stringw> > m_vote_messages;
std::map<std::string, core::stringw> m_vote_messages;
std::deque<std::string> m_random_track_list;
@ -100,9 +100,7 @@ public:
void resetVote()
{
m_vote_messages.lock();
m_vote_messages.getData().clear();
m_vote_messages.unlock();
m_vote_messages.clear();
m_vote_timeout = -1.0f;
}
@ -111,9 +109,7 @@ public:
void addVoteMessage(const std::string& user,
const irr::core::stringw& message)
{
m_vote_messages.lock();
m_vote_messages.getData()[user] = message;
m_vote_messages.unlock();
m_vote_messages[user] = message;
}
};