|  | #ifndef QUICHE_HTTP2_ADAPTER_DATA_SOURCE_H_ | 
|  | #define QUICHE_HTTP2_ADAPTER_DATA_SOURCE_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <utility> | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  |  | 
|  | namespace http2 { | 
|  | namespace adapter { | 
|  |  | 
|  | // Represents a source of DATA frames for transmission to the peer. | 
|  | class DataFrameSource { | 
|  | public: | 
|  | virtual ~DataFrameSource() {} | 
|  |  | 
|  | static constexpr ssize_t kBlocked = 0; | 
|  | static constexpr ssize_t kError = -1; | 
|  |  | 
|  | // Returns the number of bytes to send in the next DATA frame, and whether | 
|  | // this frame indicates the end of the data. Returns {kBlocked, false} if | 
|  | // blocked, {kError, false} on error. | 
|  | virtual std::pair<ssize_t, bool> SelectPayloadLength(size_t max_length) = 0; | 
|  |  | 
|  | // This method is called with a frame header and a payload length to send. The | 
|  | // source should send or buffer the entire frame and return true, or return | 
|  | // false without sending or buffering anything. | 
|  | virtual bool Send(absl::string_view frame_header, size_t payload_length) = 0; | 
|  |  | 
|  | // If true, the end of this data source indicates the end of the stream. | 
|  | // Otherwise, this data will be followed by trailers. | 
|  | virtual bool send_fin() const = 0; | 
|  | }; | 
|  |  | 
|  | // Represents a HTTP message body. | 
|  | class DataSource { | 
|  | public: | 
|  | virtual ~DataSource() {} | 
|  |  | 
|  | enum State { | 
|  | // The source is not done, but cannot currently provide more data. | 
|  | NOT_READY, | 
|  | // The source can provide more data. | 
|  | READY, | 
|  | // The source is done. | 
|  | DONE, | 
|  | }; | 
|  |  | 
|  | State state() const { return state_; } | 
|  |  | 
|  | // The next range of data provided by this data source. | 
|  | virtual absl::string_view NextData() const = 0; | 
|  |  | 
|  | // Indicates that |bytes| bytes have been consumed by the caller. | 
|  | virtual void Consume(size_t bytes) = 0; | 
|  |  | 
|  | protected: | 
|  | State state_ = NOT_READY; | 
|  | }; | 
|  |  | 
|  | // A simple implementation constructible from a string_view or std::string. | 
|  | class StringDataSource : public DataSource { | 
|  | public: | 
|  | explicit StringDataSource(std::string data); | 
|  |  | 
|  | absl::string_view NextData() const override; | 
|  | void Consume(size_t bytes) override; | 
|  |  | 
|  | private: | 
|  | const std::string data_; | 
|  | absl::string_view remaining_; | 
|  | }; | 
|  |  | 
|  | }  // namespace adapter | 
|  | }  // namespace http2 | 
|  |  | 
|  | #endif  // QUICHE_HTTP2_ADAPTER_DATA_SOURCE_H_ |