| // Copyright (c) 2019 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_QUIC_TRANSPORT_QUIC_TRANSPORT_STREAM_H_ | 
 | #define QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_STREAM_H_ | 
 |  | 
 | #include <cstddef> | 
 | #include <memory> | 
 |  | 
 | #include "absl/base/attributes.h" | 
 | #include "absl/strings/string_view.h" | 
 | #include "quic/core/http/web_transport_stream_adapter.h" | 
 | #include "quic/core/quic_session.h" | 
 | #include "quic/core/quic_stream.h" | 
 | #include "quic/core/quic_types.h" | 
 | #include "quic/core/web_transport_interface.h" | 
 | #include "quic/quic_transport/quic_transport_session_interface.h" | 
 |  | 
 | namespace quic { | 
 |  | 
 | // QuicTransportStream is an extension of QuicStream that provides I/O interface | 
 | // that is safe to use in the QuicTransport context.  The interface ensures no | 
 | // application data is processed before the client indication is processed. | 
 | class QUIC_EXPORT_PRIVATE QuicTransportStream : public QuicStream, | 
 |                                                 public WebTransportStream { | 
 |  public: | 
 |   QuicTransportStream(QuicStreamId id, | 
 |                       QuicSession* session, | 
 |                       QuicTransportSessionInterface* session_interface); | 
 |  | 
 |   // Reads at most |buffer_size| bytes into |buffer| and returns the number of | 
 |   // bytes actually read. | 
 |   ReadResult Read(char* buffer, size_t buffer_size) override; | 
 |   // Reads all available data and appends it to the end of |output|. | 
 |   ReadResult Read(std::string* output) override; | 
 |   // Writes |data| into the stream.  Returns true on success. | 
 |   ABSL_MUST_USE_RESULT bool Write(absl::string_view data) override; | 
 |   // Sends the FIN on the stream.  Returns true on success. | 
 |   ABSL_MUST_USE_RESULT bool SendFin() override; | 
 |  | 
 |   // Indicates whether it is possible to write into stream right now. | 
 |   bool CanWrite() const override; | 
 |   // Indicates the number of bytes that can be read from the stream. | 
 |   size_t ReadableBytes() const override; | 
 |  | 
 |   // QuicSession method implementations. | 
 |   void OnDataAvailable() override; | 
 |   void OnCanWriteNewData() override; | 
 |  | 
 |   QuicStreamId GetStreamId() const override { return id(); } | 
 |  | 
 |   void ResetWithUserCode(WebTransportStreamError /*error*/) override { | 
 |     adapter_.ResetWithUserCode(0); | 
 |   } | 
 |   void ResetDueToInternalError() override { | 
 |     adapter_.ResetDueToInternalError(); | 
 |   } | 
 |   void SendStopSending(WebTransportStreamError /*error*/) override { | 
 |     adapter_.SendStopSending(0); | 
 |   } | 
 |   void MaybeResetDueToStreamObjectGone() override { | 
 |     adapter_.MaybeResetDueToStreamObjectGone(); | 
 |   } | 
 |  | 
 |   WebTransportStreamVisitor* visitor() override { return adapter_.visitor(); } | 
 |   void SetVisitor(std::unique_ptr<WebTransportStreamVisitor> visitor) override { | 
 |     adapter_.SetVisitor(std::move(visitor)); | 
 |   } | 
 |  | 
 |  protected: | 
 |   // Hide the methods that allow writing data without checking IsSessionReady(). | 
 |   using QuicStream::WriteMemSlices; | 
 |   using QuicStream::WriteOrBufferData; | 
 |  | 
 |   void MaybeNotifyFinRead(); | 
 |  | 
 |   WebTransportStreamAdapter adapter_; | 
 |   QuicTransportSessionInterface* session_interface_; | 
 | }; | 
 |  | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_STREAM_H_ |