1 // Copyright 2020 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 "chromeos/dbus/cdm_factory_daemon/cdm_factory_daemon_client.h"
5
6 #include <utility>
7
8 #include "base/bind.h"
9 #include "base/location.h"
10 #include "base/memory/weak_ptr.h"
11 #include "base/optional.h"
12 #include "base/threading/thread_task_runner_handle.h"
13 #include "chromeos/dbus/cdm_factory_daemon/fake_cdm_factory_daemon_client.h"
14 #include "dbus/bus.h"
15 #include "dbus/message.h"
16 #include "dbus/object_proxy.h"
17 #include "third_party/cros_system_api/dbus/service_constants.h"
18
19 namespace chromeos {
20 namespace {
21
22 CdmFactoryDaemonClient* g_instance = nullptr;
23
24 // "Real" implementation of CdmFactoryDaemonClient talking to the
25 // CdmFactoryDaemon on the Chrome OS side.
26 class CdmFactoryDaemonClientImpl : public CdmFactoryDaemonClient {
27 public:
28 CdmFactoryDaemonClientImpl() = default;
29 ~CdmFactoryDaemonClientImpl() override = default;
30
31 // CdmFactoryDaemonClient overrides:
BootstrapMojoConnection(base::ScopedFD fd,base::OnceCallback<void (bool success)> callback)32 void BootstrapMojoConnection(
33 base::ScopedFD fd,
34 base::OnceCallback<void(bool success)> callback) override {
35 dbus::MethodCall method_call(
36 cdm_oemcrypto::kCdmFactoryDaemonServiceInterface,
37 cdm_oemcrypto::kBootstrapCdmFactoryDaemonMojoConnection);
38 dbus::MessageWriter writer(&method_call);
39 writer.AppendFileDescriptor(fd.get());
40 proxy_->CallMethod(
41 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
42 base::BindOnce(&CdmFactoryDaemonClientImpl::OnBootstrap,
43 weak_factory_.GetWeakPtr(), std::move(callback)));
44 }
45
Init(dbus::Bus * bus)46 void Init(dbus::Bus* bus) {
47 proxy_ = bus->GetObjectProxy(
48 cdm_oemcrypto::kCdmFactoryDaemonServiceName,
49 dbus::ObjectPath(cdm_oemcrypto::kCdmFactoryDaemonServicePath));
50 }
51
52 private:
53 // Runs the callback with the method call result.
OnBootstrap(base::OnceCallback<void (bool success)> callback,dbus::Response * response)54 void OnBootstrap(base::OnceCallback<void(bool success)> callback,
55 dbus::Response* response) {
56 std::move(callback).Run(response != nullptr);
57 }
58
59 // D-Bus proxy for the CdmFactoryDaemon, not owned.
60 dbus::ObjectProxy* proxy_ = nullptr;
61
62 base::WeakPtrFactory<CdmFactoryDaemonClientImpl> weak_factory_{this};
63 DISALLOW_COPY_AND_ASSIGN(CdmFactoryDaemonClientImpl);
64 };
65
66 } // namespace
67
CdmFactoryDaemonClient()68 CdmFactoryDaemonClient::CdmFactoryDaemonClient() {
69 CHECK(!g_instance);
70 g_instance = this;
71 }
72
~CdmFactoryDaemonClient()73 CdmFactoryDaemonClient::~CdmFactoryDaemonClient() {
74 CHECK_EQ(this, g_instance);
75 g_instance = nullptr;
76 }
77
78 // static
Initialize(dbus::Bus * bus)79 void CdmFactoryDaemonClient::Initialize(dbus::Bus* bus) {
80 CHECK(bus);
81 (new CdmFactoryDaemonClientImpl())->Init(bus);
82 }
83
84 // static
InitializeFake()85 void CdmFactoryDaemonClient::InitializeFake() {
86 new FakeCdmFactoryDaemonClient();
87 }
88
89 // static
Shutdown()90 void CdmFactoryDaemonClient::Shutdown() {
91 CHECK(g_instance);
92 delete g_instance;
93 }
94
95 // static
Get()96 CdmFactoryDaemonClient* CdmFactoryDaemonClient::Get() {
97 return g_instance;
98 }
99
100 } // namespace chromeos
101