blob: 5d574afe3c460cfc845650e6948c95be9c3502a3 [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.
#ifndef QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_STREAM_H_
#define QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_STREAM_H_
#include <cstddef>
#include <memory>
#include "absl/base/attributes.h"
#include "absl/strings/string_view.h"
#include "quic/core/http/web_transport_stream_adapter.h"
#include "quic/core/quic_session.h"
#include "quic/core/quic_stream.h"
#include "quic/core/quic_types.h"
#include "quic/core/web_transport_interface.h"
#include "quic/quic_transport/quic_transport_session_interface.h"
namespace quic {
// QuicTransportStream is an extension of QuicStream that provides I/O interface
// that is safe to use in the QuicTransport context. The interface ensures no
// application data is processed before the client indication is processed.
class QUIC_EXPORT_PRIVATE QuicTransportStream : public QuicStream,
public WebTransportStream {
public:
QuicTransportStream(QuicStreamId id,
QuicSession* session,
QuicTransportSessionInterface* session_interface);
// Reads at most |buffer_size| bytes into |buffer| and returns the number of
// bytes actually read.
ReadResult Read(char* buffer, size_t buffer_size) override;
// Reads all available data and appends it to the end of |output|.
ReadResult Read(std::string* output) override;
// Writes |data| into the stream. Returns true on success.
ABSL_MUST_USE_RESULT bool Write(absl::string_view data) override;
// Sends the FIN on the stream. Returns true on success.
ABSL_MUST_USE_RESULT bool SendFin() override;
// Indicates whether it is possible to write into stream right now.
bool CanWrite() const override;
// Indicates the number of bytes that can be read from the stream.
size_t ReadableBytes() const override;
// QuicSession method implementations.
void OnDataAvailable() override;
void OnCanWriteNewData() override;
QuicStreamId GetStreamId() const override { return id(); }
void ResetWithUserCode(WebTransportStreamError /*error*/) override {
adapter_.ResetWithUserCode(0);
}
void ResetDueToInternalError() override {
adapter_.ResetDueToInternalError();
}
void SendStopSending(WebTransportStreamError /*error*/) override {
adapter_.SendStopSending(0);
}
void MaybeResetDueToStreamObjectGone() override {
adapter_.MaybeResetDueToStreamObjectGone();
}
WebTransportStreamVisitor* visitor() override { return adapter_.visitor(); }
void SetVisitor(std::unique_ptr<WebTransportStreamVisitor> visitor) override {
adapter_.SetVisitor(std::move(visitor));
}
protected:
// Hide the methods that allow writing data without checking IsSessionReady().
using QuicStream::WriteMemSlices;
using QuicStream::WriteOrBufferData;
void MaybeNotifyFinRead();
WebTransportStreamAdapter adapter_;
QuicTransportSessionInterface* session_interface_;
};
} // namespace quic
#endif // QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_STREAM_H_