blob: ba434e9a9736b1048dee5625aed18759fde100e4 [file] [log] [blame]
// 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