Upload upstream chromium 76.0.3809.146
[platform/framework/web/chromium-efl.git] / base / fuchsia / filtered_service_directory.cc
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.
4
5 #include "base/fuchsia/filtered_service_directory.h"
6
7 #include <lib/fdio/directory.h>
8 #include <utility>
9
10 #include "base/bind.h"
11 #include "base/fuchsia/fuchsia_logging.h"
12 #include "base/fuchsia/service_directory_client.h"
13
14 namespace base {
15 namespace fuchsia {
16
17 FilteredServiceDirectory::FilteredServiceDirectory(
18     const ServiceDirectoryClient* directory)
19     : directory_(directory) {
20   outgoing_directory_ = std::make_unique<ServiceDirectory>(
21       outgoing_directory_client_.NewRequest());
22 }
23
24 FilteredServiceDirectory::~FilteredServiceDirectory() {
25   outgoing_directory_->RemoveAllServices();
26 }
27
28 void FilteredServiceDirectory::AddService(const char* service_name) {
29   outgoing_directory_->AddServiceUnsafe(
30       service_name,
31       base::BindRepeating(&FilteredServiceDirectory::HandleRequest,
32                           base::Unretained(this), service_name));
33 }
34
35 fidl::InterfaceHandle<::fuchsia::io::Directory>
36 FilteredServiceDirectory::ConnectClient() {
37   fidl::InterfaceHandle<::fuchsia::io::Directory> client;
38
39   // ServiceDirectory puts public services under ./svc . Connect to that
40   // directory and return client handle for the connection,
41   zx_status_t status =
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()";
45
46   return client;
47 }
48
49 void FilteredServiceDirectory::HandleRequest(const char* service_name,
50                                              zx::channel channel) {
51   directory_->ConnectToServiceUnsafe(service_name, std::move(channel));
52 }
53
54 }  // namespace fuchsia
55 }  // namespace base