1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-12-01 23:12:49 +02:00

rework netpacks to avoid double typeinfo

This commit is contained in:
Andrii Danylchenko
2023-02-12 09:23:39 +02:00
parent 8855829527
commit 9f55666931
23 changed files with 3046 additions and 1581 deletions

View File

@@ -27,6 +27,8 @@
#include "../lib/StartInfo.h"
#include "../lib/mapping/CMap.h"
#include "../lib/rmg/CMapGenOptions.h"
#include "../lib/NetPackVisitor.h"
#include "LobbyNetPackVisitors.h"
#ifdef VCMI_ANDROID
#include <jni.h>
#include <android/log.h>
@@ -81,10 +83,17 @@ public:
bool applyOnServerBefore(CVCMIServer * srv, void * pack) const override
{
T * ptr = static_cast<T *>(pack);
if(ptr->checkClientPermissions(srv))
ClientPermissionsCheckerNetPackVisitor checker(*srv);
ptr->visit(checker);
if(checker.getResult())
{
boost::unique_lock<boost::mutex> stateLock(srv->stateMutex);
return ptr->applyOnServer(srv);
ApplyOnServerNetPackVisitor applier(*srv);
ptr->visit(applier);
return applier.getResult();
}
else
return false;
@@ -93,7 +102,8 @@ public:
void applyOnServerAfter(CVCMIServer * srv, void * pack) const override
{
T * ptr = static_cast<T *>(pack);
ptr->applyOnServerAfterAnnounce(srv);
ApplyOnServerAfterAnnounceNetPackVisitor applier(*srv);
ptr->visit(applier);
}
};
@@ -363,6 +373,35 @@ void CVCMIServer::connectionAccepted(const boost::system::error_code & ec)
startAsyncAccept();
}
class CVCMIServerPackVisitor : public VCMI_LIB_WRAP_NAMESPACE(ICPackVisitor)
{
private:
CVCMIServer & handler;
CGameHandler & gh;
public:
CVCMIServerPackVisitor(CVCMIServer & handler, CGameHandler & gh)
:handler(handler), gh(gh)
{
}
virtual bool callTyped() override { return false; }
virtual void visitForLobby(CPackForLobby & packForLobby) override
{
handler.handleReceivedPack(std::unique_ptr<CPackForLobby>(&packForLobby));
}
virtual void visitForServer(CPackForServer & serverPack) override
{
gh.handleReceivedPack(&serverPack);
}
virtual void visitForClient(CPackForClient & clientPack) override
{
}
};
void CVCMIServer::threadHandleClient(std::shared_ptr<CConnection> c)
{
setThreadName("CVCMIServer::handleConnection");
@@ -394,15 +433,9 @@ void CVCMIServer::threadHandleClient(std::shared_ptr<CConnection> c)
}
break;
}
if(auto lobbyPack = dynamic_ptr_cast<CPackForLobby>(pack))
{
handleReceivedPack(std::unique_ptr<CPackForLobby>(lobbyPack));
}
else if(auto serverPack = dynamic_ptr_cast<CPackForServer>(pack))
{
gh->handleReceivedPack(serverPack);
}
CVCMIServerPackVisitor visitor(*this, *this->gh);
pack->visit(visitor);
}
#ifndef _MSC_VER
}