// 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.

#include "quiche/quic/core/frames/quic_connection_close_frame.h"

#include <memory>

#include "quiche/quic/core/quic_constants.h"
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/core/quic_types.h"

namespace quic {

QuicConnectionCloseFrame::QuicConnectionCloseFrame(
    QuicTransportVersion transport_version, QuicErrorCode error_code,
    QuicIetfTransportErrorCodes ietf_error, std::string error_phrase,
    uint64_t frame_type)
    : quic_error_code(error_code), error_details(error_phrase) {
  if (!VersionHasIetfQuicFrames(transport_version)) {
    close_type = GOOGLE_QUIC_CONNECTION_CLOSE;
    wire_error_code = error_code;
    transport_close_frame_type = 0;
    return;
  }
  QuicErrorCodeToIetfMapping mapping =
      QuicErrorCodeToTransportErrorCode(error_code);
  if (ietf_error != NO_IETF_QUIC_ERROR) {
    wire_error_code = ietf_error;
  } else {
    wire_error_code = mapping.error_code;
  }
  if (mapping.is_transport_close) {
    // Maps to a transport close
    close_type = IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
    transport_close_frame_type = frame_type;
    return;
  }
  // Maps to an application close.
  close_type = IETF_QUIC_APPLICATION_CONNECTION_CLOSE;
  transport_close_frame_type = 0;
}

std::ostream& operator<<(
    std::ostream& os, const QuicConnectionCloseFrame& connection_close_frame) {
  os << "{ Close type: " << connection_close_frame.close_type;
  switch (connection_close_frame.close_type) {
    case IETF_QUIC_TRANSPORT_CONNECTION_CLOSE:
      os << ", wire_error_code: "
         << static_cast<QuicIetfTransportErrorCodes>(
                connection_close_frame.wire_error_code);
      break;
    case IETF_QUIC_APPLICATION_CONNECTION_CLOSE:
      os << ", wire_error_code: " << connection_close_frame.wire_error_code;
      break;
    case GOOGLE_QUIC_CONNECTION_CLOSE:
      // Do not log, value same as |quic_error_code|.
      break;
  }
  os << ", quic_error_code: "
     << QuicErrorCodeToString(connection_close_frame.quic_error_code)
     << ", error_details: '" << connection_close_frame.error_details << "'";
  if (connection_close_frame.close_type ==
      IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
    os << ", frame_type: "
       << static_cast<QuicIetfFrameType>(
              connection_close_frame.transport_close_frame_type);
  }
  os << "}\n";
  return os;
}

}  // namespace quic
