xref: /aosp_15_r20/external/openscreen/osp/impl/quic/quic_connection.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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