• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 The Chromium Authors
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/async/default.h>
8 #include <utility>
9 
10 #include "base/fuchsia/fuchsia_logging.h"
11 #include "base/functional/bind.h"
12 #include "base/strings/string_piece.h"
13 
14 namespace base {
15 
FilteredServiceDirectory(std::shared_ptr<sys::ServiceDirectory> directory)16 FilteredServiceDirectory::FilteredServiceDirectory(
17     std::shared_ptr<sys::ServiceDirectory> directory)
18     : directory_(directory) {}
19 
20 FilteredServiceDirectory::~FilteredServiceDirectory() = default;
21 
AddService(StringPiece service_name)22 zx_status_t FilteredServiceDirectory::AddService(StringPiece service_name) {
23   return outgoing_directory_.AddPublicService(
24       std::make_unique<vfs::Service>(
25           [this, service_name = std::string(service_name)](
26               zx::channel channel, async_dispatcher_t* dispatcher) {
27             DCHECK_EQ(dispatcher, async_get_default_dispatcher());
28             directory_->Connect(service_name, std::move(channel));
29           }),
30       std::string(service_name));
31 }
32 
ConnectClient(fidl::InterfaceRequest<fuchsia::io::Directory> dir_request)33 zx_status_t FilteredServiceDirectory::ConnectClient(
34     fidl::InterfaceRequest<fuchsia::io::Directory> dir_request) {
35   // sys::OutgoingDirectory puts public services under ./svc . Connect to that
36   // directory and return client handle for the connection,
37   return outgoing_directory_.GetOrCreateDirectory("svc")->Serve(
38       fuchsia::io::OpenFlags::RIGHT_READABLE |
39           fuchsia::io::OpenFlags::RIGHT_WRITABLE,
40       dir_request.TakeChannel());
41 }
42 
43 }  // namespace base
44