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