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 "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
6 
7 #include <utility>
8 
9 #include "base/bind.h"
10 #include "base/feature_list.h"
11 #include "base/memory/weak_ptr.h"
12 #include "chrome/browser/chromeos/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h"
13 #include "chrome/common/chrome_features.h"
14 #include "dbus/bus.h"
15 #include "dbus/message.h"
16 #include "third_party/cros_system_api/dbus/service_constants.h"
17 
18 namespace chromeos {
19 
20 namespace {
21 
22 WilcoDtcSupportdClient* g_instance = nullptr;
23 
OnVoidDBusMethod(VoidDBusMethodCallback callback,dbus::Response * response)24 void OnVoidDBusMethod(VoidDBusMethodCallback callback,
25                       dbus::Response* response) {
26   std::move(callback).Run(response != nullptr);
27 }
28 
29 // The WilcoDtcSupportdClient implementation used in production.
30 class WilcoDtcSupportdClientImpl final : public WilcoDtcSupportdClient {
31  public:
32   WilcoDtcSupportdClientImpl();
33   ~WilcoDtcSupportdClientImpl() override;
34 
35   // WilcoDtcSupportdClient overrides:
36   void WaitForServiceToBeAvailable(
37       WaitForServiceToBeAvailableCallback callback) override;
38   void BootstrapMojoConnection(base::ScopedFD fd,
39                                VoidDBusMethodCallback callback) override;
40   void Init(dbus::Bus* bus) override;
41 
42  private:
43   dbus::ObjectProxy* wilco_dtc_supportd_proxy_ = nullptr;
44 
45   base::WeakPtrFactory<WilcoDtcSupportdClientImpl> weak_ptr_factory_{this};
46 
47   DISALLOW_COPY_AND_ASSIGN(WilcoDtcSupportdClientImpl);
48 };
49 
50 WilcoDtcSupportdClientImpl::WilcoDtcSupportdClientImpl() = default;
51 
52 WilcoDtcSupportdClientImpl::~WilcoDtcSupportdClientImpl() = default;
53 
WaitForServiceToBeAvailable(WaitForServiceToBeAvailableCallback callback)54 void WilcoDtcSupportdClientImpl::WaitForServiceToBeAvailable(
55     WaitForServiceToBeAvailableCallback callback) {
56   wilco_dtc_supportd_proxy_->WaitForServiceToBeAvailable(std::move(callback));
57 }
58 
BootstrapMojoConnection(base::ScopedFD fd,VoidDBusMethodCallback callback)59 void WilcoDtcSupportdClientImpl::BootstrapMojoConnection(
60     base::ScopedFD fd,
61     VoidDBusMethodCallback callback) {
62   dbus::MethodCall method_call(
63       ::diagnostics::kWilcoDtcSupportdServiceInterface,
64       ::diagnostics::kWilcoDtcSupportdBootstrapMojoConnectionMethod);
65   dbus::MessageWriter writer(&method_call);
66   writer.AppendFileDescriptor(fd.get());
67   wilco_dtc_supportd_proxy_->CallMethod(
68       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
69       base::BindOnce(&OnVoidDBusMethod, std::move(callback)));
70 }
71 
Init(dbus::Bus * bus)72 void WilcoDtcSupportdClientImpl::Init(dbus::Bus* bus) {
73   wilco_dtc_supportd_proxy_ = bus->GetObjectProxy(
74       ::diagnostics::kWilcoDtcSupportdServiceName,
75       dbus::ObjectPath(::diagnostics::kWilcoDtcSupportdServicePath));
76 }
77 
78 }  // namespace
79 
WilcoDtcSupportdClient()80 WilcoDtcSupportdClient::WilcoDtcSupportdClient() {
81   DCHECK(!g_instance);
82   g_instance = this;
83 }
84 
~WilcoDtcSupportdClient()85 WilcoDtcSupportdClient::~WilcoDtcSupportdClient() {
86   DCHECK_EQ(this, g_instance);
87   g_instance = nullptr;
88 }
89 
90 // static
Initialize(dbus::Bus * bus)91 void WilcoDtcSupportdClient::Initialize(dbus::Bus* bus) {
92   DCHECK(bus);
93 #if defined(OS_CHROMEOS)
94   if (base::FeatureList::IsEnabled(::features::kWilcoDtc)) {
95     (new WilcoDtcSupportdClientImpl())->Init(bus);
96   }
97 #endif
98 }
99 
100 // static
InitializeFake()101 void WilcoDtcSupportdClient::InitializeFake() {
102   new FakeWilcoDtcSupportdClient();
103 }
104 
105 // static
Shutdown()106 void WilcoDtcSupportdClient::Shutdown() {
107   if (g_instance)
108     delete g_instance;
109 }
110 
111 // static
IsInitialized()112 bool WilcoDtcSupportdClient::IsInitialized() {
113   return g_instance;
114 }
115 
116 // static
Get()117 WilcoDtcSupportdClient* WilcoDtcSupportdClient::Get() {
118   CHECK(IsInitialized());
119   return g_instance;
120 }
121 
122 }  // namespace chromeos
123