1
0
forked from 0ad/0ad

Enable multiple RequestTypes

This commit is contained in:
phosit 2024-09-03 20:43:26 +02:00
parent e56ebb3f46
commit 3cfcaf7be6
6 changed files with 33 additions and 5 deletions

View File

@ -524,6 +524,9 @@ bool CNetClient::HandleMessage(CNetMessage* message)
{ {
CFileTransferRequestMessage* reqMessage = static_cast<CFileTransferRequestMessage*>(message); CFileTransferRequestMessage* reqMessage = static_cast<CFileTransferRequestMessage*>(message);
ENSURE(static_cast<CNetFileTransferer::RequestType>(reqMessage->m_RequestType) ==
CNetFileTransferer::RequestType::REJOIN);
// TODO: we should support different transfer request types, instead of assuming // TODO: we should support different transfer request types, instead of assuming
// it's always requesting the simulation state // it's always requesting the simulation state
@ -786,7 +789,7 @@ bool CNetClient::OnJoinSyncStart(CNetClient* client, CFsmEvent* event)
CJoinSyncStartMessage* joinSyncStartMessage = (CJoinSyncStartMessage*)event->GetParamRef(); CJoinSyncStartMessage* joinSyncStartMessage = (CJoinSyncStartMessage*)event->GetParamRef();
// The server wants us to start downloading the game state from it, so do so // The server wants us to start downloading the game state from it, so do so
client->m_Session->GetFileTransferer().StartTask( client->m_Session->GetFileTransferer().StartTask(CNetFileTransferer::RequestType::REJOIN,
[client, initAttributes = std::move(joinSyncStartMessage->m_InitAttributes)](std::string buffer) [client, initAttributes = std::move(joinSyncStartMessage->m_InitAttributes)](std::string buffer)
mutable mutable
{ {

View File

@ -141,13 +141,14 @@ Status CNetFileTransferer::OnFileTransferAck(const CFileTransferAckMessage& mess
} }
void CNetFileTransferer::StartTask(std::function<void(std::string)> task) void CNetFileTransferer::StartTask(RequestType requestType, std::function<void(std::string)> task)
{ {
u32 requestID = m_NextRequestID++; u32 requestID = m_NextRequestID++;
m_FileReceiveTasks.emplace(requestID, AsyncFileReceiveTask{std::move(task)}); m_FileReceiveTasks.emplace(requestID, AsyncFileReceiveTask{std::move(task)});
CFileTransferRequestMessage request; CFileTransferRequestMessage request;
request.m_RequestType = static_cast<i8>(requestType);
request.m_RequestID = requestID; request.m_RequestID = requestID;
m_Session->SendMessage(&request); m_Session->SendMessage(&request);
} }

View File

@ -48,6 +48,12 @@ static const size_t MAX_FILE_TRANSFER_SIZE = 8*MiB;
class CNetFileTransferer class CNetFileTransferer
{ {
public: public:
enum class RequestType
{
LOADGAME,
REJOIN
};
CNetFileTransferer(INetSession* session) CNetFileTransferer(INetSession* session)
: m_Session(session), m_NextRequestID(1), m_LastProgressReportTime(0) : m_Session(session), m_NextRequestID(1), m_LastProgressReportTime(0)
{ {
@ -64,7 +70,7 @@ public:
/** /**
* Registers a file-receiving task. * Registers a file-receiving task.
*/ */
void StartTask(std::function<void(std::string)> task); void StartTask(RequestType requestType, std::function<void(std::string)> task);
/** /**
* Registers data to be sent in response to a request. * Registers data to be sent in response to a request.

View File

@ -155,6 +155,7 @@ START_NMT_CLASS_(PlayerAssignment, NMT_PLAYER_ASSIGNMENT)
END_NMT_CLASS() END_NMT_CLASS()
START_NMT_CLASS_(FileTransferRequest, NMT_FILE_TRANSFER_REQUEST) START_NMT_CLASS_(FileTransferRequest, NMT_FILE_TRANSFER_REQUEST)
NMT_FIELD_INT(m_RequestType, i8, 1)
NMT_FIELD_INT(m_RequestID, u32, 4) NMT_FIELD_INT(m_RequestID, u32, 4)
END_NMT_CLASS() END_NMT_CLASS()

View File

@ -623,6 +623,8 @@ void CNetServerWorker::HandleMessageReceive(const CNetMessage* message, CNetServ
if (message->GetType() == NMT_FILE_TRANSFER_REQUEST) if (message->GetType() == NMT_FILE_TRANSFER_REQUEST)
{ {
CFileTransferRequestMessage* reqMessage = (CFileTransferRequestMessage*)message; CFileTransferRequestMessage* reqMessage = (CFileTransferRequestMessage*)message;
ENSURE(static_cast<CNetFileTransferer::RequestType>(reqMessage->m_RequestType) ==
CNetFileTransferer::RequestType::REJOIN);
// Rejoining client got our JoinSyncStart after we received the state from // Rejoining client got our JoinSyncStart after we received the state from
// another client, and has now requested that we forward it to them // another client, and has now requested that we forward it to them
@ -1122,7 +1124,8 @@ bool CNetServerWorker::OnAuthenticate(CNetServerSession* session, CFsmEvent* eve
// copy from. // copy from.
CNetServerSession* sourceSession = server.m_Sessions.at(0); CNetServerSession* sourceSession = server.m_Sessions.at(0);
sourceSession->GetFileTransferer().StartTask([&server, newHostID](std::string buffer) sourceSession->GetFileTransferer().StartTask(CNetFileTransferer::RequestType::REJOIN,
[&server, newHostID](std::string buffer)
{ {
// We've received the game state from an existing player - now we need to send it onwards // We've received the game state from an existing player - now we need to send it onwards
// to the newly rejoining player. // to the newly rejoining player.

View File

@ -89,7 +89,8 @@ public:
bool complete{false}; bool complete{false};
client.transferer.StartTask([&complete](std::string buffer) client.transferer.StartTask(CNetFileTransferer::RequestType::LOADGAME,
[&complete](std::string buffer)
{ {
// This callback is executed exactly once. // This callback is executed exactly once.
const bool previousComplete{std::exchange(complete, true)}; const bool previousComplete{std::exchange(complete, true)};
@ -121,4 +122,17 @@ public:
server.transferer.HandleMessageReceive(client.queues.acknowledgements.at(0)); server.transferer.HandleMessageReceive(client.queues.acknowledgements.at(0));
CheckSizes(server.queues, 0, 1, 1, 0); CheckSizes(server.queues, 0, 1, 1, 0);
} }
void test_RequestType()
{
for (const auto& requestType : {CNetFileTransferer::RequestType::LOADGAME,
CNetFileTransferer::RequestType::REJOIN})
{
Participant client;
client.transferer.StartTask(requestType, [](auto&&){});
TS_ASSERT_EQUALS(static_cast<CNetFileTransferer::RequestType>(
client.queues.requests.at(0).m_RequestType), requestType);
}
}
}; };