mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-07-21 12:25:23 +00:00
Use std::function instead of inhereting from CNetFileReceiveTask
The user doesn't have to fiddle with `std::shared_ptr`. And two (more unrelated) things: use `std::unordered_map`, use a `std::find_if` in the callback. Comments By: @vladislavbelov, @Stan Differential Revision: https://code.wildfiregames.com/D5239 This was SVN commit r28048.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2021 Wildfire Games.
|
||||
/* Copyright (C) 2024 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "NetFileTransfer.h"
|
||||
|
||||
#include "lib/alignment.h"
|
||||
#include "lib/timer.h"
|
||||
#include "network/NetMessage.h"
|
||||
#include "network/NetSession.h"
|
||||
@@ -57,12 +58,12 @@ Status CNetFileTransferer::OnFileTransferResponse(const CFileTransferResponseMes
|
||||
return ERR::FAIL;
|
||||
}
|
||||
|
||||
CNetFileReceiveTask& task = *it->second;
|
||||
AsyncFileReceiveTask& task = it->second;
|
||||
|
||||
task.m_Length = message.m_Length;
|
||||
task.m_Buffer.reserve(message.m_Length);
|
||||
task.length = message.m_Length;
|
||||
task.buffer.reserve(message.m_Length);
|
||||
|
||||
LOGMESSAGERENDER("Downloading data over network (%lu KB) - please wait...", task.m_Length / 1024);
|
||||
LOGMESSAGERENDER("Downloading data over network (%lu KiB) - please wait...", task.length / KiB);
|
||||
m_LastProgressReportTime = timer_Time();
|
||||
|
||||
return INFO::OK;
|
||||
@@ -77,27 +78,28 @@ Status CNetFileTransferer::OnFileTransferData(const CFileTransferDataMessage& me
|
||||
return ERR::FAIL;
|
||||
}
|
||||
|
||||
CNetFileReceiveTask& task = *it->second;
|
||||
AsyncFileReceiveTask& task = it->second;
|
||||
|
||||
task.m_Buffer += message.m_Data;
|
||||
task.buffer += message.m_Data;
|
||||
|
||||
if (task.m_Buffer.size() > task.m_Length)
|
||||
if (task.buffer.size() > task.length)
|
||||
{
|
||||
LOGERROR("Net transfer: Invalid size for file transfer data (length=%lu actual=%zu)", task.m_Length, task.m_Buffer.size());
|
||||
LOGERROR("Net transfer: Invalid size for file transfer data (length=%lu actual=%zu)",
|
||||
task.length, task.buffer.size());
|
||||
return ERR::FAIL;
|
||||
}
|
||||
|
||||
CFileTransferAckMessage ackMessage;
|
||||
ackMessage.m_RequestID = task.m_RequestID;
|
||||
ackMessage.m_RequestID = message.m_RequestID;
|
||||
ackMessage.m_NumPackets = 1; // TODO: would be nice to send a single ack for multiple packets at once
|
||||
m_Session->SendMessage(&ackMessage);
|
||||
|
||||
if (task.m_Buffer.size() == task.m_Length)
|
||||
if (task.buffer.size() == task.length)
|
||||
{
|
||||
LOGMESSAGERENDER("Download completed");
|
||||
|
||||
task.OnComplete();
|
||||
m_FileReceiveTasks.erase(message.m_RequestID);
|
||||
task.onComplete(std::move(task.buffer));
|
||||
m_FileReceiveTasks.erase(it);
|
||||
return INFO::OK;
|
||||
}
|
||||
|
||||
@@ -107,7 +109,8 @@ Status CNetFileTransferer::OnFileTransferData(const CFileTransferDataMessage& me
|
||||
double t = timer_Time();
|
||||
if (t > m_LastProgressReportTime + 0.5)
|
||||
{
|
||||
LOGMESSAGERENDER("Downloading data: %.1f%% of %lu KB", 100.f * task.m_Buffer.size() / task.m_Length, task.m_Length / 1024);
|
||||
LOGMESSAGERENDER("Downloading data: %.1f%% of %lu KiB",
|
||||
100.f * task.buffer.size() / task.length, task.length / KiB);
|
||||
m_LastProgressReportTime = t;
|
||||
}
|
||||
|
||||
@@ -138,12 +141,11 @@ Status CNetFileTransferer::OnFileTransferAck(const CFileTransferAckMessage& mess
|
||||
|
||||
}
|
||||
|
||||
void CNetFileTransferer::StartTask(const std::shared_ptr<CNetFileReceiveTask>& task)
|
||||
void CNetFileTransferer::StartTask(std::function<void(std::string)> task)
|
||||
{
|
||||
u32 requestID = m_NextRequestID++;
|
||||
|
||||
task->m_RequestID = requestID;
|
||||
m_FileReceiveTasks[requestID] = task;
|
||||
m_FileReceiveTasks.emplace(requestID, AsyncFileReceiveTask{std::move(task)});
|
||||
|
||||
CFileTransferRequestMessage request;
|
||||
request.m_RequestID = requestID;
|
||||
|
||||
Reference in New Issue
Block a user