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