// Copyright 2020 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_ZIRCON_UTILS_H_
#define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_ZIRCON_UTILS_H_

#include <lib/zx/job.h>
#include <lib/zx/process.h>
#include <lib/zx/thread.h>
#include <zircon/types.h>

#include <string>
#include <vector>

namespace debug_agent {
namespace zircon {

// This file contains low-level helpers for dealing with Zircon primitives.
//
// These should only be used by _zircon implementation files that aren't mocked. Normal callers
// (e.g. debugged_thread.cc) should go through the wrappers like ThreadHandle which allow mocking.
// These helpers are very low-level functions for use by the non-mocked implementations.
//
// These functions should work in terms of zx::* primitives and nto ProcessHandle, etc.

// Returns ZX_KOID_INVALID on failure.
zx_koid_t KoidForObject(const zx::object_base& object);

// Returns empty string on failure.
std::string NameForObject(const zx::object_base& object);

// Returns an !is_valid() job object on failure.
zx::job GetRootJob();

// Returns the koid of the job the component manager uses as its root job. Returns ZX_KOID_INVALID
// on failure.
zx_koid_t GetComponentRootJobKoid();

// Returns the given type of child koids.
std::vector<zx_koid_t> GetChildKoids(const zx::object_base& parent, uint32_t child_kind);

// Returns the given child objects. Will be empty on failure.
std::vector<zx::thread> GetChildThreads(const zx::process& process);
std::vector<zx::process> GetChildProcesses(const zx::job& job);
std::vector<zx::job> GetChildJobs(const zx::job& job);

}  // namespace zircon
}  // namespace debug_agent

#endif  // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_ZIRCON_UTILS_H_
