| // Copyright 2013 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef QUICHE_QUIC_CORE_HTTP_QUIC_HEADERS_STREAM_H_ | 
 | #define QUICHE_QUIC_CORE_HTTP_QUIC_HEADERS_STREAM_H_ | 
 |  | 
 | #include <cstddef> | 
 | #include <memory> | 
 |  | 
 | #include "net/third_party/quiche/src/quic/core/http/quic_header_list.h" | 
 | #include "net/third_party/quiche/src/quic/core/quic_packets.h" | 
 | #include "net/third_party/quiche/src/quic/core/quic_stream.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_containers.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" | 
 | #include "net/third_party/quiche/src/spdy/core/spdy_framer.h" | 
 |  | 
 | namespace quic { | 
 |  | 
 | class QuicSpdySession; | 
 |  | 
 | namespace test { | 
 | class QuicHeadersStreamPeer; | 
 | }  // namespace test | 
 |  | 
 | // Headers in QUIC are sent as HTTP/2 HEADERS or PUSH_PROMISE frames over a | 
 | // reserved stream with the id 3.  Each endpoint (client and server) will | 
 | // allocate an instance of QuicHeadersStream to send and receive headers. | 
 | class QUIC_EXPORT_PRIVATE QuicHeadersStream : public QuicStream { | 
 |  public: | 
 |   explicit QuicHeadersStream(QuicSpdySession* session); | 
 |   QuicHeadersStream(const QuicHeadersStream&) = delete; | 
 |   QuicHeadersStream& operator=(const QuicHeadersStream&) = delete; | 
 |   ~QuicHeadersStream() override; | 
 |  | 
 |   // QuicStream implementation | 
 |   void OnDataAvailable() override; | 
 |  | 
 |   // Release underlying buffer if allowed. | 
 |   void MaybeReleaseSequencerBuffer(); | 
 |  | 
 |   bool OnStreamFrameAcked(QuicStreamOffset offset, | 
 |                           QuicByteCount data_length, | 
 |                           bool fin_acked, | 
 |                           QuicTime::Delta ack_delay_time, | 
 |                           QuicByteCount* newly_acked_length) override; | 
 |  | 
 |   void OnStreamFrameRetransmitted(QuicStreamOffset offset, | 
 |                                   QuicByteCount data_length, | 
 |                                   bool fin_retransmitted) override; | 
 |  | 
 |  private: | 
 |   friend class test::QuicHeadersStreamPeer; | 
 |  | 
 |   // CompressedHeaderInfo includes simple information of a header, including | 
 |   // offset in headers stream, unacked length and ack listener of this header. | 
 |   struct QUIC_EXPORT_PRIVATE CompressedHeaderInfo { | 
 |     CompressedHeaderInfo( | 
 |         QuicStreamOffset headers_stream_offset, | 
 |         QuicStreamOffset full_length, | 
 |         QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener); | 
 |     CompressedHeaderInfo(const CompressedHeaderInfo& other); | 
 |     ~CompressedHeaderInfo(); | 
 |  | 
 |     // Offset the header was sent on the headers stream. | 
 |     QuicStreamOffset headers_stream_offset; | 
 |     // The full length of the header. | 
 |     QuicByteCount full_length; | 
 |     // The remaining bytes to be acked. | 
 |     QuicByteCount unacked_length; | 
 |     // Ack listener of this header, and it is notified once any of the bytes has | 
 |     // been acked or retransmitted. | 
 |     QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener; | 
 |   }; | 
 |  | 
 |   // Returns true if the session is still connected. | 
 |   bool IsConnected(); | 
 |  | 
 |   // Override to store mapping from offset, length to ack_listener. This | 
 |   // ack_listener is notified once data within [offset, offset + length] is | 
 |   // acked or retransmitted. | 
 |   void OnDataBuffered( | 
 |       QuicStreamOffset offset, | 
 |       QuicByteCount data_length, | 
 |       const QuicReferenceCountedPointer<QuicAckListenerInterface>& ack_listener) | 
 |       override; | 
 |  | 
 |   QuicSpdySession* spdy_session_; | 
 |  | 
 |   // Headers that have not been fully acked. | 
 |   QuicDeque<CompressedHeaderInfo> unacked_headers_; | 
 | }; | 
 |  | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_CORE_HTTP_QUIC_HEADERS_STREAM_H_ |