filtered_service_directory.cc 1.5 KB

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