Enable multiple RequestTypes
This commit is contained in:
parent
e56ebb3f46
commit
3cfcaf7be6
@ -524,6 +524,9 @@ bool CNetClient::HandleMessage(CNetMessage* 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
|
||||
// it's always requesting the simulation state
|
||||
|
||||
@ -786,7 +789,7 @@ bool CNetClient::OnJoinSyncStart(CNetClient* client, CFsmEvent* event)
|
||||
CJoinSyncStartMessage* joinSyncStartMessage = (CJoinSyncStartMessage*)event->GetParamRef();
|
||||
|
||||
// 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)
|
||||
mutable
|
||||
{
|
||||
|
@ -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++;
|
||||
|
||||
m_FileReceiveTasks.emplace(requestID, AsyncFileReceiveTask{std::move(task)});
|
||||
|
||||
CFileTransferRequestMessage request;
|
||||
request.m_RequestType = static_cast<i8>(requestType);
|
||||
request.m_RequestID = requestID;
|
||||
m_Session->SendMessage(&request);
|
||||
}
|
||||
|
@ -48,6 +48,12 @@ static const size_t MAX_FILE_TRANSFER_SIZE = 8*MiB;
|
||||
class CNetFileTransferer
|
||||
{
|
||||
public:
|
||||
enum class RequestType
|
||||
{
|
||||
LOADGAME,
|
||||
REJOIN
|
||||
};
|
||||
|
||||
CNetFileTransferer(INetSession* session)
|
||||
: m_Session(session), m_NextRequestID(1), m_LastProgressReportTime(0)
|
||||
{
|
||||
@ -64,7 +70,7 @@ public:
|
||||
/**
|
||||
* 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.
|
||||
|
@ -155,6 +155,7 @@ START_NMT_CLASS_(PlayerAssignment, NMT_PLAYER_ASSIGNMENT)
|
||||
END_NMT_CLASS()
|
||||
|
||||
START_NMT_CLASS_(FileTransferRequest, NMT_FILE_TRANSFER_REQUEST)
|
||||
NMT_FIELD_INT(m_RequestType, i8, 1)
|
||||
NMT_FIELD_INT(m_RequestID, u32, 4)
|
||||
END_NMT_CLASS()
|
||||
|
||||
|
@ -623,6 +623,8 @@ void CNetServerWorker::HandleMessageReceive(const CNetMessage* message, CNetServ
|
||||
if (message->GetType() == NMT_FILE_TRANSFER_REQUEST)
|
||||
{
|
||||
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
|
||||
// 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.
|
||||
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
|
||||
// to the newly rejoining player.
|
||||
|
@ -89,7 +89,8 @@ public:
|
||||
|
||||
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.
|
||||
const bool previousComplete{std::exchange(complete, true)};
|
||||
@ -121,4 +122,17 @@ public:
|
||||
server.transferer.HandleMessageReceive(client.queues.acknowledgements.at(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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user