| // 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) {} |
| |
| size_t QuicTransportStream::Read(char* buffer, size_t buffer_size) { |
| if (!session_interface_->IsSessionReady()) { |
| return 0; |
| } |
| |
| return adapter_.Read(buffer, buffer_size); |
| } |
| |
| size_t QuicTransportStream::Read(std::string* output) { |
| if (!session_interface_->IsSessionReady()) { |
| return 0; |
| } |
| |
| 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 |