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