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_QUIC_QUIC_SERVER_PACKET_WRITER_H_
6#define NET_QUIC_QUIC_SERVER_PACKET_WRITER_H_
7
8#include "base/basictypes.h"
9#include "base/memory/weak_ptr.h"
10#include "net/base/ip_endpoint.h"
11#include "net/quic/quic_connection.h"
12#include "net/quic/quic_packet_writer.h"
13#include "net/quic/quic_protocol.h"
14
15namespace net {
16
17class QuicBlockedWriterInterface;
18class UDPServerSocket;
19struct WriteResult;
20
21// Chrome specific packet writer which uses a UDPServerSocket for writing
22// data.
23class QuicServerPacketWriter : public QuicPacketWriter {
24 public:
25  typedef base::Callback<void(WriteResult)> WriteCallback;
26
27  QuicServerPacketWriter(UDPServerSocket* socket,
28                         QuicBlockedWriterInterface* blocked_writer);
29  virtual ~QuicServerPacketWriter();
30
31  // Use this method to write packets rather than WritePacket:
32  // QuicServerPacketWriter requires a callback to exist for every write, which
33  // will be called once the write completes.
34  virtual WriteResult WritePacketWithCallback(
35      const char* buffer,
36      size_t buf_len,
37      const IPAddressNumber& self_address,
38      const IPEndPoint& peer_address,
39      WriteCallback callback);
40
41  void OnWriteComplete(int rv);
42
43  // QuicPacketWriter implementation:
44  virtual bool IsWriteBlockedDataBuffered() const OVERRIDE;
45  virtual bool IsWriteBlocked() const OVERRIDE;
46  virtual void SetWritable() OVERRIDE;
47
48 protected:
49  // Do not call WritePacket on its own -- use WritePacketWithCallback
50  virtual WriteResult WritePacket(const char* buffer,
51                                  size_t buf_len,
52                                  const IPAddressNumber& self_address,
53                                  const IPEndPoint& peer_address) OVERRIDE;
54 private:
55  UDPServerSocket* socket_;
56
57  // To be notified after every successful asynchronous write.
58  QuicBlockedWriterInterface* blocked_writer_;
59
60  // To call once the write completes.
61  WriteCallback callback_;
62
63  // Whether a write is currently in flight.
64  bool write_blocked_;
65
66  base::WeakPtrFactory<QuicServerPacketWriter> weak_factory_;
67
68  DISALLOW_COPY_AND_ASSIGN(QuicServerPacketWriter);
69};
70
71}  // namespace net
72
73#endif  // NET_QUIC_QUIC_SERVER_PACKET_WRITER_H_
74