1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef NET_QUIC_QUIC_SERVER_PACKET_WRITER_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define NET_QUIC_QUIC_SERVER_PACKET_WRITER_H_
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/basictypes.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/weak_ptr.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/base/ip_endpoint.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/quic/quic_connection.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/quic/quic_packet_writer.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/quic/quic_protocol.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace net {
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass QuicBlockedWriterInterface;
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass UDPServerSocket;
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct WriteResult;
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Chrome specific packet writer which uses a UDPServerSocket for writing
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// data.
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class QuicServerPacketWriter : public QuicPacketWriter {
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef base::Callback<void(WriteResult)> WriteCallback;
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  QuicServerPacketWriter(UDPServerSocket* socket,
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         QuicBlockedWriterInterface* blocked_writer);
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~QuicServerPacketWriter();
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Use this method to write packets rather than WritePacket:
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // QuicServerPacketWriter requires a callback to exist for every write, which
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // will be called once the write completes.
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual WriteResult WritePacketWithCallback(
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const char* buffer,
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      size_t buf_len,
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const IPAddressNumber& self_address,
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const IPEndPoint& peer_address,
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      WriteCallback callback);
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnWriteComplete(int rv);
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // QuicPacketWriter implementation:
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual bool IsWriteBlockedDataBuffered() const OVERRIDE;
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual bool IsWriteBlocked() const OVERRIDE;
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void SetWritable() OVERRIDE;
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Do not call WritePacket on its own -- use WritePacketWithCallback
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual WriteResult WritePacket(const char* buffer,
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  size_t buf_len,
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  const IPAddressNumber& self_address,
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  const IPEndPoint& peer_address) OVERRIDE;
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UDPServerSocket* socket_;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // To be notified after every successful asynchronous write.
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  QuicBlockedWriterInterface* blocked_writer_;
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // To call once the write completes.
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WriteCallback callback_;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Whether a write is currently in flight.
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool write_blocked_;
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<QuicServerPacketWriter> weak_factory_;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicServerPacketWriter);
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace net
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // NET_QUIC_QUIC_SERVER_PACKET_WRITER_H_
74