// 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 "quiche/quic/qbone/qbone_stream.h"

#include "absl/strings/string_view.h"
#include "quiche/quic/core/quic_data_reader.h"
#include "quiche/quic/core/quic_data_writer.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/qbone/qbone_constants.h"
#include "quiche/quic/qbone/qbone_session_base.h"
#include "quiche/common/platform/api/quiche_command_line_flags.h"

DEFINE_QUICHE_COMMAND_LINE_FLAG(int, qbone_stream_ttl_secs, 3,
                                "The QBONE Stream TTL in seconds.");

namespace quic {

QboneWriteOnlyStream::QboneWriteOnlyStream(QuicStreamId id,
                                           QuicSession* session)
    : QuicStream(id, session, /*is_static=*/false, WRITE_UNIDIRECTIONAL) {
  // QBONE uses a LIFO queue to try to always make progress. An individual
  // packet may persist for upto to qbone_stream_ttl_secs seconds in memory.
  MaybeSetTtl(
      QuicTime::Delta::FromSeconds(GetQuicFlag(FLAGS_qbone_stream_ttl_secs)));
}

void QboneWriteOnlyStream::WritePacketToQuicStream(absl::string_view packet) {
  // Streams are one way and ephemeral. This function should only be
  // called once.
  WriteOrBufferData(packet, /* fin= */ true, nullptr);
}

QboneReadOnlyStream::QboneReadOnlyStream(QuicStreamId id,
                                         QboneSessionBase* session)
    : QuicStream(id,
                 session,
                 /*is_static=*/false,
                 READ_UNIDIRECTIONAL),
      session_(session) {
  // QBONE uses a LIFO queue to try to always make progress. An individual
  // packet may persist for upto to qbone_stream_ttl_secs seconds in memory.
  MaybeSetTtl(
      QuicTime::Delta::FromSeconds(GetQuicFlag(FLAGS_qbone_stream_ttl_secs)));
}

void QboneReadOnlyStream::OnDataAvailable() {
  // Read in data and buffer it, attempt to frame to see if there's a packet.
  sequencer()->Read(&buffer_);
  if (sequencer()->IsClosed()) {
    session_->ProcessPacketFromPeer(buffer_);
    OnFinRead();
    return;
  }
  if (buffer_.size() > QboneConstants::kMaxQbonePacketBytes) {
    if (!rst_sent()) {
      Reset(QUIC_BAD_APPLICATION_PAYLOAD);
    }
    StopReading();
  }
}

}  // namespace quic
