// Copyright 2021 The Chromium 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 QUICHE_QUIC_CORE_WEB_TRANSPORT_STREAM_ADAPTER_H_ #define QUICHE_QUIC_CORE_WEB_TRANSPORT_STREAM_ADAPTER_H_ #include "quic/core/quic_session.h" #include "quic/core/quic_stream.h" #include "quic/core/quic_stream_sequencer.h" #include "quic/core/web_transport_interface.h" namespace quic { // Converts WebTransportStream API calls into QuicStream API calls. The users // of this class can either subclass it, or wrap around it. class QUIC_EXPORT_PRIVATE WebTransportStreamAdapter : public WebTransportStream { public: WebTransportStreamAdapter(QuicSession* session, QuicStream* stream, QuicStreamSequencer* sequencer); // WebTransportStream implementation. ABSL_MUST_USE_RESULT ReadResult Read(char* buffer, size_t buffer_size) override; ABSL_MUST_USE_RESULT ReadResult Read(std::string* output) override; ABSL_MUST_USE_RESULT bool Write(absl::string_view data) override; ABSL_MUST_USE_RESULT bool SendFin() override; bool CanWrite() const override; size_t ReadableBytes() const override; void SetVisitor(std::unique_ptr visitor) override { visitor_ = std::move(visitor); } QuicStreamId GetStreamId() const override { return stream_->id(); } void ResetWithUserCode(QuicRstStreamErrorCode error) override { stream_->Reset(error); } void ResetDueToInternalError() override { stream_->Reset(QUIC_STREAM_INTERNAL_ERROR); } void MaybeResetDueToStreamObjectGone() override { if (stream_->write_side_closed() && stream_->read_side_closed()) { return; } stream_->Reset(QUIC_STREAM_CANCELLED); } WebTransportStreamVisitor* visitor() override { return visitor_.get(); } // Calls that need to be passed from the corresponding QuicStream methods. void OnDataAvailable(); void OnCanWriteNewData(); private: QuicSession* session_; // Unowned. QuicStream* stream_; // Unowned. QuicStreamSequencer* sequencer_; // Unowned. std::unique_ptr visitor_; bool fin_read_ = false; }; } // namespace quic #endif // QUICHE_QUIC_CORE_WEB_TRANSPORT_STREAM_ADAPTER_H_