// Copyright (c) 2012 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_TEST_TOOLS_SIMPLE_QUIC_FRAMER_H_
#define QUICHE_QUIC_TEST_TOOLS_SIMPLE_QUIC_FRAMER_H_

#include <memory>
#include <vector>

#include "quiche/quic/core/quic_framer.h"
#include "quiche/quic/core/quic_packets.h"

namespace quic {

struct QuicAckFrame;

namespace test {

class SimpleFramerVisitor;

// Peer to make public a number of otherwise private QuicFramer methods.
class SimpleQuicFramer {
 public:
  SimpleQuicFramer();
  explicit SimpleQuicFramer(const ParsedQuicVersionVector& supported_versions);
  SimpleQuicFramer(const ParsedQuicVersionVector& supported_versions,
                   Perspective perspective);
  SimpleQuicFramer(const SimpleQuicFramer&) = delete;
  SimpleQuicFramer& operator=(const SimpleQuicFramer&) = delete;
  ~SimpleQuicFramer();

  bool ProcessPacket(const QuicEncryptedPacket& packet);
  void Reset();

  const QuicPacketHeader& header() const;
  size_t num_frames() const;
  const std::vector<QuicFrameType>& frame_types() const;
  const std::vector<QuicAckFrame>& ack_frames() const;
  const std::vector<QuicConnectionCloseFrame>& connection_close_frames() const;
  const std::vector<QuicStopWaitingFrame>& stop_waiting_frames() const;
  const std::vector<QuicPathChallengeFrame>& path_challenge_frames() const;
  const std::vector<QuicPathResponseFrame>& path_response_frames() const;
  const std::vector<QuicPingFrame>& ping_frames() const;
  const std::vector<QuicDatagramFrame>& datagram_frames() const;
  const std::vector<QuicWindowUpdateFrame>& window_update_frames() const;
  const std::vector<QuicGoAwayFrame>& goaway_frames() const;
  const std::vector<QuicRstStreamFrame>& rst_stream_frames() const;
  const std::vector<std::unique_ptr<QuicStreamFrame>>& stream_frames() const;
  const std::vector<std::unique_ptr<QuicCryptoFrame>>& crypto_frames() const;
  const std::vector<QuicPaddingFrame>& padding_frames() const;
  const QuicVersionNegotiationPacket* version_negotiation_packet() const;
  EncryptionLevel last_decrypted_level() const;
  const QuicEncryptedPacket* coalesced_packet() const;

  QuicFramer* framer();

  void SetSupportedVersions(const ParsedQuicVersionVector& versions) {
    framer_.SetSupportedVersions(versions);
  }

 private:
  QuicFramer framer_;
  std::unique_ptr<SimpleFramerVisitor> visitor_;
};

}  // namespace test

}  // namespace quic

#endif  // QUICHE_QUIC_TEST_TOOLS_SIMPLE_QUIC_FRAMER_H_
