blob: 62c30e650cf32cb5a42a87ac55e1cf7e1de84998 [file] [log] [blame]
// 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.
#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 {
~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( 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;
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