1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-27 12:22:45 +02:00

Simplified applying of lobby packs

This commit is contained in:
Ivan Savenko 2023-12-25 22:26:59 +02:00
parent 22f0ca67c6
commit 8ea69e457a
3 changed files with 23 additions and 45 deletions

View File

@ -451,7 +451,6 @@ static void mainLoop()
while(1) //main SDL events loop while(1) //main SDL events loop
{ {
GH.input().fetchEvents(); GH.input().fetchEvents();
CSH->applyPacksOnLobbyScreen();
GH.renderFrame(); GH.renderFrame();
} }
} }

View File

@ -76,8 +76,8 @@ extern std::atomic_bool androidTestServerReadyFlag;
class CBaseForLobbyApply class CBaseForLobbyApply
{ {
public: public:
virtual bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const = 0; virtual bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const = 0;
virtual void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const = 0; virtual void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const = 0;
virtual ~CBaseForLobbyApply(){}; virtual ~CBaseForLobbyApply(){};
template<typename U> static CBaseForLobbyApply * getApplier(const U * t = nullptr) template<typename U> static CBaseForLobbyApply * getApplier(const U * t = nullptr)
{ {
@ -88,40 +88,40 @@ public:
template<typename T> class CApplyOnLobby : public CBaseForLobbyApply template<typename T> class CApplyOnLobby : public CBaseForLobbyApply
{ {
public: public:
bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const override bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const override
{ {
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex); boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
T * ptr = static_cast<T *>(pack); T & ptr = static_cast<T &>(pack);
ApplyOnLobbyHandlerNetPackVisitor visitor(*handler); ApplyOnLobbyHandlerNetPackVisitor visitor(*handler);
logNetwork->trace("\tImmediately apply on lobby: %s", typeid(ptr).name()); logNetwork->trace("\tImmediately apply on lobby: %s", typeid(ptr).name());
ptr->visit(visitor); ptr.visit(visitor);
return visitor.getResult(); return visitor.getResult();
} }
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const override void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const override
{ {
T * ptr = static_cast<T *>(pack); T & ptr = static_cast<T &>(pack);
ApplyOnLobbyScreenNetPackVisitor visitor(*handler, lobby); ApplyOnLobbyScreenNetPackVisitor visitor(*handler, lobby);
logNetwork->trace("\tApply on lobby from queue: %s", typeid(ptr).name()); logNetwork->trace("\tApply on lobby from queue: %s", typeid(ptr).name());
ptr->visit(visitor); ptr.visit(visitor);
} }
}; };
template<> class CApplyOnLobby<CPack>: public CBaseForLobbyApply template<> class CApplyOnLobby<CPack>: public CBaseForLobbyApply
{ {
public: public:
bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const override bool applyOnLobbyHandler(CServerHandler * handler, CPackForLobby & pack) const override
{ {
logGlobal->error("Cannot apply plain CPack!"); logGlobal->error("Cannot apply plain CPack!");
assert(0); assert(0);
return false; return false;
} }
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, void * pack) const override void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler, CPackForLobby & pack) const override
{ {
logGlobal->error("Cannot apply plain CPack!"); logGlobal->error("Cannot apply plain CPack!");
assert(0); assert(0);
@ -139,7 +139,6 @@ CServerHandler::~CServerHandler()
CServerHandler::CServerHandler() CServerHandler::CServerHandler()
: state(EClientState::NONE) : state(EClientState::NONE)
, mx(std::make_shared<boost::recursive_mutex>())
, networkClient(std::make_unique<NetworkClient>(*this)) , networkClient(std::make_unique<NetworkClient>(*this))
, client(nullptr) , client(nullptr)
, loadMode(0) , loadMode(0)
@ -170,7 +169,6 @@ void CServerHandler::resetStateForLobby(const StartInfo::EMode mode, const std::
state = EClientState::NONE; state = EClientState::NONE;
mapToStart = nullptr; mapToStart = nullptr;
th = std::make_unique<CStopWatch>(); th = std::make_unique<CStopWatch>();
packsForLobbyScreen.clear();
c.reset(); c.reset();
si = std::make_shared<StartInfo>(); si = std::make_shared<StartInfo>();
playerNames.clear(); playerNames.clear();
@ -321,19 +319,12 @@ void CServerHandler::onConnectionEstablished(const std::shared_ptr<NetworkConnec
} }
} }
void CServerHandler::applyPacksOnLobbyScreen() void CServerHandler::applyPackOnLobbyScreen(CPackForLobby & pack)
{ {
boost::unique_lock<boost::recursive_mutex> lock(*mx);
while(!packsForLobbyScreen.empty())
{
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex); boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
CPackForLobby * pack = packsForLobbyScreen.front(); CBaseForLobbyApply * apply = applier->getApplier(CTypeList::getInstance().getTypeID(&pack)); //find the applier
packsForLobbyScreen.pop_front();
CBaseForLobbyApply * apply = applier->getApplier(CTypeList::getInstance().getTypeID(pack)); //find the applier
apply->applyOnLobbyScreen(dynamic_cast<CLobbyScreen *>(SEL), this, pack); apply->applyOnLobbyScreen(dynamic_cast<CLobbyScreen *>(SEL), this, pack);
GH.windows().totalRedraw(); GH.windows().totalRedraw();
delete pack;
}
} }
std::set<PlayerColor> CServerHandler::getHumanColors() std::set<PlayerColor> CServerHandler::getHumanColors()
@ -956,23 +947,19 @@ void CServerHandler::onDisconnected(const std::shared_ptr<NetworkConnection> &)
} }
else else
{ {
auto lcd = new LobbyClientDisconnected(); LobbyClientDisconnected lcd;
lcd->clientId = c->connectionID; lcd.clientId = c->connectionID;
boost::unique_lock<boost::recursive_mutex> lock(*mx); applyPackOnLobbyScreen(lcd);
packsForLobbyScreen.push_back(lcd);
} }
} }
} }
void CServerHandler::visitForLobby(CPackForLobby & lobbyPack) void CServerHandler::visitForLobby(CPackForLobby & lobbyPack)
{ {
if(applier->getApplier(CTypeList::getInstance().getTypeID(&lobbyPack))->applyOnLobbyHandler(this, &lobbyPack)) if(applier->getApplier(CTypeList::getInstance().getTypeID(&lobbyPack))->applyOnLobbyHandler(this, lobbyPack))
{ {
if(!settings["session"]["headless"].Bool()) if(!settings["session"]["headless"].Bool())
{ applyPackOnLobbyScreen(lobbyPack);
boost::unique_lock<boost::recursive_mutex> lock(*mx);
packsForLobbyScreen.push_back(&lobbyPack);
}
} }
} }

