blob: 1493990880f16856d9b5ce72286870bdb8415ac7 [file] [log] [blame]
kerrnel3a3923882016-11-10 02:59:171// Copyright 2016 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 "chromeos/dbus/image_loader_client.h"
6
Hidehiko Abe676ec872017-09-13 19:17:517#include <utility>
8
kerrnel3a3923882016-11-10 02:59:179#include "base/bind.h"
Hans Wennborg36a58e2372020-06-17 16:57:4310#include "base/logging.h"
kerrnel3a3923882016-11-10 02:59:1711#include "base/macros.h"
Hidehiko Abe676ec872017-09-13 19:17:5112#include "base/optional.h"
kerrnel3a3923882016-11-10 02:59:1713#include "dbus/bus.h"
14#include "dbus/message.h"
15#include "dbus/object_path.h"
16#include "dbus/object_proxy.h"
17#include "third_party/cros_system_api/dbus/service_constants.h"
18
19namespace chromeos {
20
21namespace {
22
23class ImageLoaderClientImpl : public ImageLoaderClient {
24 public:
Chris Watkins2c529d62017-11-29 02:14:4125 ImageLoaderClientImpl() = default;
kerrnel3a3923882016-11-10 02:59:1726
Chris Watkins2c529d62017-11-29 02:14:4127 ~ImageLoaderClientImpl() override = default;
kerrnel3a3923882016-11-10 02:59:1728
29 void RegisterComponent(const std::string& name,
30 const std::string& version,
31 const std::string& component_folder_abs_path,
Hidehiko Abe375ccf5f2017-09-21 18:15:0032 DBusMethodCallback<bool> callback) override {
kerrnel3a3923882016-11-10 02:59:1733 dbus::MethodCall method_call(imageloader::kImageLoaderServiceInterface,
34 imageloader::kRegisterComponent);
35 dbus::MessageWriter writer(&method_call);
36 writer.AppendString(name);
37 writer.AppendString(version);
38 writer.AppendString(component_folder_abs_path);
Hidehiko Abe375ccf5f2017-09-21 18:15:0039 proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
40 base::BindOnce(&ImageLoaderClientImpl::OnBoolMethod,
41 std::move(callback)));
kerrnel3a3923882016-11-10 02:59:1742 }
43
xiaochuc0d16f0b2017-03-08 18:36:3844 void LoadComponent(const std::string& name,
Hidehiko Abe676ec872017-09-13 19:17:5145 DBusMethodCallback<std::string> callback) override {
xiaochuc0d16f0b2017-03-08 18:36:3846 dbus::MethodCall method_call(imageloader::kImageLoaderServiceInterface,
47 imageloader::kLoadComponent);
48 dbus::MessageWriter writer(&method_call);
49 writer.AppendString(name);
Hidehiko Abe1aae63f2017-09-05 13:16:3950 proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
51 base::BindOnce(&ImageLoaderClientImpl::OnStringMethod,
52 std::move(callback)));
xiaochuc0d16f0b2017-03-08 18:36:3853 }
54
Xiaochu Liu0b9fb9982018-01-05 17:15:1855 void LoadComponentAtPath(
56 const std::string& name,
57 const base::FilePath& path,
58 DBusMethodCallback<base::FilePath> callback) override {
Xiaochu Liua8fb3d1f2017-12-05 06:07:0159 dbus::MethodCall method_call(imageloader::kImageLoaderServiceInterface,
60 imageloader::kLoadComponentAtPath);
61 dbus::MessageWriter writer(&method_call);
62 writer.AppendString(name);
63 writer.AppendString(path.value());
64 proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
Xiaochu Liu0b9fb9982018-01-05 17:15:1865 base::BindOnce(&ImageLoaderClientImpl::OnFilePathMethod,
Xiaochu Liua8fb3d1f2017-12-05 06:07:0166 std::move(callback)));
67 }
68
Xiaochu Liu5decf8032017-10-27 16:50:3869 void RemoveComponent(const std::string& name,
70 DBusMethodCallback<bool> callback) override {
71 dbus::MethodCall method_call(imageloader::kImageLoaderServiceInterface,
72 imageloader::kRemoveComponent);
73 dbus::MessageWriter writer(&method_call);
74 writer.AppendString(name);
75 proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
76 base::BindOnce(&ImageLoaderClientImpl::OnBoolMethod,
77 std::move(callback)));
78 }
79
Hidehiko Abe676ec872017-09-13 19:17:5180 void RequestComponentVersion(
81 const std::string& name,
82 DBusMethodCallback<std::string> callback) override {
xiaochuc45767a42017-03-21 22:25:5883 dbus::MethodCall method_call(imageloader::kImageLoaderServiceInterface,
84 imageloader::kGetComponentVersion);
85 dbus::MessageWriter writer(&method_call);
86 writer.AppendString(name);
Hidehiko Abe1aae63f2017-09-05 13:16:3987 proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
88 base::BindOnce(&ImageLoaderClientImpl::OnStringMethod,
89 std::move(callback)));
xiaochuc45767a42017-03-21 22:25:5890 }
91
Xiaochu Liub993da9d2017-12-08 23:13:0292 void UnmountComponent(const std::string& name,
93 DBusMethodCallback<bool> callback) override {
94 dbus::MethodCall method_call(imageloader::kImageLoaderServiceInterface,
95 imageloader::kUnmountComponent);
96 dbus::MessageWriter writer(&method_call);
97 writer.AppendString(name);
98 proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
99 base::BindOnce(&ImageLoaderClientImpl::OnBoolMethod,
100 std::move(callback)));
101 }
102
kerrnel3a3923882016-11-10 02:59:17103 protected:
104 // DBusClient override.
105 void Init(dbus::Bus* bus) override {
106 proxy_ = bus->GetObjectProxy(
107 imageloader::kImageLoaderServiceName,
108 dbus::ObjectPath(imageloader::kImageLoaderServicePath));
109 }
110
111 private:
Hidehiko Abe375ccf5f2017-09-21 18:15:00112 static void OnBoolMethod(DBusMethodCallback<bool> callback,
kerrnel3a3923882016-11-10 02:59:17113 dbus::Response* response) {
114 if (!response) {
Hidehiko Abe375ccf5f2017-09-21 18:15:00115 std::move(callback).Run(base::nullopt);
kerrnel3a3923882016-11-10 02:59:17116 return;
117 }
118 dbus::MessageReader reader(response);
119 bool result = false;
120 if (!reader.PopBool(&result)) {
kerrnel3a3923882016-11-10 02:59:17121 LOG(ERROR) << "Invalid response: " << response->ToString();
Hidehiko Abe375ccf5f2017-09-21 18:15:00122 std::move(callback).Run(base::nullopt);
kerrnel3a3923882016-11-10 02:59:17123 return;
124 }
Hidehiko Abe375ccf5f2017-09-21 18:15:00125 std::move(callback).Run(result);
kerrnel3a3923882016-11-10 02:59:17126 }
127
Hidehiko Abe676ec872017-09-13 19:17:51128 static void OnStringMethod(DBusMethodCallback<std::string> callback,
xiaochuc0d16f0b2017-03-08 18:36:38129 dbus::Response* response) {
130 if (!response) {
Hidehiko Abe676ec872017-09-13 19:17:51131 std::move(callback).Run(base::nullopt);
xiaochuc0d16f0b2017-03-08 18:36:38132 return;
133 }
134 dbus::MessageReader reader(response);
135 std::string result;
136 if (!reader.PopString(&result)) {
Hidehiko Abe676ec872017-09-13 19:17:51137 std::move(callback).Run(base::nullopt);
xiaochuc0d16f0b2017-03-08 18:36:38138 LOG(ERROR) << "Invalid response: " << response->ToString();
139 return;
140 }
Hidehiko Abe676ec872017-09-13 19:17:51141 std::move(callback).Run(std::move(result));
xiaochuc0d16f0b2017-03-08 18:36:38142 }
143
Xiaochu Liu0b9fb9982018-01-05 17:15:18144 static void OnFilePathMethod(DBusMethodCallback<base::FilePath> callback,
145 dbus::Response* response) {
146 if (!response) {
147 std::move(callback).Run(base::nullopt);
148 return;
149 }
150 dbus::MessageReader reader(response);
151 std::string result;
152 if (!reader.PopString(&result)) {
153 std::move(callback).Run(base::nullopt);
154 LOG(ERROR) << "Invalid response: " << response->ToString();
155 return;
156 }
157 std::move(callback).Run(base::FilePath(std::move(result)));
158 }
159
kerrnel3a3923882016-11-10 02:59:17160 dbus::ObjectProxy* proxy_ = nullptr;
161
162 DISALLOW_COPY_AND_ASSIGN(ImageLoaderClientImpl);
163};
164
165} // namespace
166
Chris Watkins2c529d62017-11-29 02:14:41167ImageLoaderClient::ImageLoaderClient() = default;
kerrnel3a3923882016-11-10 02:59:17168
Chris Watkins2c529d62017-11-29 02:14:41169ImageLoaderClient::~ImageLoaderClient() = default;
kerrnel3a3923882016-11-10 02:59:17170
171// static
Ryo Hashimoto296efeee2019-04-22 07:17:47172std::unique_ptr<ImageLoaderClient> ImageLoaderClient::Create() {
173 return std::make_unique<ImageLoaderClientImpl>();
kerrnel3a3923882016-11-10 02:59:17174}
175
176} // namespace chromeos