blob: 738a53513d67cb77a0a2f6837d3870711fac9ce2 [file] [log] [blame]
// 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