// Copyright 2020 the V8 project 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 V8_TOOLS_V8WINDBG_TEST_DEBUG_CALLBACKS_H_
#define V8_TOOLS_V8WINDBG_TEST_DEBUG_CALLBACKS_H_

#if !defined(UNICODE) || !defined(_UNICODE)
#error Unicode not defined
#endif

#include <DbgEng.h>
#include <DbgModel.h>
#include <Windows.h>
#include <crtdbg.h>
#include <pathcch.h>
#include <wrl/client.h>

#include <string>

namespace WRL = Microsoft::WRL;

namespace v8 {
namespace internal {
namespace v8windbg_test {

class MyOutput : public IDebugOutputCallbacks {
 public:
  MyOutput(WRL::ComPtr<IDebugClient5> p_client);
  ~MyOutput();
  MyOutput(const MyOutput&) = delete;
  MyOutput& operator=(const MyOutput&) = delete;

  // Inherited via IDebugOutputCallbacks
  HRESULT __stdcall QueryInterface(REFIID InterfaceId,
                                   PVOID* Interface) override;
  ULONG __stdcall AddRef(void) override;
  ULONG __stdcall Release(void) override;
  HRESULT __stdcall Output(ULONG Mask, PCSTR Text) override;

  const std::string& GetLog() const { return log_; }
  void ClearLog() { log_.clear(); }

 private:
  WRL::ComPtr<IDebugClient5> p_client_;
  std::string log_;
};

// For return values, see:
// https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debug-status-xxx
class MyCallback : public IDebugEventCallbacks {
 public:
  // Inherited via IDebugEventCallbacks
  HRESULT __stdcall QueryInterface(REFIID InterfaceId,
                                   PVOID* Interface) override;
  ULONG __stdcall AddRef(void) override;
  ULONG __stdcall Release(void) override;
  HRESULT __stdcall GetInterestMask(PULONG Mask) override;
  HRESULT __stdcall Breakpoint(PDEBUG_BREAKPOINT Bp) override;
  HRESULT __stdcall Exception(PEXCEPTION_RECORD64 Exception,
                              ULONG FirstChance) override;
  HRESULT __stdcall CreateThread(ULONG64 Handle, ULONG64 DataOffset,
                                 ULONG64 StartOffset) override;
  HRESULT __stdcall ExitThread(ULONG ExitCode) override;
  HRESULT __stdcall ExitProcess(ULONG ExitCode) override;
  HRESULT __stdcall LoadModule(ULONG64 ImageFileHandle, ULONG64 BaseOffset,
                               ULONG ModuleSize, PCSTR ModuleName,
                               PCSTR ImageName, ULONG CheckSum,
                               ULONG TimeDateStamp) override;
  HRESULT __stdcall UnloadModule(PCSTR ImageBaseName,
                                 ULONG64 BaseOffset) override;
  HRESULT __stdcall SystemError(ULONG Error, ULONG Level) override;
  HRESULT __stdcall SessionStatus(ULONG Status) override;
  HRESULT __stdcall ChangeDebuggeeState(ULONG Flags, ULONG64 Argument) override;
  HRESULT __stdcall ChangeEngineState(ULONG Flags, ULONG64 Argument) override;
  HRESULT __stdcall ChangeSymbolState(ULONG Flags, ULONG64 Argument) override;
  HRESULT __stdcall CreateProcessW(ULONG64 ImageFileHandle, ULONG64 Handle,
                                   ULONG64 BaseOffset, ULONG ModuleSize,
                                   PCSTR ModuleName, PCSTR ImageName,
                                   ULONG CheckSum, ULONG TimeDateStamp,
                                   ULONG64 InitialThreadHandle,
                                   ULONG64 ThreadDataOffset,
                                   ULONG64 StartOffset) override;
};

}  // namespace v8windbg_test
}  // namespace internal
}  // namespace v8

#endif  // V8_TOOLS_V8WINDBG_TEST_DEBUG_CALLBACKS_H_
