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