// 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
