Upload upstream chromium 76.0.3809.146
[platform/framework/web/chromium-efl.git] / base / fuchsia / service_directory_client.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/service_directory_client.h"
6
7 #include <lib/fdio/directory.h>
8 #include <utility>
9
10 #include "base/fuchsia/file_utils.h"
11 #include "base/fuchsia/fuchsia_logging.h"
12 #include "base/logging.h"
13 #include "base/memory/ptr_util.h"
14 #include "base/no_destructor.h"
15
16 namespace base {
17 namespace fuchsia {
18
19 ServiceDirectoryClient::ServiceDirectoryClient(
20     fidl::InterfaceHandle<::fuchsia::io::Directory> directory)
21     : directory_(std::move(directory)) {
22   DCHECK(directory_);
23 }
24
25 ServiceDirectoryClient::~ServiceDirectoryClient() = default;
26
27 // static
28 const ServiceDirectoryClient* ServiceDirectoryClient::ForCurrentProcess() {
29   return ServiceDirectoryClient::ProcessInstance()->get();
30 }
31
32 zx_status_t ServiceDirectoryClient::ConnectToServiceUnsafe(
33     const char* name,
34     zx::channel request) const {
35   DCHECK(request.is_valid());
36   return fdio_service_connect_at(directory_.channel().get(), name,
37                                  request.release());
38 }
39
40 ServiceDirectoryClient::ServiceDirectoryClient() {}
41
42 // static
43 std::unique_ptr<ServiceDirectoryClient>
44 ServiceDirectoryClient::CreateForProcess() {
45   fidl::InterfaceHandle<::fuchsia::io::Directory> directory =
46       OpenDirectory(base::FilePath(kServiceDirectoryPath));
47   if (directory)
48     return std::make_unique<ServiceDirectoryClient>(std::move(directory));
49   LOG(WARNING) << "/svc is not available.";
50   return base::WrapUnique(new ServiceDirectoryClient);
51 }
52
53 // static
54 std::unique_ptr<ServiceDirectoryClient>*
55 ServiceDirectoryClient::ProcessInstance() {
56   static base::NoDestructor<std::unique_ptr<ServiceDirectoryClient>>
57       service_directory_client_ptr(CreateForProcess());
58   return service_directory_client_ptr.get();
59 }
60
61 ScopedServiceDirectoryClientForCurrentProcessForTest::
62     ScopedServiceDirectoryClientForCurrentProcessForTest(
63         fidl::InterfaceHandle<::fuchsia::io::Directory> directory)
64     : old_client_(std::move(*ServiceDirectoryClient::ProcessInstance())) {
65   *ServiceDirectoryClient::ProcessInstance() =
66       std::make_unique<ServiceDirectoryClient>(std::move(directory));
67   client_ = ServiceDirectoryClient::ProcessInstance()->get();
68 }
69
70 ScopedServiceDirectoryClientForCurrentProcessForTest::
71     ~ScopedServiceDirectoryClientForCurrentProcessForTest() {
72   DCHECK_EQ(ServiceDirectoryClient::ProcessInstance()->get(), client_);
73   *ServiceDirectoryClient::ProcessInstance() = std::move(old_client_);
74 }
75
76 }  // namespace fuchsia
77 }  // namespace base