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

#pragma once

#include "garnet/lib/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);

// 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);

// 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);

// Backtrace
bool ReadRequest(MessageReader* reader,
                 BacktraceRequest* request,
                 uint32_t* transaction_id);
void WriteReply(const BacktraceReply& 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);

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

void WriteNotifyProcess(const NotifyProcess& notify, MessageWriter* writer);
void WriteNotifyThread(MsgHeader::Type type,
                       const NotifyThread& notify,
                       MessageWriter* writer);
void WriteNotifyException(const NotifyException& notify, MessageWriter* writer);

}  // namespace debug_ipc
