// 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_SYS_APPMGR_SYSTEM_OBJECTS_DIRECTORY_H_
#define SRC_SYS_APPMGR_SYSTEM_OBJECTS_DIRECTORY_H_

#include <lib/zx/process.h>
#include <lib/zx/thread.h>

#include <fbl/string.h>
#include <fs/lazy_dir.h>

#include "src/lib/fxl/strings/string_view.h"
#include "src/lib/inspect_deprecated/deprecated/exposed_object.h"

namespace component {

class SystemObjectsDirectory : public component::ExposedObject {
 public:
  explicit SystemObjectsDirectory(zx::process process);

 private:
  class ThreadsDirectory : public component::ExposedObject {
   public:
    explicit ThreadsDirectory(std::shared_ptr<zx::process> process);

   private:
    static constexpr uint64_t kAllId = 1;
    std::shared_ptr<zx::process> process_;
    fit::deferred_action<fit::closure> cleanup_;
  };

  class MemoryDirectory : public component::ExposedObject {
   public:
    explicit MemoryDirectory(std::shared_ptr<zx::process> process);

   private:
    std::shared_ptr<zx::process> process_;
    fit::deferred_action<fit::closure> cleanup_;
  };

  // TODO(CF-761): Refactor this to use dynamic VMO nodes.
  std::shared_ptr<zx::process> process_;
  std::unique_ptr<ThreadsDirectory> threads_;
  std::unique_ptr<MemoryDirectory> memory_;
};

}  // namespace component

#endif  // SRC_SYS_APPMGR_SYSTEM_OBJECTS_DIRECTORY_H_
