// Copyright 2019 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 "runner_context.h"

namespace flutter_runner {

RunnerContext::RunnerContext(std::shared_ptr<sys::ServiceDirectory> svc,
                             zx::channel directory_request)
    : svc_(std::move(svc)),
      root_dir_(std::make_shared<vfs::PseudoDir>()),
      public_dir_(std::make_shared<vfs::PseudoDir>()),
      debug_dir_(std::make_shared<vfs::PseudoDir>()),
      ctrl_dir_(std::make_shared<vfs::PseudoDir>()) {
  root_dir_->AddSharedEntry("public", public_dir_);
  root_dir_->AddSharedEntry("debug", debug_dir_);
  root_dir_->AddSharedEntry("ctrl", ctrl_dir_);

  root_dir_->Serve(
      fuchsia::io::OPEN_RIGHT_READABLE | fuchsia::io::OPEN_RIGHT_WRITABLE,
      std::move(directory_request));
}

RunnerContext::~RunnerContext() = default;

std::unique_ptr<RunnerContext> RunnerContext::CreateFromStartupInfo() {
  zx_handle_t directory_request = zx_take_startup_handle(PA_DIRECTORY_REQUEST);
  return std::make_unique<RunnerContext>(
      sys::ServiceDirectory::CreateFromNamespace(),
      zx::channel(directory_request));
}

zx_status_t RunnerContext::AddPublicService(
    std::unique_ptr<vfs::Service> service, std::string service_name) const {
  return public_dir_->AddEntry(std::move(service_name), std::move(service));
}

}  // namespace flutter_runner
