blob: 1799438e3ee03ff19c94f4949f4293d06c7d1909 [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
Kyeongkab.Nam500ca132019-06-26 13:48:07 +090019#include <android-base/unique_fd.h>
Alex Deymof8bfcff2016-02-02 21:22:11 -080020#include <base/bind.h>
21#include <base/logging.h>
22#include <binderwrapper/binder_wrapper.h>
23#include <brillo/errors/error.h>
24#include <utils/String8.h>
25
Kyeongkab.Nam500ca132019-06-26 13:48:07 +090026using android::base::unique_fd;
Casey Dahlina93cd532016-01-14 16:55:11 -080027using android::binder::Status;
28using android::os::IUpdateEngineCallback;
Kyeongkab.Nam500ca132019-06-26 13:48:07 +090029using std::string;
30using std::vector;
Aaron Wood7f92e2b2017-08-28 14:51:21 -070031using update_engine::UpdateEngineStatus;
Alex Deymof8bfcff2016-02-02 21:22:11 -080032
33namespace {
34Status ErrorPtrToStatus(const brillo::ErrorPtr& error) {
35 return Status::fromServiceSpecificError(
36 1, android::String8{error->GetMessage().c_str()});
37}
38} // namespace
Casey Dahlina93cd532016-01-14 16:55:11 -080039
40namespace chromeos_update_engine {
41
Alex Deymofa78f142016-01-26 21:36:16 -080042BinderUpdateEngineAndroidService::BinderUpdateEngineAndroidService(
Alex Deymof8bfcff2016-02-02 21:22:11 -080043 ServiceDelegateAndroidInterface* service_delegate)
Amin Hassani7cc8bb02019-01-14 16:29:47 -080044 : service_delegate_(service_delegate) {}
Alex Deymofa78f142016-01-26 21:36:16 -080045
46void BinderUpdateEngineAndroidService::SendStatusUpdate(
Aaron Wood7f92e2b2017-08-28 14:51:21 -070047 const UpdateEngineStatus& update_engine_status) {
48 last_status_ = static_cast<int>(update_engine_status.status);
49 last_progress_ = update_engine_status.progress;
Alex Deymof8bfcff2016-02-02 21:22:11 -080050 for (auto& callback : callbacks_) {
Alex Deymo0e061ae2016-02-09 17:49:03 -080051 callback->onStatusUpdate(last_status_, last_progress_);
Alex Deymof8bfcff2016-02-02 21:22:11 -080052 }
53}
54
55void BinderUpdateEngineAndroidService::SendPayloadApplicationComplete(
56 ErrorCode error_code) {
57 for (auto& callback : callbacks_) {
58 callback->onPayloadApplicationComplete(static_cast<int>(error_code));
59 }
Alex Deymofa78f142016-01-26 21:36:16 -080060}
61
Alex Deymoe97b39c2016-01-20 13:22:17 -080062Status BinderUpdateEngineAndroidService::bind(
Alex Deymof8bfcff2016-02-02 21:22:11 -080063 const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
64 callbacks_.emplace_back(callback);
65
Sen Jiangb7f73802017-07-18 15:29:26 -070066 const android::sp<IBinder>& callback_binder =
67 IUpdateEngineCallback::asBinder(callback);
Alex Deymof8bfcff2016-02-02 21:22:11 -080068 auto binder_wrapper = android::BinderWrapper::Get();
69 binder_wrapper->RegisterForDeathNotifications(
Sen Jiangb7f73802017-07-18 15:29:26 -070070 callback_binder,
Sen Jiang5caab192017-07-07 17:22:29 -070071 base::Bind(
72 base::IgnoreResult(&BinderUpdateEngineAndroidService::UnbindCallback),
73 base::Unretained(this),
Sen Jiangb7f73802017-07-18 15:29:26 -070074 base::Unretained(callback_binder.get())));
Alex Deymof8bfcff2016-02-02 21:22:11 -080075
Alex Deymo0e061ae2016-02-09 17:49:03 -080076 // Send an status update on connection (except when no update sent so far),
77 // since the status update is oneway and we don't need to wait for the
78 // response.
79 if (last_status_ != -1)
80 callback->onStatusUpdate(last_status_, last_progress_);
81
Casey Dahlina93cd532016-01-14 16:55:11 -080082 *return_value = true;
83 return Status::ok();
84}
85
Sen Jiang5caab192017-07-07 17:22:29 -070086Status BinderUpdateEngineAndroidService::unbind(
87 const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
Sen Jiangb7f73802017-07-18 15:29:26 -070088 const android::sp<IBinder>& callback_binder =
89 IUpdateEngineCallback::asBinder(callback);
Sen Jiang5caab192017-07-07 17:22:29 -070090 auto binder_wrapper = android::BinderWrapper::Get();
Sen Jiangb7f73802017-07-18 15:29:26 -070091 binder_wrapper->UnregisterForDeathNotifications(callback_binder);
Sen Jiang5caab192017-07-07 17:22:29 -070092
Sen Jiangb7f73802017-07-18 15:29:26 -070093 *return_value = UnbindCallback(callback_binder.get());
Sen Jiang5caab192017-07-07 17:22:29 -070094 return Status::ok();
95}
96
Alex Deymoe97b39c2016-01-20 13:22:17 -080097Status BinderUpdateEngineAndroidService::applyPayload(
Alex Deymof8bfcff2016-02-02 21:22:11 -080098 const android::String16& url,
Alex Deymo95b8f242016-01-28 16:06:57 -080099 int64_t payload_offset,
100 int64_t payload_size,
Kyeongkab.Nam500ca132019-06-26 13:48:07 +0900101 const vector<android::String16>& header_kv_pairs) {
102 const string payload_url{android::String8{url}.string()};
103 vector<string> str_headers;
Alex Deymof8bfcff2016-02-02 21:22:11 -0800104 str_headers.reserve(header_kv_pairs.size());
105 for (const auto& header : header_kv_pairs) {
106 str_headers.emplace_back(android::String8{header}.string());
107 }
108
109 brillo::ErrorPtr error;
110 if (!service_delegate_->ApplyPayload(
111 payload_url, payload_offset, payload_size, str_headers, &error)) {
112 return ErrorPtrToStatus(error);
113 }
Casey Dahlina93cd532016-01-14 16:55:11 -0800114 return Status::ok();
115}
116
Kyeongkab.Nam500ca132019-06-26 13:48:07 +0900117Status BinderUpdateEngineAndroidService::applyPayloadFd(
118 const ::android::base::unique_fd& fd,
119 int64_t payload_offset,
120 int64_t payload_size,
121 const vector<android::String16>& header_kv_pairs) {
122 vector<string> str_headers;
123 str_headers.reserve(header_kv_pairs.size());
124 for (const auto& header : header_kv_pairs) {
125 str_headers.emplace_back(android::String8{header}.string());
126 }
127
128 brillo::ErrorPtr error;
129 if (!service_delegate_->ApplyPayload(
130 fd.get(), payload_offset, payload_size, str_headers, &error)) {
131 return ErrorPtrToStatus(error);
132 }
133 return Status::ok();
134}
135
Alex Deymoe97b39c2016-01-20 13:22:17 -0800136Status BinderUpdateEngineAndroidService::suspend() {
Alex Deymof8bfcff2016-02-02 21:22:11 -0800137 brillo::ErrorPtr error;
138 if (!service_delegate_->SuspendUpdate(&error))
139 return ErrorPtrToStatus(error);
Casey Dahlina93cd532016-01-14 16:55:11 -0800140 return Status::ok();
141}
142
Alex Deymoe97b39c2016-01-20 13:22:17 -0800143Status BinderUpdateEngineAndroidService::resume() {
Alex Deymof8bfcff2016-02-02 21:22:11 -0800144 brillo::ErrorPtr error;
145 if (!service_delegate_->ResumeUpdate(&error))
146 return ErrorPtrToStatus(error);
Casey Dahlina93cd532016-01-14 16:55:11 -0800147 return Status::ok();
148}
149
Alex Deymoe97b39c2016-01-20 13:22:17 -0800150Status BinderUpdateEngineAndroidService::cancel() {
Alex Deymof8bfcff2016-02-02 21:22:11 -0800151 brillo::ErrorPtr error;
152 if (!service_delegate_->CancelUpdate(&error))
153 return ErrorPtrToStatus(error);
Casey Dahlina93cd532016-01-14 16:55:11 -0800154 return Status::ok();
155}
156
Alex Deymo3b678db2016-02-09 11:50:06 -0800157Status BinderUpdateEngineAndroidService::resetStatus() {
158 brillo::ErrorPtr error;
159 if (!service_delegate_->ResetStatus(&error))
160 return ErrorPtrToStatus(error);
161 return Status::ok();
162}
163
Tao Bao20c96722018-01-09 22:38:57 -0800164Status BinderUpdateEngineAndroidService::verifyPayloadApplicable(
165 const android::String16& metadata_filename, bool* return_value) {
166 const std::string payload_metadata{
167 android::String8{metadata_filename}.string()};
168 LOG(INFO) << "Received a request of verifying payload metadata in "
169 << payload_metadata << ".";
Sen Jiang28d8ed92018-02-01 13:46:39 -0800170 brillo::ErrorPtr error;
171 *return_value =
172 service_delegate_->VerifyPayloadApplicable(payload_metadata, &error);
173 if (error != nullptr)
174 return ErrorPtrToStatus(error);
Tao Bao20c96722018-01-09 22:38:57 -0800175 return Status::ok();
176}
177
Sen Jiangb7f73802017-07-18 15:29:26 -0700178bool BinderUpdateEngineAndroidService::UnbindCallback(const IBinder* callback) {
179 auto it = std::find_if(
180 callbacks_.begin(),
181 callbacks_.end(),
182 [&callback](const android::sp<IUpdateEngineCallback>& elem) {
183 return IUpdateEngineCallback::asBinder(elem).get() == callback;
184 });
Alex Deymof8bfcff2016-02-02 21:22:11 -0800185 if (it == callbacks_.end()) {
Sen Jiang5caab192017-07-07 17:22:29 -0700186 LOG(ERROR) << "Unable to unbind unknown callback.";
187 return false;
Alex Deymof8bfcff2016-02-02 21:22:11 -0800188 }
189 callbacks_.erase(it);
Sen Jiang5caab192017-07-07 17:22:29 -0700190 return true;
Alex Deymof8bfcff2016-02-02 21:22:11 -0800191}
192
Casey Dahlina93cd532016-01-14 16:55:11 -0800193} // namespace chromeos_update_engine