Home | History | Annotate | Download | only in quic
      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 
     15 namespace net {
     16 
     17 class QuicBlockedWriterInterface;
     18 class UDPServerSocket;
     19 struct WriteResult;
     20 
     21 // Chrome specific packet writer which uses a UDPServerSocket for writing
     22 // data.
     23 class 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