blob: f529016f66a42b5230289c2d55d03517446e02b9 [file] [log] [blame]
// Copyright (c) 2015 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 NET_QUIC_QUIC_FRAME_LIST_H_
#define NET_QUIC_QUIC_FRAME_LIST_H_
#include <stddef.h>
#include <list>
#include <string>
#include "base/strings/string_piece.h"
#include "net/quic/quic_protocol.h"
#include "net/quic/quic_stream_sequencer_buffer_interface.h"
namespace net {
namespace test {
class QuicStreamSequencerPeer;
}
class NET_EXPORT_PRIVATE QuicFrameList
: public QuicStreamSequencerBufferInterface {
public:
// A contiguous segment received by a QUIC stream.
struct FrameData {
FrameData(QuicStreamOffset offset,
std::string segment,
const QuicTime timestamp);
const QuicStreamOffset offset;
std::string segment;
const QuicTime timestamp;
};
QuicFrameList();
~QuicFrameList() override;
// QuicStreamSequencerBufferInterface implementation
void Clear() override;
bool Empty() const override;
QuicErrorCode OnStreamData(QuicStreamOffset offset,
base::StringPiece data,
QuicTime timestamp,
size_t* bytes_buffered) override;
size_t Readv(const struct iovec* iov, size_t iov_len) override;
int GetReadableRegions(struct iovec* iov, int iov_len) const override;
bool GetReadableRegion(iovec* iov, QuicTime* timestamp) const override;
bool MarkConsumed(size_t bytes_used) override;
size_t FlushBufferedFrames() override;
bool HasBytesToRead() const override;
QuicStreamOffset BytesConsumed() const override;
size_t BytesBuffered() const override;
private:
friend class test::QuicStreamSequencerPeer;
std::list<FrameData>::iterator FindInsertionPoint(QuicStreamOffset offset,
size_t len);
bool FrameOverlapsBufferedData(
QuicStreamOffset offset,
size_t data_len,
std::list<FrameData>::const_iterator insertion_point) const;
bool IsDuplicate(QuicStreamOffset offset,
size_t data_len,
std::list<FrameData>::const_iterator insertion_point) const;
std::list<FrameData> frame_list_;
// Number of bytes in buffer.
size_t num_bytes_buffered_ = 0;
QuicStreamOffset total_bytes_read_ = 0;
};
} // namespace net
#endif // NET_QUIC_QUIC_FRAME_LIST_H_