blob: 23c2df2455c4824340ef2aef5aa536a82542fe7e [file] [log] [blame]
/*
* 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 "webrtc/p2p/quic/reliablequicstream.h"
#include <string>
#include "net/quic/quic_session.h"
#include "webrtc/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