| // 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. | 
 |  | 
 | #include "quic/quic_transport/quic_transport_stream.h" | 
 |  | 
 | #include <sys/types.h> | 
 |  | 
 | #include "absl/strings/string_view.h" | 
 | #include "quic/core/quic_buffer_allocator.h" | 
 | #include "quic/core/quic_error_codes.h" | 
 | #include "quic/core/quic_types.h" | 
 | #include "quic/core/quic_utils.h" | 
 |  | 
 | namespace quic { | 
 |  | 
 | QuicTransportStream::QuicTransportStream( | 
 |     QuicStreamId id, | 
 |     QuicSession* session, | 
 |     QuicTransportSessionInterface* session_interface) | 
 |     : QuicStream(id, | 
 |                  session, | 
 |                  /*is_static=*/false, | 
 |                  QuicUtils::GetStreamType(id, | 
 |                                           session->connection()->perspective(), | 
 |                                           session->IsIncomingStream(id), | 
 |                                           session->version())), | 
 |       adapter_(session, this, sequencer()), | 
 |       session_interface_(session_interface) {} | 
 |  | 
 | WebTransportStream::ReadResult QuicTransportStream::Read(char* buffer, | 
 |                                                          size_t buffer_size) { | 
 |   if (!session_interface_->IsSessionReady()) { | 
 |     return ReadResult{0, false}; | 
 |   } | 
 |  | 
 |   return adapter_.Read(buffer, buffer_size); | 
 | } | 
 |  | 
 | WebTransportStream::ReadResult QuicTransportStream::Read(std::string* output) { | 
 |   if (!session_interface_->IsSessionReady()) { | 
 |     return ReadResult{0, false}; | 
 |   } | 
 |  | 
 |   return adapter_.Read(output); | 
 | } | 
 |  | 
 | bool QuicTransportStream::Write(absl::string_view data) { | 
 |   if (!CanWrite()) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   return adapter_.Write(data); | 
 | } | 
 |  | 
 | bool QuicTransportStream::SendFin() { | 
 |   if (!CanWrite()) { | 
 |     return false; | 
 |   } | 
 |  | 
 |   return adapter_.SendFin(); | 
 | } | 
 |  | 
 | bool QuicTransportStream::CanWrite() const { | 
 |   return session_interface_->IsSessionReady() && adapter_.CanWrite(); | 
 | } | 
 |  | 
 | size_t QuicTransportStream::ReadableBytes() const { | 
 |   if (!session_interface_->IsSessionReady()) { | 
 |     return 0; | 
 |   } | 
 |  | 
 |   return adapter_.ReadableBytes(); | 
 | } | 
 |  | 
 | void QuicTransportStream::OnDataAvailable() { | 
 |   adapter_.OnDataAvailable(); | 
 | } | 
 |  | 
 | void QuicTransportStream::OnCanWriteNewData() { | 
 |   // Ensure the origin check has been completed, as the stream can be notified | 
 |   // about being writable before that. | 
 |   if (!CanWrite()) { | 
 |     return; | 
 |   } | 
 |   adapter_.OnCanWriteNewData(); | 
 | } | 
 |  | 
 | }  // namespace quic |