| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef PERIDOT_LIB_SOCKET_SOCKET_WRITER_H_ |
| #define PERIDOT_LIB_SOCKET_SOCKET_WRITER_H_ |
| |
| #include <functional> |
| #include <memory> |
| #include <string> |
| |
| #include <lib/async/cpp/wait.h> |
| #include <lib/async/default.h> |
| #include <lib/fit/function.h> |
| #include <src/lib/fxl/macros.h> |
| #include <src/lib/fxl/strings/string_view.h> |
| #include <lib/zx/socket.h> |
| |
| namespace socket { |
| |
| // Requests data to write from its client. Interrupts itself and closes the |
| // socket when deleted. |
| class SocketWriter { |
| public: |
| class Client { |
| public: |
| virtual void GetNext(size_t offset, size_t max_size, |
| fit::function<void(fxl::StringView)> callback) = 0; |
| virtual void OnDataComplete() = 0; |
| |
| protected: |
| virtual ~Client() {} |
| }; |
| |
| explicit SocketWriter(Client* client, async_dispatcher_t* dispatcher = |
| async_get_default_dispatcher()); |
| ~SocketWriter(); |
| |
| void Start(zx::socket destination); |
| |
| private: |
| void GetData(); |
| void WriteData(fxl::StringView data); |
| void Done(); |
| |
| Client* const client_; |
| async_dispatcher_t* const dispatcher_; |
| // Position of the next byte to request. |
| size_t offset_ = 0u; |
| // Data left to send from last call to |GetNext|. |
| std::string data_; |
| // Data left to send. |
| fxl::StringView data_view_; |
| zx::socket destination_; |
| async::Wait wait_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(SocketWriter); |
| }; |
| |
| // Writes the content of a string to a socket. Deletes itself when done. |
| class StringSocketWriter : public SocketWriter::Client { |
| public: |
| explicit StringSocketWriter( |
| async_dispatcher_t* dispatcher = async_get_default_dispatcher()); |
| |
| void Start(std::string data, zx::socket destination); |
| |
| private: |
| void GetNext(size_t offset, size_t max_size, |
| fit::function<void(fxl::StringView)> callback) override; |
| void OnDataComplete() override; |
| |
| SocketWriter socket_writer_; |
| std::string data_; |
| }; |
| |
| } // namespace socket |
| |
| #endif // PERIDOT_LIB_SOCKET_SOCKET_WRITER_H_ |