1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/fuchsia/filtered_service_directory.h"
7 #include <lib/fdio/directory.h>
10 #include "base/bind.h"
11 #include "base/fuchsia/fuchsia_logging.h"
12 #include "base/fuchsia/service_directory_client.h"
17 FilteredServiceDirectory::FilteredServiceDirectory(
18 const ServiceDirectoryClient* directory)
19 : directory_(directory) {
20 outgoing_directory_ = std::make_unique<ServiceDirectory>(
21 outgoing_directory_client_.NewRequest());
24 FilteredServiceDirectory::~FilteredServiceDirectory() {
25 outgoing_directory_->RemoveAllServices();
28 void FilteredServiceDirectory::AddService(const char* service_name) {
29 outgoing_directory_->AddServiceUnsafe(
31 base::BindRepeating(&FilteredServiceDirectory::HandleRequest,
32 base::Unretained(this), service_name));
35 fidl::InterfaceHandle<::fuchsia::io::Directory>
36 FilteredServiceDirectory::ConnectClient() {
37 fidl::InterfaceHandle<::fuchsia::io::Directory> client;
39 // ServiceDirectory puts public services under ./svc . Connect to that
40 // directory and return client handle for the connection,
42 fdio_service_connect_at(outgoing_directory_client_.channel().get(), "svc",
43 client.NewRequest().TakeChannel().release());
44 ZX_CHECK(status == ZX_OK, status) << "fdio_service_connect_at()";
49 void FilteredServiceDirectory::HandleRequest(const char* service_name,
50 zx::channel channel) {
51 directory_->ConnectToServiceUnsafe(service_name, std::move(channel));
54 } // namespace fuchsia