xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/quic_packet_writer_wrapper.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2014 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 QUICHE_QUIC_CORE_QUIC_PACKET_WRITER_WRAPPER_H_
6 #define QUICHE_QUIC_CORE_QUIC_PACKET_WRITER_WRAPPER_H_
7 
8 #include <cstddef>
9 #include <memory>
10 
11 #include "quiche/quic/core/quic_packet_writer.h"
12 
13 namespace quic {
14 
15 // Wraps a writer object to allow dynamically extending functionality. Use
16 // cases: replace writer while dispatcher and connections hold on to the
17 // wrapper; mix in monitoring; mix in mocks in unit tests.
18 class QUICHE_EXPORT QuicPacketWriterWrapper : public QuicPacketWriter {
19  public:
20   QuicPacketWriterWrapper();
21   QuicPacketWriterWrapper(const QuicPacketWriterWrapper&) = delete;
22   QuicPacketWriterWrapper& operator=(const QuicPacketWriterWrapper&) = delete;
23   ~QuicPacketWriterWrapper() override;
24 
25   // Default implementation of the QuicPacketWriter interface. Passes everything
26   // to |writer_|.
27   WriteResult WritePacket(const char* buffer, size_t buf_len,
28                           const QuicIpAddress& self_address,
29                           const QuicSocketAddress& peer_address,
30                           PerPacketOptions* options,
31                           const QuicPacketWriterParams& params) override;
32   bool IsWriteBlocked() const override;
33   void SetWritable() override;
34   std::optional<int> MessageTooBigErrorCode() const override;
35   QuicByteCount GetMaxPacketSize(
36       const QuicSocketAddress& peer_address) const override;
37   bool SupportsReleaseTime() const override;
38   bool IsBatchMode() const override;
SupportsEcn()39   bool SupportsEcn() const override { return writer_->SupportsEcn(); }
40   QuicPacketBuffer GetNextWriteLocation(
41       const QuicIpAddress& self_address,
42       const QuicSocketAddress& peer_address) override;
43   WriteResult Flush() override;
44 
45   // Takes ownership of |writer|.
46   void set_writer(QuicPacketWriter* writer);
47 
48   // Does not take ownership of |writer|.
49   void set_non_owning_writer(QuicPacketWriter* writer);
50 
set_peer_address(const QuicSocketAddress &)51   virtual void set_peer_address(const QuicSocketAddress& /*peer_address*/) {}
52 
writer()53   QuicPacketWriter* writer() { return writer_; }
54 
55  private:
56   void unset_writer();
57 
58   QuicPacketWriter* writer_ = nullptr;
59   bool owns_writer_ = false;
60 };
61 
62 }  // namespace quic
63 
64 #endif  // QUICHE_QUIC_CORE_QUIC_PACKET_WRITER_WRAPPER_H_
65