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 NET_TOOLS_QUIC_QUIC_PACKET_WRITER_WRAPPER_H_
6#define NET_TOOLS_QUIC_QUIC_PACKET_WRITER_WRAPPER_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "net/quic/quic_packet_writer.h"
10
11namespace net {
12
13namespace tools {
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 in internal server; mix in mocks in unit tests.
18class QuicPacketWriterWrapper : public net::QuicPacketWriter {
19 public:
20  QuicPacketWriterWrapper();
21  explicit QuicPacketWriterWrapper(QuicPacketWriter* writer);
22  virtual ~QuicPacketWriterWrapper();
23
24  // Default implementation of the QuicPacketWriter interface. Passes everything
25  // to |writer_|.
26  virtual WriteResult WritePacket(
27      const char* buffer,
28      size_t buf_len,
29      const IPAddressNumber& self_address,
30      const IPEndPoint& peer_address) OVERRIDE;
31  virtual bool IsWriteBlockedDataBuffered() const OVERRIDE;
32  virtual bool IsWriteBlocked() const OVERRIDE;
33  virtual void SetWritable() OVERRIDE;
34
35  // Takes ownership of |writer|.
36  void set_writer(QuicPacketWriter* writer);
37
38  // Releases ownership of |writer_|.
39  QuicPacketWriter* release_writer();
40
41 private:
42  scoped_ptr<QuicPacketWriter> writer_;
43
44  DISALLOW_COPY_AND_ASSIGN(QuicPacketWriterWrapper);
45};
46
47}  // namespace tools
48}  // namespace net
49
50#endif  // NET_TOOLS_QUIC_QUIC_PACKET_WRITER_WRAPPER_H_
51