// Copyright (c) 2016 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_QUIC_PENDING_RETRANSMISSION_H_
#define QUICHE_QUIC_CORE_QUIC_PENDING_RETRANSMISSION_H_

#include "net/third_party/quiche/src/quic/core/frames/quic_frame.h"
#include "net/third_party/quiche/src/quic/core/quic_transmission_info.h"
#include "net/third_party/quiche/src/quic/core/quic_types.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"

namespace quic {

// Struct to store the pending retransmission information.
struct QUIC_EXPORT_PRIVATE QuicPendingRetransmission {
  QuicPendingRetransmission(QuicPacketNumber packet_number,
                            TransmissionType transmission_type,
                            const QuicFrames& retransmittable_frames,
                            bool has_crypto_handshake,
                            int num_padding_bytes,
                            EncryptionLevel encryption_level,
                            QuicPacketNumberLength packet_number_length)
      : packet_number(packet_number),
        retransmittable_frames(retransmittable_frames),
        transmission_type(transmission_type),
        has_crypto_handshake(has_crypto_handshake),
        num_padding_bytes(num_padding_bytes),
        encryption_level(encryption_level),
        packet_number_length(packet_number_length) {}

  QuicPendingRetransmission(QuicPacketNumber packet_number,
                            TransmissionType transmission_type,
                            const QuicTransmissionInfo& tranmission_info)
      : packet_number(packet_number),
        retransmittable_frames(tranmission_info.retransmittable_frames),
        transmission_type(transmission_type),
        has_crypto_handshake(tranmission_info.has_crypto_handshake),
        num_padding_bytes(tranmission_info.num_padding_bytes),
        encryption_level(tranmission_info.encryption_level),
        packet_number_length(tranmission_info.packet_number_length) {}

  QuicPacketNumber packet_number;
  const QuicFrames& retransmittable_frames;
  TransmissionType transmission_type;
  bool has_crypto_handshake;
  int num_padding_bytes;
  EncryptionLevel encryption_level;
  QuicPacketNumberLength packet_number_length;
};

}  // namespace quic

#endif  // QUICHE_QUIC_CORE_QUIC_PENDING_RETRANSMISSION_H_
