1a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin//
2a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// Copyright (C) 2015 The Android Open Source Project
3a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin//
4a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// Licensed under the Apache License, Version 2.0 (the "License");
5a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// you may not use this file except in compliance with the License.
6a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// You may obtain a copy of the License at
7a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin//
8a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin//      http://www.apache.org/licenses/LICENSE-2.0
9a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin//
10a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// Unless required by applicable law or agreed to in writing, software
11a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// distributed under the License is distributed on an "AS IS" BASIS,
12a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// See the License for the specific language governing permissions and
14a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin// limitations under the License.
15a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin//
16a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
17a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin#include "update_engine/client_library/client_binder.h"
18a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
19a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin#include <binder/IServiceManager.h>
20a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
21a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin#include <base/message_loop/message_loop.h>
22a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin#include <utils/String8.h>
23a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
246ee50b9814f101b5b5c0ae60af1dedf059ad2106Casey Dahlin#include "update_engine/common_service.h"
25a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin#include "update_engine/parcelable_update_engine_status.h"
26a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin#include "update_engine/update_status_utils.h"
27a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
28a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinusing android::OK;
29a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinusing android::String16;
30a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinusing android::String8;
3140892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlinusing android::binder::Status;
32b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymousing android::brillo::ParcelableUpdateEngineStatus;
33a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinusing android::getService;
34a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinusing chromeos_update_engine::StringToUpdateStatus;
356ee50b9814f101b5b5c0ae60af1dedf059ad2106Casey Dahlinusing chromeos_update_engine::UpdateEngineService;
36a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinusing std::string;
37a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
38a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinnamespace update_engine {
39a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinnamespace internal {
40a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
41a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::Init() {
4240892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  if (!binder_watcher_.Init()) return false;
4340892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin
44a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return getService(String16{"android.brillo.UpdateEngineService"},
45a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin      &service_) == OK;
46a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
47a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
48a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::AttemptUpdate(const string& in_app_version,
49a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                                             const string& in_omaha_url,
50a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                                             bool at_user_request) {
51a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return service_->AttemptUpdate(String16{in_app_version.c_str()},
526ee50b9814f101b5b5c0ae60af1dedf059ad2106Casey Dahlin      String16{in_omaha_url.c_str()},
536ee50b9814f101b5b5c0ae60af1dedf059ad2106Casey Dahlin      at_user_request ? 0 :
546ee50b9814f101b5b5c0ae60af1dedf059ad2106Casey Dahlin          UpdateEngineService::kAttemptUpdateFlagNonInteractive).isOk();
55a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
56a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
57a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::GetStatus(int64_t* out_last_checked_time,
58a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                                         double* out_progress,
59a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                                         UpdateStatus* out_update_status,
60a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                                         string* out_new_version,
61a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                                         int64_t* out_new_size) const {
62a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  ParcelableUpdateEngineStatus status;
63a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
64a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  if (!service_->GetStatus(&status).isOk())
65a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    return false;
66a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
67a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  *out_last_checked_time = status.last_checked_time_;
68a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  *out_progress = status.progress_;
69a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  StringToUpdateStatus(String8{status.current_operation_}.string(),
70a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                       out_update_status);
71a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  *out_new_version = String8{status.new_version_}.string();
72a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  *out_new_size = status.new_size_;
73a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return true;
74a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
75a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
765b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymobool BinderUpdateEngineClient::SetCohortHint(const string& in_cohort_hint) {
775b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo  return service_->SetCohortHint(String16{in_cohort_hint.c_str()}).isOk();
785b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo}
795b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo
805b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymobool BinderUpdateEngineClient::GetCohortHint(string* out_cohort_hint) const {
815b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo  String16 out_as_string16;
825b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo
835b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo  if (!service_->GetCohortHint(&out_as_string16).isOk())
845b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo    return false;
855b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo
865b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo  *out_cohort_hint = String8{out_as_string16}.string();
875b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo  return true;
885b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo}
895b5fa8b412312a41cfd4d7ab475b54d4f730ed2aAlex Deymo
90a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::SetUpdateOverCellularPermission(bool allowed) {
91a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return service_->SetUpdateOverCellularPermission(allowed).isOk();
92a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
93a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
94a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::GetUpdateOverCellularPermission(
95a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    bool* allowed) const {
96a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return service_->GetUpdateOverCellularPermission(allowed).isOk();
97a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
98a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
99a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::SetP2PUpdatePermission(bool enabled) {
100a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return service_->SetP2PUpdatePermission(enabled).isOk();
101a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
102a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
103a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::GetP2PUpdatePermission(bool* enabled) const {
104a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return service_->GetP2PUpdatePermission(enabled).isOk();
105a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
106a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
107a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::Rollback(bool powerwash) {
108a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return service_->AttemptRollback(powerwash).isOk();
109a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
110a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
111a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::GetRollbackPartition(
112a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    string* rollback_partition) const {
113a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  String16 out_as_string16;
114a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
115a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  if (!service_->GetRollbackPartition(&out_as_string16).isOk())
116a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    return false;
117a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
118a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  *rollback_partition = String8{out_as_string16}.string();
119a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return true;
120a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
121a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
122a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::GetPrevVersion(string* prev_version) const {
123a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  String16 out_as_string16;
124a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
125a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  if (!service_->GetPrevVersion(&out_as_string16).isOk())
126a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    return false;
127a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
128a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  *prev_version = String8{out_as_string16}.string();
129a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return true;
130a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
131a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
132a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinvoid BinderUpdateEngineClient::RebootIfNeeded() {
133a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  if (!service_->RebootIfNeeded().isOk()) {
134a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    // Reboot error code doesn't necessarily mean that a reboot
135a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    // failed. For example, D-Bus may be shutdown before we receive the
136a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    // result.
137a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    LOG(INFO) << "RebootIfNeeded() failure ignored.";
138a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  }
139a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
140a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
141a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::ResetStatus() {
142a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return service_->ResetStatus().isOk();
143a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
144a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
14540892497a9b1ea124058baf09f5f2873a15cb696Casey DahlinStatus BinderUpdateEngineClient::StatusUpdateCallback::HandleStatusUpdate(
14640892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    int64_t last_checked_time,
14740892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    double progress,
14840892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    const String16& current_operation,
14940892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    const String16& new_version,
15040892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    int64_t new_size) {
15140892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  UpdateStatus update_status;
15240892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin
15340892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  StringToUpdateStatus(String8{current_operation}.string(), &update_status);
15440892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin
15540892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  for (auto& handler : client_->handlers_) {
15640892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    handler->HandleStatusUpdate(last_checked_time, progress, update_status,
15740892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin                                String8{new_version}.string(), new_size);
15840892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  }
15940892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin
16040892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  return Status::ok();
16140892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin}
16240892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin
16340892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlinbool BinderUpdateEngineClient::RegisterStatusUpdateHandler(
164a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    StatusUpdateHandler* handler) {
16540892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  if (!status_callback_.get()) {
16640892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    status_callback_ =
16740892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin        new BinderUpdateEngineClient::StatusUpdateCallback(this);
16840892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    if (!service_->RegisterStatusCallback(status_callback_).isOk()) {
16940892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin      return false;
17040892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin    }
17140892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  }
17240892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin
17340892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  handlers_.push_back(handler);
174a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin
175a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  int64_t last_checked_time;
176a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  double progress;
177a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  UpdateStatus update_status;
178a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  string new_version;
179a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  int64_t new_size;
180a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin
181a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  if (!GetStatus(&last_checked_time, &progress, &update_status,
182a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin                 &new_version, &new_size)) {
183a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin    handler->IPCError("Could not get status from binder service");
184a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  }
185a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin
186a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  handler->HandleStatusUpdate(last_checked_time, progress, update_status,
187a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin                              new_version, new_size);
188a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin
18940892497a9b1ea124058baf09f5f2873a15cb696Casey Dahlin  return true;
190a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
191a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
192a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlinbool BinderUpdateEngineClient::UnregisterStatusUpdateHandler(
193a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin    StatusUpdateHandler* handler) {
194b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  auto it = std::find(handlers_.begin(), handlers_.end(), handler);
195a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  if (it != handlers_.end()) {
196a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin    handlers_.erase(it);
197a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin    return true;
198a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  }
199a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin
200a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin  return false;
201a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin}
202a715f7b8a211b5c4b74206539e9aa7ddacf4b243Casey Dahlin
203a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::SetTargetChannel(const string& in_target_channel,
204a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                                                bool allow_powerwash) {
205a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return service_->SetChannel(String16{in_target_channel.c_str()},
206a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                              allow_powerwash).isOk();
207a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
208a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
209a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::GetTargetChannel(string* out_channel) const {
210a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  String16 out_as_string16;
211a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
212a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  if (!service_->GetChannel(false, &out_as_string16).isOk())
213a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    return false;
214a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
215a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  *out_channel = String8{out_as_string16}.string();
216a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return true;
217a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
218a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
219a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlinbool BinderUpdateEngineClient::GetChannel(string* out_channel) const {
220a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  String16 out_as_string16;
221a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
222a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  if (!service_->GetChannel(true, &out_as_string16).isOk())
223a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin    return false;
224a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
225a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  *out_channel = String8{out_as_string16}.string();
226a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  return true;
227a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}
228a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin
2292997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhaobool BinderUpdateEngineClient::GetLastAttemptError(
2302997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao    int32_t* last_attempt_error) const {
2312997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao  int out_as_int;
2322997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao
2332997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao  if (!service_->GetLastAttemptError(&out_as_int).isOk())
2342997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao    return false;
2352997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao
2362997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao  *last_attempt_error = out_as_int;
2372997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao  return true;
2382997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao}
2392997173235e88c5e4cb13d2844f74afc7b25d6e2Shuqian Zhao
240b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymobool BinderUpdateEngineClient::GetEolStatus(int32_t* eol_status) const {
241b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  int out_as_int;
242b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo
243b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  if (!service_->GetEolStatus(&out_as_int).isOk())
244b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo    return false;
245b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo
246b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  *eol_status = out_as_int;
247b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  return true;
248b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo}
249b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo
250a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}  // namespace internal
251a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin}  // namespace update_engine
252