View File

@ -83,21 +83,13 @@ public:
/// structure to handle running server and connecting to it /// structure to handle running server and connecting to it
class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClientListener, boost::noncopyable class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClientListener, boost::noncopyable
{ {
std::unique_ptr<NetworkClient> networkClient;
friend class ApplyOnLobbyHandlerNetPackVisitor; friend class ApplyOnLobbyHandlerNetPackVisitor;
std::unique_ptr<NetworkClient> networkClient;
std::shared_ptr<CApplier<CBaseForLobbyApply>> applier; std::shared_ptr<CApplier<CBaseForLobbyApply>> applier;
std::shared_ptr<boost::recursive_mutex> mx;
std::list<CPackForLobby *> packsForLobbyScreen; //protected by mx
std::shared_ptr<CMapInfo> mapToStart; std::shared_ptr<CMapInfo> mapToStart;
std::vector<std::string> myNames; std::vector<std::string> myNames;
std::shared_ptr<HighScoreCalculation> highScoreCalc; std::shared_ptr<HighScoreCalculation> highScoreCalc;
std::function<void()> onConnectedCallback; std::function<void()> onConnectedCallback;
void threadRunNetwork(); void threadRunNetwork();
@ -110,6 +102,7 @@ class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClien
void onConnectionEstablished(const std::shared_ptr<NetworkConnection> &) override; void onConnectionEstablished(const std::shared_ptr<NetworkConnection> &) override;
void onDisconnected(const std::shared_ptr<NetworkConnection> &) override; void onDisconnected(const std::shared_ptr<NetworkConnection> &) override;
void applyPackOnLobbyScreen(CPackForLobby & pack);
public: public:
std::shared_ptr<CConnection> c; std::shared_ptr<CConnection> c;
@ -143,7 +136,6 @@ public:
void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr); void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr);
void startLocalServerAndConnect(const std::function<void()> & onConnected); void startLocalServerAndConnect(const std::function<void()> & onConnected);
void justConnectToServer(const std::string & addr, const ui16 port, const std::function<void()> & onConnected); void justConnectToServer(const std::string & addr, const ui16 port, const std::function<void()> & onConnected);
void applyPacksOnLobbyScreen();
// Helpers for lobby state access // Helpers for lobby state access
std::set<PlayerColor> getHumanColors(); std::set<PlayerColor> getHumanColors();