
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.
61 lines
1.4 KiB
C++
61 lines
1.4 KiB
C++
#include <ProtocolServer/Download.h>
|
|
#include <ProtocolServer/PSClientConnection.h>
|
|
|
|
// FIXME: What about rollover?
|
|
static i32 s_next_id = 1;
|
|
|
|
static HashMap<i32, RefPtr<Download>>& all_downloads()
|
|
{
|
|
static HashMap<i32, RefPtr<Download>> map;
|
|
return map;
|
|
}
|
|
|
|
Download* Download::find_by_id(i32 id)
|
|
{
|
|
return all_downloads().get(id).value_or(nullptr);
|
|
}
|
|
|
|
Download::Download(PSClientConnection& client)
|
|
: m_id(s_next_id++)
|
|
, m_client(client.make_weak_ptr())
|
|
{
|
|
all_downloads().set(m_id, this);
|
|
}
|
|
|
|
Download::~Download()
|
|
{
|
|
}
|
|
|
|
void Download::stop()
|
|
{
|
|
all_downloads().remove(m_id);
|
|
}
|
|
|
|
void Download::set_payload(const ByteBuffer& payload)
|
|
{
|
|
m_payload = payload;
|
|
m_total_size = payload.size();
|
|
}
|
|
|
|
void Download::did_finish(bool success)
|
|
{
|
|
if (!m_client) {
|
|
dbg() << "Download::did_finish() after the client already disconnected.";
|
|
return;
|
|
}
|
|
m_client->did_finish_download({}, *this, success);
|
|
all_downloads().remove(m_id);
|
|
}
|
|
|
|
void Download::did_progress(size_t total_size, size_t downloaded_size)
|
|
{
|
|
if (!m_client) {
|
|
// FIXME: We should also abort the download in this situation, I guess!
|
|
dbg() << "Download::did_progress() after the client already disconnected.";
|
|
return;
|
|
}
|
|
m_total_size = total_size;
|
|
m_downloaded_size = downloaded_size;
|
|
m_client->did_progress_download({}, *this);
|
|
}
|
|
|