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

#include <fuchsia/io/cpp/fidl.h>
#include <lib/vfs/cpp/pseudo_dir.h>
#include <lib/vfs/cpp/service.h>

#include <map>
#include <string>

namespace vfs {

// A directory-like object which created a composed PseudoDir on top of
// |fallback_dir|.It can be used to connect to services in |fallback_dir| but it
// will not enumerate them.
class ComposedServiceDir : public vfs::internal::Directory {
 public:
  ComposedServiceDir();
  ~ComposedServiceDir() override;

  void set_fallback(fidl::InterfaceHandle<fuchsia::io::Directory> fallback_dir);

  void AddService(const std::string& service_name, std::unique_ptr<vfs::Service> service);

  //
  // |vfs::internal::Node| Implementations:
  //
  zx_status_t Lookup(const std::string& name, vfs::internal::Node** out_node) const final;

  zx_status_t GetAttr(fuchsia::io::NodeAttributes* out_attributes) const final;

  // NOTE(fxbug.dev/55769): Readdir() will NOT return any entries from |fallback_dir_|.
  zx_status_t Readdir(uint64_t offset, void* data, uint64_t len, uint64_t* out_offset,
                      uint64_t* out_actual) final;

 private:
  std::unique_ptr<vfs::PseudoDir> root_;
  zx::channel fallback_dir_;
  // The collection of services that have been looked up on the fallback
  // directory. These services are just passthrough in the sense that they
  // forward connection requests to the fallback directory. Since there is no
  // good way in the present context to know whether these service entries
  // actually match an existing service, and since the present object must own
  // these entries, we keep them around until the present object gets deleted.
  mutable std::map<std::string, std::unique_ptr<vfs::Service>> fallback_services_;

  // Disallow copy and assignment.
  ComposedServiceDir(const ComposedServiceDir&) = delete;
  ComposedServiceDir& operator=(const ComposedServiceDir&) = delete;
};

}  // namespace vfs

#endif  // LIB_VFS_CPP_COMPOSED_SERVICE_DIR_H_
