/*
 *  Copyright 2016 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "p2p/quic/reliablequicstream.h"

#include <string>

#include "net/quic/quic_session.h"
#include "rtc_base/checks.h"

namespace cricket {

ReliableQuicStream::ReliableQuicStream(net::QuicStreamId id,
                                       net::QuicSession* session)
    : net::ReliableQuicStream(id, session) {
  RTC_DCHECK_NE(net::kCryptoStreamId, id);
}

ReliableQuicStream::~ReliableQuicStream() {}

void ReliableQuicStream::OnDataAvailable() {
  struct iovec iov;
  while (sequencer()->GetReadableRegions(&iov, 1) == 1) {
    SignalDataReceived(id(), reinterpret_cast<const char*>(iov.iov_base),
                       iov.iov_len);
    sequencer()->MarkConsumed(iov.iov_len);
  }
}

void ReliableQuicStream::OnClose() {
  net::ReliableQuicStream::OnClose();
  SignalClosed(id(), connection_error());
}

rtc::StreamResult ReliableQuicStream::Write(const char* data,
                                            size_t len,
                                            bool fin) {
  // Writes the data, or buffers it.
  WriteOrBufferData(base::StringPiece(data, len), fin, nullptr);
  if (HasBufferedData()) {
    return rtc::StreamResult(rtc::SR_BLOCK);
  }
  return rtc::StreamResult(rtc::SR_SUCCESS);
}

void ReliableQuicStream::Close() {
  net::ReliableQuicStream::session()->CloseStream(id());
}

void ReliableQuicStream::OnCanWrite() {
  uint64_t prev_queued_bytes = queued_data_bytes();
  net::ReliableQuicStream::OnCanWrite();
  uint64_t queued_bytes_written = prev_queued_bytes - queued_data_bytes();
  SignalQueuedBytesWritten(id(), queued_bytes_written);
}

}  // namespace cricket
