blob: bc58f1bc330717179c822d4d33f9dc7e856cca86 [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.
#ifndef TOPAZ_RUNTIME_FLUTTER_RUNNER_SERVICE_PROVIDER_DIR_H_
#define TOPAZ_RUNTIME_FLUTTER_RUNNER_SERVICE_PROVIDER_DIR_H_
#include <map>
#include <string>
#include <unordered_set>
#include <utility>
#include <vector>
#include <fuchsia/io/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <lib/vfs/cpp/pseudo_dir.h>
#include <lib/vfs/cpp/service.h>
#include "lib/fidl/cpp/binding_set.h"
namespace flutter {
// A directory-like object which dynamically creates Service nodes
// for any file lookup. It also exposes service provider interface.
//
// It supports enumeration for only first level of services.
class ServiceProviderDir : public vfs::Directory {
public:
ServiceProviderDir();
~ServiceProviderDir() override;
void set_fallback(fidl::InterfaceHandle<fuchsia::io::Directory> fallback_dir);
void AddService(const std::string& service_name,
std::unique_ptr<vfs::Service> service);
//
// Overridden from |vfs::Node|:
//
zx_status_t Lookup(const std::string& name, vfs::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:
// |root_| has all services offered by this provider (including those
// inherited from the parent, if any).
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.
// Needs to be marked mutable so that it can be altered by the Lookup method.
mutable std::map<std::string,
std::unique_ptr<vfs::Service>> fallback_services_;
// Disallow copy and assignment.
ServiceProviderDir(const ServiceProviderDir&) = delete;
ServiceProviderDir& operator=(const ServiceProviderDir&) = delete;
};
} // namespace flutter
#endif // TOPAZ_RUNTIME_FLUTTER_RUNNER_SERVICE_PROVIDER_DIR_H_