1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef OSP_IMPL_QUIC_QUIC_CONNECTION_IMPL_H_
6 #define OSP_IMPL_QUIC_QUIC_CONNECTION_IMPL_H_
7 
8 #include <list>
9 #include <memory>
10 
11 #include "osp/impl/quic/quic_connection.h"
12 #include "platform/api/udp_socket.h"
13 #include "platform/base/ip_address.h"
14 #include "third_party/chromium_quic/src/base/callback.h"
15 #include "third_party/chromium_quic/src/base/location.h"
16 #include "third_party/chromium_quic/src/base/task_runner.h"
17 #include "third_party/chromium_quic/src/base/time/time.h"
18 #include "third_party/chromium_quic/src/net/third_party/quic/quartc/quartc_packet_writer.h"
19 #include "third_party/chromium_quic/src/net/third_party/quic/quartc/quartc_session.h"
20 #include "third_party/chromium_quic/src/net/third_party/quic/quartc/quartc_stream.h"
21 
22 namespace openscreen {
23 namespace osp {
24 
25 class QuicConnectionFactoryImpl;
26 
27 class UdpTransport final : public ::quic::QuartcPacketTransport {
28  public:
29   UdpTransport(UdpSocket* socket, const IPEndpoint& destination);
30   UdpTransport(UdpTransport&&) noexcept;
31   ~UdpTransport() override;
32 
33   UdpTransport& operator=(UdpTransport&&) noexcept;
34 
35   // ::quic::QuartcPacketTransport overrides.
36   int Write(const char* buffer,
37             size_t buffer_length,
38             const PacketInfo& info) override;
39 
socket()40   UdpSocket* socket() const { return socket_; }
41 
42  private:
43   UdpSocket* socket_;
44   IPEndpoint destination_;
45 };
46 
47 class QuicStreamImpl final : public QuicStream,
48                              public ::quic::QuartcStream::Delegate {
49  public:
50   QuicStreamImpl(QuicStream::Delegate* delegate, ::quic::QuartcStream* stream);
51   ~QuicStreamImpl() override;
52 
53   // QuicStream overrides.
54   void Write(const uint8_t* data, size_t size) override;
55   void CloseWriteEnd() override;
56 
57   // ::quic::QuartcStream::Delegate overrides.
58   void OnReceived(::quic::QuartcStream* stream,
59                   const char* data,
60                   size_t data_size) override;
61   void OnClose(::quic::QuartcStream* stream) override;
62   void OnBufferChanged(::quic::QuartcStream* stream) override;
63 
64  private:
65   ::quic::QuartcStream* const stream_;
66 };
67 
68 class QuicConnectionImpl final : public QuicConnection,
69                                  public ::quic::QuartcSession::Delegate {
70  public:
71   QuicConnectionImpl(QuicConnectionFactoryImpl* parent_factory,
72                      QuicConnection::Delegate* delegate,
73                      std::unique_ptr<UdpTransport> udp_transport,
74                      std::unique_ptr<::quic::QuartcSession> session);
75 
76   ~QuicConnectionImpl() override;
77 
78   // UdpSocket::Client overrides.
79   void OnRead(UdpSocket* socket, ErrorOr<UdpPacket> data) override;
80   void OnError(UdpSocket* socket, Error error) override;
81   void OnSendError(UdpSocket* socket, Error error) override;
82 
83   // QuicConnection overrides.
84   std::unique_ptr<QuicStream> MakeOutgoingStream(
85       QuicStream::Delegate* delegate) override;
86   void Close() override;
87 
88   // ::quic::QuartcSession::Delegate overrides.
89   void OnCryptoHandshakeComplete() override;
90   void OnIncomingStream(::quic::QuartcStream* stream) override;
91   void OnConnectionClosed(::quic::QuicErrorCode error_code,
92                           const ::quic::QuicString& error_details,
93                           ::quic::ConnectionCloseSource source) override;
94 
95  private:
96   QuicConnectionFactoryImpl* const parent_factory_;
97   const std::unique_ptr<::quic::QuartcSession> session_;
98   const std::unique_ptr<UdpTransport> udp_transport_;
99   std::vector<QuicStream*> streams_;
100 };
101 
102 }  // namespace osp
103 }  // namespace openscreen
104 
105 #endif  // OSP_IMPL_QUIC_QUIC_CONNECTION_IMPL_H_
106