blob: 88bc1f2deff00b41638d8ffd6de021771b90ca8b [file] [log] [blame]
Casey Dahlina93cd532016-01-14 16:55:11 -08001//
2// Copyright (C) 2015 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#include "update_engine/binder_service_android.h"
18
Alex Deymof8bfcff2016-02-02 21:22:11 -080019#include <base/bind.h>
20#include <base/logging.h>
21#include <binderwrapper/binder_wrapper.h>
22#include <brillo/errors/error.h>
23#include <utils/String8.h>
24
Casey Dahlina93cd532016-01-14 16:55:11 -080025using android::binder::Status;
26using android::os::IUpdateEngineCallback;
Kyeongkab.Nam42132992019-10-03 18:04:02 +090027using android::os::ParcelFileDescriptor;
Kyeongkab.Nam500ca132019-06-26 13:48:07 +090028using std::string;
29using std::vector;
Aaron Wood7f92e2b2017-08-28 14:51:21 -070030using update_engine::UpdateEngineStatus;
Alex Deymof8bfcff2016-02-02 21:22:11 -080031
32namespace {
33Status ErrorPtrToStatus(const brillo::ErrorPtr& error) {
34 return Status::fromServiceSpecificError(
35 1, android::String8{error->GetMessage().c_str()});
36}
37} // namespace
Casey Dahlina93cd532016-01-14 16:55:11 -080038
39namespace chromeos_update_engine {
40
Alex Deymofa78f142016-01-26 21:36:16 -080041BinderUpdateEngineAndroidService::BinderUpdateEngineAndroidService(
Alex Deymof8bfcff2016-02-02 21:22:11 -080042 ServiceDelegateAndroidInterface* service_delegate)
Amin Hassani7cc8bb02019-01-14 16:29:47 -080043 : service_delegate_(service_delegate) {}
Alex Deymofa78f142016-01-26 21:36:16 -080044
45void BinderUpdateEngineAndroidService::SendStatusUpdate(
Aaron Wood7f92e2b2017-08-28 14:51:21 -070046 const UpdateEngineStatus& update_engine_status) {
47 last_status_ = static_cast<int>(update_engine_status.status);
48 last_progress_ = update_engine_status.progress;
Alex Deymof8bfcff2016-02-02 21:22:11 -080049 for (auto& callback : callbacks_) {
Alex Deymo0e061ae2016-02-09 17:49:03 -080050 callback->onStatusUpdate(last_status_, last_progress_);
Alex Deymof8bfcff2016-02-02 21:22:11 -080051 }
52}
53
54void BinderUpdateEngineAndroidService::SendPayloadApplicationComplete(
55 ErrorCode error_code) {
56 for (auto& callback : callbacks_) {
57 callback->onPayloadApplicationComplete(static_cast<int>(error_code));
58 }
Alex Deymofa78f142016-01-26 21:36:16 -080059}
60
Alex Deymoe97b39c2016-01-20 13:22:17 -080061Status BinderUpdateEngineAndroidService::bind(
Alex Deymof8bfcff2016-02-02 21:22:11 -080062 const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
63 callbacks_.emplace_back(callback);
64
Sen Jiangb7f73802017-07-18 15:29:26 -070065 const android::sp<IBinder>& callback_binder =
66 IUpdateEngineCallback::asBinder(callback);
Alex Deymof8bfcff2016-02-02 21:22:11 -080067 auto binder_wrapper = android::BinderWrapper::Get();
68 binder_wrapper->RegisterForDeathNotifications(
Sen Jiangb7f73802017-07-18 15:29:26 -070069 callback_binder,
Sen Jiang5caab192017-07-07 17:22:29 -070070 base::Bind(
71 base::IgnoreResult(&BinderUpdateEngineAndroidService::UnbindCallback),
72 base::Unretained(this),
Sen Jiangb7f73802017-07-18 15:29:26 -070073 base::Unretained(callback_binder.get())));
Alex Deymof8bfcff2016-02-02 21:22:11 -080074
Alex Deymo0e061ae2016-02-09 17:49:03 -080075 // Send an status update on connection (except when no update sent so far),
76 // since the status update is oneway and we don't need to wait for the
77 // response.
78 if (last_status_ != -1)
79 callback->onStatusUpdate(last_status_, last_progress_);
80
Casey Dahlina93cd532016-01-14 16:55:11 -080081 *return_value = true;
82 return Status::ok();
83}
84
Sen Jiang5caab192017-07-07 17:22:29 -070085Status BinderUpdateEngineAndroidService::unbind(
86 const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
Sen Jiangb7f73802017-07-18 15:29:26 -070087 const android::sp<IBinder>& callback_binder =
88 IUpdateEngineCallback::asBinder(callback);
Sen Jiang5caab192017-07-07 17:22:29 -070089 auto binder_wrapper = android::BinderWrapper::Get();
Sen Jiangb7f73802017-07-18 15:29:26 -070090 binder_wrapper->UnregisterForDeathNotifications(callback_binder);
Sen Jiang5caab192017-07-07 17:22:29 -070091
Sen Jiangb7f73802017-07-18 15:29:26 -070092 *return_value = UnbindCallback(callback_binder.get());
Sen Jiang5caab192017-07-07 17:22:29 -070093 return Status::ok();
94}
95
Alex Deymoe97b39c2016-01-20 13:22:17 -080096Status BinderUpdateEngineAndroidService::applyPayload(
Alex Deymof8bfcff2016-02-02 21:22:11 -080097 const android::String16& url,
Alex Deymo95b8f242016-01-28 16:06:57 -080098 int64_t payload_offset,
99 int64_t payload_size,
Kyeongkab.Nam500ca132019-06-26 13:48:07 +0900100 const vector<android::String16>& header_kv_pairs) {
101 const string payload_url{android::String8{url}.string()};
102 vector<string> str_headers;
Alex Deymof8bfcff2016-02-02 21:22:11 -0800103 str_headers.reserve(header_kv_pairs.size());
104 for (const auto& header : header_kv_pairs) {
105 str_headers.emplace_back(android::String8{header}.string());
106 }
107
108 brillo::ErrorPtr error;
109 if (!service_delegate_->ApplyPayload(
110 payload_url, payload_offset, payload_size, str_headers, &error)) {
111 return ErrorPtrToStatus(error);
112 }
Casey Dahlina93cd532016-01-14 16:55:11 -0800113 return Status::ok();
114}
115
Kyeongkab.Nam500ca132019-06-26 13:48:07 +0900116Status BinderUpdateEngineAndroidService::applyPayloadFd(
Kyeongkab.Nam42132992019-10-03 18:04:02 +0900117 const ParcelFileDescriptor& pfd,
Kyeongkab.Nam500ca132019-06-26 13:48:07 +0900118 int64_t payload_offset,
119 int64_t payload_size,
120 const vector<android::String16>& header_kv_pairs) {
121 vector<string> str_headers;
122 str_headers.reserve(header_kv_pairs.size());
123 for (const auto& header : header_kv_pairs) {
124 str_headers.emplace_back(android::String8{header}.string());
125 }
126
127 brillo::ErrorPtr error;
128 if (!service_delegate_->ApplyPayload(
Kyeongkab.Nam42132992019-10-03 18:04:02 +0900129 pfd.get(), payload_offset, payload_size, str_headers, &error)) {
Kyeongkab.Nam500ca132019-06-26 13:48:07 +0900130 return ErrorPtrToStatus(error);
131 }
132 return Status::ok();
133}
134
Alex Deymoe97b39c2016-01-20 13:22:17 -0800135Status BinderUpdateEngineAndroidService::suspend() {
Alex Deymof8bfcff2016-02-02 21:22:11 -0800136 brillo::ErrorPtr error;
137 if (!service_delegate_->SuspendUpdate(&error))
138 return ErrorPtrToStatus(error);
Casey Dahlina93cd532016-01-14 16:55:11 -0800139 return Status::ok();
140}
141
Alex Deymoe97b39c2016-01-20 13:22:17 -0800142Status BinderUpdateEngineAndroidService::resume() {
Alex Deymof8bfcff2016-02-02 21:22:11 -0800143 brillo::ErrorPtr error;
144 if (!service_delegate_->ResumeUpdate(&error))
145 return ErrorPtrToStatus(error);
Casey Dahlina93cd532016-01-14 16:55:11 -0800146 return Status::ok();
147}
148
Alex Deymoe97b39c2016-01-20 13:22:17 -0800149Status BinderUpdateEngineAndroidService::cancel() {
Alex Deymof8bfcff2016-02-02 21:22:11 -0800150 brillo::ErrorPtr error;
151 if (!service_delegate_->CancelUpdate(&error))
152 return ErrorPtrToStatus(error);
Casey Dahlina93cd532016-01-14 16:55:11 -0800153 return Status::ok();
154}
155
Alex Deymo3b678db2016-02-09 11:50:06 -0800156Status BinderUpdateEngineAndroidService::resetStatus() {
157 brillo::ErrorPtr error;
158 if (!service_delegate_->ResetStatus(&error))
159 return ErrorPtrToStatus(error);
160 return Status::ok();
161}
162
Tao Bao20c96722018-01-09 22:38:57 -0800163Status BinderUpdateEngineAndroidService::verifyPayloadApplicable(
164 const android::String16& metadata_filename, bool* return_value) {
165 const std::string payload_metadata{
166 android::String8{metadata_filename}.string()};
167 LOG(INFO) << "Received a request of verifying payload metadata in "
168 << payload_metadata << ".";
Sen Jiang28d8ed92018-02-01 13:46:39 -0800169 brillo::ErrorPtr error;
170 *return_value =
171 service_delegate_->VerifyPayloadApplicable(payload_metadata, &error);
172 if (error != nullptr)
173 return ErrorPtrToStatus(error);
Tao Bao20c96722018-01-09 22:38:57 -0800174 return Status::ok();
175}
176
Sen Jiangb7f73802017-07-18 15:29:26 -0700177bool BinderUpdateEngineAndroidService::UnbindCallback(const IBinder* callback) {
178 auto it = std::find_if(
179 callbacks_.begin(),
180 callbacks_.end(),
181 [&callback](const android::sp<IUpdateEngineCallback>& elem) {
182 return IUpdateEngineCallback::asBinder(elem).get() == callback;
183 });
Alex Deymof8bfcff2016-02-02 21:22:11 -0800184 if (it == callbacks_.end()) {
Sen Jiang5caab192017-07-07 17:22:29 -0700185 LOG(ERROR) << "Unable to unbind unknown callback.";
186 return false;
Alex Deymof8bfcff2016-02-02 21:22:11 -0800187 }
188 callbacks_.erase(it);
Sen Jiang5caab192017-07-07 17:22:29 -0700189 return true;
Alex Deymof8bfcff2016-02-02 21:22:11 -0800190}
191
Casey Dahlina93cd532016-01-14 16:55:11 -0800192} // namespace chromeos_update_engine