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