/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace Protocol { class Client; class Download : public RefCounted { public: struct CertificateAndKey { String certificate; String key; }; static NonnullRefPtr create_from_id(Badge, Client& client, i32 download_id) { return adopt_ref(*new Download(client, download_id)); } int id() const { return m_download_id; } int fd() const { return m_fd; } bool stop(); void stream_into(OutputStream&); bool should_buffer_all_input() const { return m_should_buffer_all_input; } /// Note: Will override `on_finish', and `on_headers_received', and expects `on_buffered_download_finish' to be set! void set_should_buffer_all_input(bool); /// Note: Must be set before `set_should_buffer_all_input(true)`. Function& response_headers, Optional response_code, ReadonlyBytes payload)> on_buffered_download_finish; Function on_finish; Function total_size, u32 downloaded_size)> on_progress; Function& response_headers, Optional response_code)> on_headers_received; Function on_certificate_requested; void did_finish(Badge, bool success, u32 total_size); void did_progress(Badge, Optional total_size, u32 downloaded_size); void did_receive_headers(Badge, const HashMap& response_headers, Optional response_code); void did_request_certificates(Badge); RefPtr& write_notifier(Badge) { return m_write_notifier; } void set_download_fd(Badge, int fd) { m_fd = fd; } private: explicit Download(Client&, i32 download_id); WeakPtr m_client; int m_download_id { -1 }; RefPtr m_write_notifier; int m_fd { -1 }; bool m_should_buffer_all_input { false }; struct InternalBufferedData { InternalBufferedData(int fd) : read_stream(fd) { } InputFileStream read_stream; DuplexMemoryStream payload_stream; HashMap response_headers; Optional response_code; }; struct InternalStreamData { InternalStreamData(int fd) : read_stream(fd) { } InputFileStream read_stream; RefPtr read_notifier; bool success; u32 total_size { 0 }; bool download_done { false }; }; OwnPtr m_internal_buffered_data; OwnPtr m_internal_stream_data; }; }