// 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_runner {

// 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_runner

#endif  // TOPAZ_RUNTIME_FLUTTER_RUNNER_SERVICE_PROVIDER_DIR_H_
