// 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 GARNET_BIN_DEBUG_AGENT_REMOTE_API_H_
#define GARNET_BIN_DEBUG_AGENT_REMOTE_API_H_

#include "garnet/lib/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 OnLaunch(const debug_ipc::LaunchRequest& request,
                        debug_ipc::LaunchReply* reply) = 0;
  virtual void OnKill(const debug_ipc::KillRequest& request,
                      debug_ipc::KillReply* 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;

  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 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 OnSymbolTables(const debug_ipc::SymbolTablesRequest& request,
                              debug_ipc::SymbolTablesReply* reply) = 0;
};

}  // namespace debug_agent

#endif  // GARNET_BIN_DEBUG_AGENT_REMOTE_API_H_
