// 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_IPC_AGENT_PROTOCOL_H_
#define SRC_DEVELOPER_DEBUG_IPC_AGENT_PROTOCOL_H_

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

namespace debug_ipc {

class MessageReader;
class MessageWriter;

// Hello.
bool ReadRequest(MessageReader* reader, HelloRequest* request, uint32_t* transaction_id);
void WriteReply(const HelloReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Status.
bool ReadRequest(MessageReader* reader, StatusRequest* request, uint32_t* transaction_id);
void WriteReply(const StatusReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Launch.
bool ReadRequest(MessageReader* reader, LaunchRequest* request, uint32_t* transaction_id);
void WriteReply(const LaunchReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Stop.
bool ReadRequest(MessageReader* reader, KillRequest* request, uint32_t* transaction_id);
void WriteReply(const KillReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Attach.
bool ReadRequest(MessageReader* reader, AttachRequest* request, uint32_t* transaction_id);
void WriteReply(const AttachReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Detach.
bool ReadRequest(MessageReader* reader, DetachRequest* request, uint32_t* transaction_id);
void WriteReply(const DetachReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Pause.
bool ReadRequest(MessageReader* reader, PauseRequest* request, uint32_t* transaction_id);
void WriteReply(const PauseReply& reply, uint32_t transaction_id, MessageWriter* writer);

// QuitAgent.
bool ReadRequest(MessageReader* reader, QuitAgentRequest* request, uint32_t* transaction_id);
void WriteReply(const QuitAgentReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Resume.
bool ReadRequest(MessageReader* reader, ResumeRequest* request, uint32_t* transaction_id);
void WriteReply(const ResumeReply& reply, uint32_t transaction_id, MessageWriter* writer);

// ProcessTree.
bool ReadRequest(MessageReader* reader, ProcessTreeRequest* request, uint32_t* transaction_id);
void WriteReply(const ProcessTreeReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Threads.
bool ReadRequest(MessageReader* reader, ThreadsRequest* request, uint32_t* transaction_id);
void WriteReply(const ThreadsReply& reply, uint32_t transaction_id, MessageWriter* writer);

// ReadMemory.
bool ReadRequest(MessageReader* reader, ReadMemoryRequest* request, uint32_t* transaction_id);
void WriteReply(const ReadMemoryReply& reply, uint32_t transaction_id, MessageWriter* writer);

// AddOrChangeBreakpoint.
bool ReadRequest(MessageReader* reader, AddOrChangeBreakpointRequest* request,
                 uint32_t* transaction_id);
void WriteReply(const AddOrChangeBreakpointReply& reply, uint32_t transaction_id,
                MessageWriter* writer);

// RemoveBreakpoint.
bool ReadRequest(MessageReader* reader, RemoveBreakpointRequest* request, uint32_t* transaction_id);
void WriteReply(const RemoveBreakpointReply& reply, uint32_t transaction_id, MessageWriter* writer);

// SysInfo
bool ReadRequest(MessageReader* reader, SysInfoRequest* request, uint32_t* transaction_id);
void WriteReply(const SysInfoReply& reply, uint32_t transaction_id, MessageWriter* writer);

// ProcessStatus
bool ReadRequest(MessageReader* reader, ProcessStatusRequest* request, uint32_t* transaction_id);
void WriteReply(const ProcessStatusReply& reply, uint32_t transaction_id, MessageWriter* writer);

// ThreadStatus
bool ReadRequest(MessageReader* reader, ThreadStatusRequest* request, uint32_t* transaction_id);
void WriteReply(const ThreadStatusReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Modules
bool ReadRequest(MessageReader* reader, ModulesRequest* request, uint32_t* transaction_id);
void WriteReply(const ModulesReply& reply, uint32_t transaction_id, MessageWriter* writer);

// ReadRegisters
bool ReadRequest(MessageReader* reader, ReadRegistersRequest* request, uint32_t* transaction_id);
void WriteReply(const ReadRegistersReply& reply, uint32_t transaction_id, MessageWriter* writer);

// WriteRegisters
bool ReadRequest(MessageReader* reader, WriteRegistersRequest* request, uint32_t* transaction_id);
void WriteReply(const WriteRegistersReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Address space
bool ReadRequest(MessageReader* reader, AddressSpaceRequest* request, uint32_t* transaction_id);
void WriteReply(const AddressSpaceReply& reply, uint32_t transaction_id, MessageWriter* writer);

// JobFilter.
bool ReadRequest(MessageReader* reader, JobFilterRequest* request, uint32_t* transaction_id);
void WriteReply(const JobFilterReply& reply, uint32_t transaction_id, MessageWriter* writer);

// WriteMemory.
bool ReadRequest(MessageReader* reader, WriteMemoryRequest* request, uint32_t* transaction_id);
void WriteReply(const WriteMemoryReply& reply, uint32_t transaction_id, MessageWriter* writer);

// LoadInfoHandleTable.
bool ReadRequest(MessageReader* reader, LoadInfoHandleTableRequest* request,
                 uint32_t* transaction_id);
void WriteReply(const LoadInfoHandleTableReply& reply, uint32_t transaction_id,
                MessageWriter* writer);

// UpdateGlobalSettings.
bool ReadRequest(MessageReader* reader, UpdateGlobalSettingsRequest* request,
                 uint32_t* transaction_id);
void WriteReply(const UpdateGlobalSettingsReply& reply, uint32_t transaction_id,
                MessageWriter* writer);

// ConfigAgent.
bool ReadRequest(MessageReader* reader, ConfigAgentRequest* request, uint32_t* transaction_id);
void WriteReply(const ConfigAgentReply& reply, uint32_t transaction_id, MessageWriter* writer);

// Notifications ---------------------------------------------------------------
//
// (These don't have a "request"/"reply".)

void WriteNotifyProcessExiting(const NotifyProcessExiting&, MessageWriter*);
void WriteNotifyProcessStarting(const NotifyProcessStarting&, MessageWriter*);
void WriteNotifyThread(MsgHeader::Type, const NotifyThread&, MessageWriter*);
void WriteNotifyException(const NotifyException& notify, MessageWriter*);
void WriteNotifyModules(const NotifyModules& notify, MessageWriter*);
void WriteNotifyIO(const NotifyIO& notify, MessageWriter*);

}  // namespace debug_ipc

#endif  // SRC_DEVELOPER_DEBUG_IPC_AGENT_PROTOCOL_H_
