// Copyright 2018 The Chromium 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 "base/fuchsia/filtered_service_directory.h"

#include <lib/fdio/util.h>
#include <lib/zx/channel.h>

#include "base/bind.h"
#include "base/fuchsia/component_context.h"
#include "base/fuchsia/fuchsia_logging.h"
#include "starboard/types.h"

namespace base {
namespace fuchsia {

FilteredServiceDirectory::FilteredServiceDirectory(
    ComponentContext* component_context)
    : component_context_(component_context) {
  zx::channel server_channel;
  zx_status_t status =
      zx::channel::create(0, &server_channel, &directory_client_channel_);
  ZX_CHECK(status == ZX_OK, status) << "zx_channel_create()";

  service_directory_ =
      std::make_unique<ServiceDirectory>(std::move(server_channel));
}

FilteredServiceDirectory::~FilteredServiceDirectory() {
  service_directory_->RemoveAllServices();
}

void FilteredServiceDirectory::AddService(const char* service_name) {
  service_directory_->AddService(
      service_name,
      base::BindRepeating(&FilteredServiceDirectory::HandleRequest,
                          base::Unretained(this), service_name));
}

zx::channel FilteredServiceDirectory::ConnectClient() {
  zx::channel server_channel;
  zx::channel client_channel;
  zx_status_t status = zx::channel::create(0, &server_channel, &client_channel);
  ZX_CHECK(status == ZX_OK, status) << "zx_channel_create()";

  // ServiceDirectory puts public services under ./public . Connect to that
  // directory and return client handle for the connection,
  status = fdio_service_connect_at(directory_client_channel_.get(), "public",
                                   server_channel.release());
  ZX_CHECK(status == ZX_OK, status) << "fdio_service_connect_at()";

  return client_channel;
}

void FilteredServiceDirectory::HandleRequest(const char* service_name,
                                             zx::channel channel) {
  component_context_->ConnectToService(
      FidlInterfaceRequest::CreateFromChannelUnsafe(service_name,
                                                    std::move(channel)));
}

}  // namespace fuchsia
}  // namespace base
