mirror of
https://github.com/RGBCube/serenity
synced 2025-05-24 00:55:06 +00:00
ProtocolServer: Send the download payload to clients as a shared buffer
The DownloadFinished message from the server now includes a buffer ID that can be mapped into the client program. To avoid prematurely destroying the buffer, the server will hang on to it until the client lets it know that they're all good. That's what the ProtocolServer::DisownSharedBuffer message is about. In the future it would be nice if the kernel had a mechanism to allow passing ownership of a shared buffer along with an IPC message somehow.
This commit is contained in:
parent
88c5126fa7
commit
eb85103271
10 changed files with 47 additions and 6 deletions
|
@ -2,6 +2,7 @@
|
|||
#include <ProtocolServer/PSClientConnection.h>
|
||||
#include <ProtocolServer/Protocol.h>
|
||||
#include <ProtocolServer/ProtocolClientEndpoint.h>
|
||||
#include <LibC/SharedBuffer.h>
|
||||
|
||||
static HashMap<int, RefPtr<PSClientConnection>> s_connections;
|
||||
|
||||
|
@ -48,7 +49,15 @@ OwnPtr<ProtocolServer::StopDownloadResponse> PSClientConnection::handle(const Pr
|
|||
|
||||
void PSClientConnection::did_finish_download(Badge<Download>, Download& download, bool success)
|
||||
{
|
||||
post_message(ProtocolClient::DownloadFinished(download.id(), success));
|
||||
RefPtr<SharedBuffer> buffer;
|
||||
if (success && !download.payload().is_null()) {
|
||||
buffer = SharedBuffer::create_with_size(download.payload().size());
|
||||
memcpy(buffer->data(), download.payload().data(), download.payload().size());
|
||||
buffer->seal();
|
||||
buffer->share_with(client_pid());
|
||||
m_shared_buffers.set(buffer->shared_buffer_id(), buffer);
|
||||
}
|
||||
post_message(ProtocolClient::DownloadFinished(download.id(), success, download.total_size(), buffer ? buffer->shared_buffer_id() : -1));
|
||||
}
|
||||
|
||||
void PSClientConnection::did_progress_download(Badge<Download>, Download& download)
|
||||
|
@ -61,3 +70,9 @@ OwnPtr<ProtocolServer::GreetResponse> PSClientConnection::handle(const ProtocolS
|
|||
set_client_pid(message.client_pid());
|
||||
return make<ProtocolServer::GreetResponse>(getpid(), client_id());
|
||||
}
|
||||
|
||||
OwnPtr<ProtocolServer::DisownSharedBufferResponse> PSClientConnection::handle(const ProtocolServer::DisownSharedBuffer& message)
|
||||
{
|
||||
m_shared_buffers.remove(message.shared_buffer_id());
|
||||
return make<ProtocolServer::DisownSharedBufferResponse>();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue