ladybird/Libraries/LibProtocol/Client.cpp
Andreas Kling eb85103271 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.
2019-11-23 22:11:44 +01:00

46 lines
1.2 KiB
C++

#include <LibProtocol/Client.h>
#include <SharedBuffer.h>
namespace LibProtocol {
Client::Client()
: ConnectionNG(*this, "/tmp/psportal")
{
}
void Client::handshake()
{
auto response = send_sync<ProtocolServer::Greet>(getpid());
set_server_pid(response->server_pid());
set_my_client_id(response->client_id());
}
bool Client::is_supported_protocol(const String& protocol)
{
return send_sync<ProtocolServer::IsSupportedProtocol>(protocol)->supported();
}
i32 Client::start_download(const String& url)
{
return send_sync<ProtocolServer::StartDownload>(url)->download_id();
}
bool Client::stop_download(i32 download_id)
{
return send_sync<ProtocolServer::StopDownload>(download_id)->success();
}
void Client::handle(const ProtocolClient::DownloadFinished& message)
{
if (on_download_finish)
on_download_finish(message.download_id(), message.success(), message.total_size(), message.shared_buffer_id());
send_sync<ProtocolServer::DisownSharedBuffer>(message.shared_buffer_id());
}
void Client::handle(const ProtocolClient::DownloadProgress& message)
{
if (on_download_progress)
on_download_progress(message.download_id(), message.total_size(), message.downloaded_size());
}
}