// 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 "net/third_party/quiche/src/quic/core/frames/quic_connection_close_frame.h"

namespace quic {

QuicConnectionCloseFrame::QuicConnectionCloseFrame()
    // Default close type ensures that existing, pre-V99 code works as expected.
    : close_type(GOOGLE_QUIC_CONNECTION_CLOSE),
      quic_error_code(QUIC_NO_ERROR),
      extracted_error_code(QUIC_IETF_GQUIC_ERROR_MISSING),
      transport_close_frame_type(0) {}

QuicConnectionCloseFrame::QuicConnectionCloseFrame(QuicErrorCode error_code)
    // Default close type ensures that existing, pre-V99 code works as expected.
    : close_type(GOOGLE_QUIC_CONNECTION_CLOSE),
      quic_error_code(error_code),
      extracted_error_code(QUIC_IETF_GQUIC_ERROR_MISSING),
      transport_close_frame_type(0) {}

QuicConnectionCloseFrame::QuicConnectionCloseFrame(QuicErrorCode error_code,
                                                   std::string error_details)
    // Default close type ensures that existing, pre-V99 code works as expected.
    : close_type(GOOGLE_QUIC_CONNECTION_CLOSE),
      quic_error_code(error_code),
      extracted_error_code(QUIC_IETF_GQUIC_ERROR_MISSING),
      error_details(std::move(error_details)),
      transport_close_frame_type(0) {}

QuicConnectionCloseFrame::QuicConnectionCloseFrame(
    QuicIetfTransportErrorCodes transport_error_code,
    QuicErrorCode extracted_error_code,
    std::string error_details,
    uint64_t transport_close_frame_type)
    // Default close type ensures that existing, pre-V99 code works as expected.
    : close_type(GOOGLE_QUIC_CONNECTION_CLOSE),
      transport_error_code(transport_error_code),
      extracted_error_code(extracted_error_code),
      error_details(std::move(error_details)),
      transport_close_frame_type(transport_close_frame_type) {}

std::ostream& operator<<(
    std::ostream& os,
    const QuicConnectionCloseFrame& connection_close_frame) {
  os << "{ Close type: " << connection_close_frame.close_type
     << ", error_code: "
     << ((connection_close_frame.close_type ==
          IETF_QUIC_TRANSPORT_CONNECTION_CLOSE)
             ? connection_close_frame.transport_error_code
             : ((connection_close_frame.close_type ==
                 IETF_QUIC_APPLICATION_CONNECTION_CLOSE)
                    ? connection_close_frame.application_error_code
                    : connection_close_frame.quic_error_code))
     << ", extracted_error_code: "
     << connection_close_frame.extracted_error_code << ", error_details: '"
     << connection_close_frame.error_details
     << "', frame_type: " << connection_close_frame.transport_close_frame_type
     << "}\n";
  return os;
}

std::ostream& operator<<(std::ostream& os, const QuicConnectionCloseType type) {
  switch (type) {
    case GOOGLE_QUIC_CONNECTION_CLOSE:
      os << "GOOGLE_QUIC_CONNECTION_CLOSE";
      break;
    case IETF_QUIC_TRANSPORT_CONNECTION_CLOSE:
      os << "IETF_QUIC_TRANSPORT_CONNECTION_CLOSE";
      break;
    case IETF_QUIC_APPLICATION_CONNECTION_CLOSE:
      os << "IETF_QUIC_APPLICATION_CONNECTION_CLOSE";
      break;
    default:
      os << "Unknown: " << static_cast<int>(type);
      break;
  }
  return os;
}

}  // namespace quic
