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);
|
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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user