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

#ifndef SRC_DEVELOPER_DEBUG_DEBUG_AGENT_REMOTE_API_H_
#define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_REMOTE_API_H_

#include "src/developer/debug/ipc/protocol.h"

namespace debug_agent {

// This is an abstract class that implements calls corresponding to the
// client->agent IPC requests.
class RemoteAPI {
 public:
  RemoteAPI() {}
  virtual ~RemoteAPI() {}

  virtual void OnHello(const debug_ipc::HelloRequest& request, debug_ipc::HelloReply* reply) = 0;

  virtual void OnStatus(const debug_ipc::StatusRequest& request, debug_ipc::StatusReply* reply) = 0;

  virtual void OnLaunch(const debug_ipc::LaunchRequest& request, debug_ipc::LaunchReply* reply) = 0;
  virtual void OnKill(const debug_ipc::KillRequest& request, debug_ipc::KillReply* reply) = 0;

  virtual void OnConfigAgent(const debug_ipc::ConfigAgentRequest& request,
                             debug_ipc::ConfigAgentReply* reply) = 0;

  // Attach is special because it needs to follow the reply immediately with
  // a series of notifications about the current threads. This means it
  // can't use the automatic reply sending. It must manually deserialize and
  // send the reply.
  virtual void OnAttach(std::vector<char> serialized) = 0;
  // This is an overload with the result of reading |serialized|.
  // We have this so it's easier to call a MockRemoteAPI.
  virtual void OnAttach(uint32_t transaction_id, const debug_ipc::AttachRequest&) = 0;

  virtual void OnDetach(const debug_ipc::DetachRequest& request, debug_ipc::DetachReply* reply) = 0;

  virtual void OnModules(const debug_ipc::ModulesRequest& request,
                         debug_ipc::ModulesReply* reply) = 0;

  virtual void OnPause(const debug_ipc::PauseRequest& request, debug_ipc::PauseReply* reply) = 0;

  virtual void OnQuitAgent(const debug_ipc::QuitAgentRequest& request,
                           debug_ipc::QuitAgentReply* reply) = 0;

  virtual void OnResume(const debug_ipc::ResumeRequest& request, debug_ipc::ResumeReply* reply) = 0;

  virtual void OnProcessTree(const debug_ipc::ProcessTreeRequest& request,
                             debug_ipc::ProcessTreeReply* reply) = 0;

  virtual void OnThreads(const debug_ipc::ThreadsRequest& request,
                         debug_ipc::ThreadsReply* reply) = 0;

  virtual void OnReadMemory(const debug_ipc::ReadMemoryRequest& request,
                            debug_ipc::ReadMemoryReply* reply) = 0;

  virtual void OnReadRegisters(const debug_ipc::ReadRegistersRequest& request,
                               debug_ipc::ReadRegistersReply* reply) = 0;

  virtual void OnWriteRegisters(const debug_ipc::WriteRegistersRequest& request,
                                debug_ipc::WriteRegistersReply* reply) = 0;

  virtual void OnAddOrChangeBreakpoint(const debug_ipc::AddOrChangeBreakpointRequest& request,
                                       debug_ipc::AddOrChangeBreakpointReply* reply) = 0;

  virtual void OnRemoveBreakpoint(const debug_ipc::RemoveBreakpointRequest& request,
                                  debug_ipc::RemoveBreakpointReply* reply) = 0;

  virtual void OnSysInfo(const debug_ipc::SysInfoRequest& request,
                         debug_ipc::SysInfoReply* reply) = 0;

  virtual void OnProcessStatus(const debug_ipc::ProcessStatusRequest& request,
                               debug_ipc::ProcessStatusReply* reply) = 0;

  virtual void OnThreadStatus(const debug_ipc::ThreadStatusRequest& request,
                              debug_ipc::ThreadStatusReply* reply) = 0;

  virtual void OnAddressSpace(const debug_ipc::AddressSpaceRequest& request,
                              debug_ipc::AddressSpaceReply* reply) = 0;

  virtual void OnJobFilter(const debug_ipc::JobFilterRequest& request,
                           debug_ipc::JobFilterReply* reply) = 0;

  virtual void OnWriteMemory(const debug_ipc::WriteMemoryRequest& request,
                             debug_ipc::WriteMemoryReply* reply) = 0;

  virtual void OnLoadInfoHandleTable(const debug_ipc::LoadInfoHandleTableRequest& request,
                                     debug_ipc::LoadInfoHandleTableReply* reply) = 0;

  virtual void OnUpdateGlobalSettings(const debug_ipc::UpdateGlobalSettingsRequest& request,
                                      debug_ipc::UpdateGlobalSettingsReply* reply) = 0;
};

}  // namespace debug_agent

#endif  // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_REMOTE_API_H_
