// Copyright 2018 The Fuchsia 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 "garnet/lib/debug_ipc/protocol.h"

#include "lib/fxl/logging.h"

namespace debug_ipc {

constexpr uint32_t MsgHeader::kSerializedHeaderSize;

constexpr uint64_t HelloReply::kStreamSignature;
constexpr uint32_t HelloReply::kCurrentVersion;

const char* MsgHeaderTypeToString(MsgHeader::Type type) {
  switch (type) {
    case MsgHeader::Type::kNone:
      return "kNone";
    case MsgHeader::Type::kHello:
      return "kHello";
    case MsgHeader::Type::kLaunch:
      return "kLaunch";
    case MsgHeader::Type::kKill:
      return "kKill";
    case MsgHeader::Type::kAttach:
      return "kAttach";
    case MsgHeader::Type::kDetach:
      return "kDetach";
    case MsgHeader::Type::kModules:
      return "kModules";
    case MsgHeader::Type::kSymbolTables:
      return "kSymbolTables";
    case MsgHeader::Type::kPause:
      return "kPause";
    case MsgHeader::Type::kQuitAgent:
      return "kQuitAgent";
    case MsgHeader::Type::kResume:
      return "kResume";
    case MsgHeader::Type::kProcessTree:
      return "kProcessTree";
    case MsgHeader::Type::kThreads:
      return "kThreads";
    case MsgHeader::Type::kReadMemory:
      return "kReadMemory";
    case MsgHeader::Type::kWriteMemory:
      return "kWriteMemory";
    case MsgHeader::Type::kReadRegisters:
      return "kReadRegisters";
    case MsgHeader::Type::kWriteRegisters:
      return "kWriteRegisters";
    case MsgHeader::Type::kAddOrChangeBreakpoint:
      return "kAddOrChangeBreakpoint";
    case MsgHeader::Type::kRemoveBreakpoint:
      return "kRemoveBreakpoint";
    case MsgHeader::Type::kThreadStatus:
      return "kThreadStatus";
    case MsgHeader::Type::kAddressSpace:
      return "kAddressSpace";
    case MsgHeader::Type::kJobFilter:
      return "kJobFilter";
    case MsgHeader::Type::kNotifyProcessExiting:
      return "kNotifyProcessExiting";
    case MsgHeader::Type::kNotifyProcessStarting:
      return "kNotifyProcessStarting";
    case MsgHeader::Type::kNotifyThreadStarting:
      return "kNotifyThreadStarting";
    case MsgHeader::Type::kNotifyThreadExiting:
      return "kNotifyThreadExiting";
    case MsgHeader::Type::kNotifyException:
      return "kNotifyException";
    case MsgHeader::Type::kNotifyModules:
      return "kNotifyModules";
    case MsgHeader::Type::kNumMessages:
      return "kNumMessages";
  }
  FXL_NOTREACHED();
  return "";
}

const char* NotifyException::TypeToString(NotifyException::Type type) {
  switch (type) {
    case NotifyException::Type::kNone:
      return "None";
    case NotifyException::Type::kGeneral:
      return "General";
    case NotifyException::Type::kHardware:
      return "Hardware";
    case NotifyException::Type::kSingleStep:
      return "Single Step";
    case NotifyException::Type::kSoftware:
      return "Software";
    case NotifyException::Type::kLast:
      break;
  }
  FXL_NOTREACHED();
  return "";
}

}  // namespace debug_ipc
