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