// Copyright 2018 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 OSP_IMPL_QUIC_QUIC_CONNECTION_H_ #define OSP_IMPL_QUIC_QUIC_CONNECTION_H_ #include #include #include "platform/api/udp_socket.h" namespace openscreen { namespace osp { class QuicStream { public: class Delegate { public: virtual ~Delegate() = default; virtual void OnReceived(QuicStream* stream, const char* data, size_t data_size) = 0; virtual void OnClose(uint64_t stream_id) = 0; }; QuicStream(Delegate* delegate, uint64_t id) : delegate_(delegate), id_(id) {} virtual ~QuicStream() = default; uint64_t id() const { return id_; } virtual void Write(const uint8_t* data, size_t data_size) = 0; virtual void CloseWriteEnd() = 0; protected: Delegate* const delegate_; uint64_t id_; }; class QuicConnection : public UdpSocket::Client { public: class Delegate { public: virtual ~Delegate() = default; // Called when the QUIC handshake has successfully completed. virtual void OnCryptoHandshakeComplete(uint64_t connection_id) = 0; // Called when a new stream on this connection is initiated by the other // endpoint. |stream| will use a delegate returned by NextStreamDelegate. virtual void OnIncomingStream(uint64_t connection_id, std::unique_ptr stream) = 0; // Called when the QUIC connection was closed. The QuicConnection should // not be destroyed immediately, because the QUIC implementation will still // reference it briefly. Instead, it should be destroyed during the next // event loop. // TODO(btolsch): Hopefully this can be changed with future QUIC // implementations. virtual void OnConnectionClosed(uint64_t connection_id) = 0; // This is used to get a QuicStream::Delegate for an incoming stream, which // will be returned via OnIncomingStream immediately after this call. virtual QuicStream::Delegate* NextStreamDelegate(uint64_t connection_id, uint64_t stream_id) = 0; }; explicit QuicConnection(Delegate* delegate) : delegate_(delegate) {} virtual ~QuicConnection() = default; virtual std::unique_ptr MakeOutgoingStream( QuicStream::Delegate* delegate) = 0; virtual void Close() = 0; protected: Delegate* const delegate_; }; } // namespace osp } // namespace openscreen #endif // OSP_IMPL_QUIC_QUIC_CONNECTION_H_