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)16FilteredServiceDirectory::FilteredServiceDirectory( 17 std::shared_ptr<sys::ServiceDirectory> directory) 18 : directory_(directory) {} 19 20 FilteredServiceDirectory::~FilteredServiceDirectory() = default; 21 AddService(StringPiece service_name)22zx_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)33zx_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