1*3f982cf4SFabien Sanglard // Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef OSP_IMPL_QUIC_QUIC_CONNECTION_H_ 6*3f982cf4SFabien Sanglard #define OSP_IMPL_QUIC_QUIC_CONNECTION_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <memory> 9*3f982cf4SFabien Sanglard #include <vector> 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard #include "platform/api/udp_socket.h" 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard namespace openscreen { 14*3f982cf4SFabien Sanglard namespace osp { 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglard class QuicStream { 17*3f982cf4SFabien Sanglard public: 18*3f982cf4SFabien Sanglard class Delegate { 19*3f982cf4SFabien Sanglard public: 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard virtual void OnReceived(QuicStream* stream, 22*3f982cf4SFabien Sanglard const char* data, 23*3f982cf4SFabien Sanglard size_t data_size) = 0; 24*3f982cf4SFabien Sanglard virtual void OnClose(uint64_t stream_id) = 0; 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard protected: 27*3f982cf4SFabien Sanglard virtual ~Delegate() = default; 28*3f982cf4SFabien Sanglard }; 29*3f982cf4SFabien Sanglard QuicStream(Delegate * delegate,uint64_t id)30*3f982cf4SFabien Sanglard QuicStream(Delegate* delegate, uint64_t id) : delegate_(delegate), id_(id) {} 31*3f982cf4SFabien Sanglard virtual ~QuicStream() = default; 32*3f982cf4SFabien Sanglard id()33*3f982cf4SFabien Sanglard uint64_t id() const { return id_; } 34*3f982cf4SFabien Sanglard virtual void Write(const uint8_t* data, size_t data_size) = 0; 35*3f982cf4SFabien Sanglard virtual void CloseWriteEnd() = 0; 36*3f982cf4SFabien Sanglard 37*3f982cf4SFabien Sanglard protected: 38*3f982cf4SFabien Sanglard Delegate* const delegate_; 39*3f982cf4SFabien Sanglard uint64_t id_; 40*3f982cf4SFabien Sanglard }; 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglard class QuicConnection : public UdpSocket::Client { 43*3f982cf4SFabien Sanglard public: 44*3f982cf4SFabien Sanglard class Delegate { 45*3f982cf4SFabien Sanglard public: 46*3f982cf4SFabien Sanglard 47*3f982cf4SFabien Sanglard // Called when the QUIC handshake has successfully completed. 48*3f982cf4SFabien Sanglard virtual void OnCryptoHandshakeComplete(uint64_t connection_id) = 0; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard // Called when a new stream on this connection is initiated by the other 51*3f982cf4SFabien Sanglard // endpoint. |stream| will use a delegate returned by NextStreamDelegate. 52*3f982cf4SFabien Sanglard virtual void OnIncomingStream(uint64_t connection_id, 53*3f982cf4SFabien Sanglard std::unique_ptr<QuicStream> stream) = 0; 54*3f982cf4SFabien Sanglard 55*3f982cf4SFabien Sanglard // Called when the QUIC connection was closed. The QuicConnection should 56*3f982cf4SFabien Sanglard // not be destroyed immediately, because the QUIC implementation will still 57*3f982cf4SFabien Sanglard // reference it briefly. Instead, it should be destroyed during the next 58*3f982cf4SFabien Sanglard // event loop. 59*3f982cf4SFabien Sanglard // TODO(btolsch): Hopefully this can be changed with future QUIC 60*3f982cf4SFabien Sanglard // implementations. 61*3f982cf4SFabien Sanglard virtual void OnConnectionClosed(uint64_t connection_id) = 0; 62*3f982cf4SFabien Sanglard 63*3f982cf4SFabien Sanglard // This is used to get a QuicStream::Delegate for an incoming stream, which 64*3f982cf4SFabien Sanglard // will be returned via OnIncomingStream immediately after this call. 65*3f982cf4SFabien Sanglard virtual QuicStream::Delegate* NextStreamDelegate(uint64_t connection_id, 66*3f982cf4SFabien Sanglard uint64_t stream_id) = 0; 67*3f982cf4SFabien Sanglard 68*3f982cf4SFabien Sanglard protected: 69*3f982cf4SFabien Sanglard virtual ~Delegate() = default; 70*3f982cf4SFabien Sanglard }; 71*3f982cf4SFabien Sanglard QuicConnection(Delegate * delegate)72*3f982cf4SFabien Sanglard explicit QuicConnection(Delegate* delegate) : delegate_(delegate) {} 73*3f982cf4SFabien Sanglard virtual ~QuicConnection() = default; 74*3f982cf4SFabien Sanglard 75*3f982cf4SFabien Sanglard virtual std::unique_ptr<QuicStream> MakeOutgoingStream( 76*3f982cf4SFabien Sanglard QuicStream::Delegate* delegate) = 0; 77*3f982cf4SFabien Sanglard virtual void Close() = 0; 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglard protected: 80*3f982cf4SFabien Sanglard Delegate* const delegate_; 81*3f982cf4SFabien Sanglard }; 82*3f982cf4SFabien Sanglard 83*3f982cf4SFabien Sanglard } // namespace osp 84*3f982cf4SFabien Sanglard } // namespace openscreen 85*3f982cf4SFabien Sanglard 86*3f982cf4SFabien Sanglard #endif // OSP_IMPL_QUIC_QUIC_CONNECTION_H_ 87