blob: 7dca1d00cbebb7f27f7f716fb63c1044ee3fff02 [file] [log] [blame]
// Copyright 2023 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_WEB_TRANSPORT_COMPLETE_BUFFER_VISITOR_H_
#define QUICHE_WEB_TRANSPORT_COMPLETE_BUFFER_VISITOR_H_
#include <optional>
#include <utility>
#include "quiche/common/quiche_callbacks.h"
#include "quiche/web_transport/web_transport.h"
namespace webtransport {
// A visitor that will buffer the entirety of the incoming stream into a string,
// and will send a pre-specified string all at once.
class QUICHE_EXPORT CompleteBufferVisitor : public StreamVisitor {
public:
using AllDataReadCallback = quiche::SingleUseCallback<void(std::string)>;
CompleteBufferVisitor(webtransport::Stream* stream, std::string outgoing_data)
: stream_(stream),
outgoing_data_(std::in_place, std::move(outgoing_data)) {}
CompleteBufferVisitor(webtransport::Stream* stream,
AllDataReadCallback incoming_data_callback)
: stream_(stream),
incoming_data_callback_(std::in_place,
std::move(incoming_data_callback)) {}
CompleteBufferVisitor(webtransport::Stream* stream, std::string outgoing_data,
AllDataReadCallback incoming_data_callback)
: stream_(stream),
outgoing_data_(std::in_place, std::move(outgoing_data)),
incoming_data_callback_(std::in_place,
std::move(incoming_data_callback)) {}
void OnCanRead() override;
void OnCanWrite() override;
void OnResetStreamReceived(StreamErrorCode) override {}
void OnStopSendingReceived(StreamErrorCode) override {}
void OnWriteSideInDataRecvdState() override {}
protected:
void SetOutgoingData(std::string data);
private:
webtransport::Stream* stream_;
std::optional<std::string> outgoing_data_;
std::optional<AllDataReadCallback> incoming_data_callback_;
std::string incoming_data_buffer_;
};
} // namespace webtransport
#endif // QUICHE_WEB_TRANSPORT_COMPLETE_BUFFER_VISITOR_H_