blob: b0995890469480eea18cc23da871d88af4cfa6d5 [file] [log] [blame]
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -08001// Copyright 2016 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "buffet/binder_command_proxy.h"
16
17#include <weave/enum_to_string.h>
18
19#include "buffet/weave_error_conversion.h"
20#include "common/binder_utils.h"
21
22using weaved::binder_utils::ParseDictionary;
23using weaved::binder_utils::ToStatus;
24using weaved::binder_utils::ToString;
25using weaved::binder_utils::ToString16;
26
27namespace buffet {
28
29namespace {
30
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080031android::binder::Status ReportDestroyedError() {
32 return android::binder::Status::fromServiceSpecificError(
33 1, android::String8{"Command has been destroyed"});
34}
35
36} // anonymous namespace
37
38BinderCommandProxy::BinderCommandProxy(
39 const std::weak_ptr<weave::Command>& command) : command_{command} {}
40
41android::binder::Status BinderCommandProxy::getId(android::String16* id) {
42 auto command = command_.lock();
43 if (!command)
44 return ReportDestroyedError();
45 *id = ToString16(command->GetID());
46 return android::binder::Status::ok();
47}
48
49android::binder::Status BinderCommandProxy::getName(android::String16* name) {
50 auto command = command_.lock();
51 if (!command)
52 return ReportDestroyedError();
53 *name = ToString16(command->GetName());
54 return android::binder::Status::ok();
55}
56
57android::binder::Status BinderCommandProxy::getComponent(
58 android::String16* component) {
59 auto command = command_.lock();
60 if (!command)
61 return ReportDestroyedError();
62 *component = ToString16(command->GetComponent());
63 return android::binder::Status::ok();
64}
65
66android::binder::Status BinderCommandProxy::getState(android::String16* state) {
67 auto command = command_.lock();
68 if (!command)
69 return ReportDestroyedError();
70 *state = ToString16(EnumToString(command->GetState()));
71 return android::binder::Status::ok();
72}
73
74android::binder::Status BinderCommandProxy::getOrigin(
75 android::String16* origin) {
76 auto command = command_.lock();
77 if (!command)
78 return ReportDestroyedError();
79 *origin = ToString16(EnumToString(command->GetOrigin()));
80 return android::binder::Status::ok();
81}
82
83android::binder::Status BinderCommandProxy::getParameters(
84 android::String16* parameters) {
85 auto command = command_.lock();
86 if (!command)
87 return ReportDestroyedError();
88 *parameters = ToString16(command->GetParameters());
89 return android::binder::Status::ok();
90}
91
92android::binder::Status BinderCommandProxy::getProgress(
93 android::String16* progress) {
94 auto command = command_.lock();
95 if (!command)
96 return ReportDestroyedError();
97 *progress = ToString16(command->GetProgress());
98 return android::binder::Status::ok();
99}
100
101android::binder::Status BinderCommandProxy::getResults(
102 android::String16* results) {
103 auto command = command_.lock();
104 if (!command)
105 return ReportDestroyedError();
106 *results = ToString16(command->GetResults());
107 return android::binder::Status::ok();
108}
109
110android::binder::Status BinderCommandProxy::setProgress(
111 const android::String16& progress) {
112 auto command = command_.lock();
113 if (!command)
114 return ReportDestroyedError();
115 std::unique_ptr<base::DictionaryValue> dict;
116 auto status = ParseDictionary(progress, &dict);
117 if (status.isOk()) {
118 weave::ErrorPtr error;
119 status = ToStatus(command->SetProgress(*dict, &error), &error);
120 }
121 return status;
122}
123
124android::binder::Status BinderCommandProxy::complete(
125 const android::String16& results) {
126 auto command = command_.lock();
127 if (!command)
128 return ReportDestroyedError();
129 std::unique_ptr<base::DictionaryValue> dict;
130 auto status = ParseDictionary(results, &dict);
131 if (status.isOk()) {
132 weave::ErrorPtr error;
133 status = ToStatus(command->Complete(*dict, &error), &error);
134 }
135 return status;
136}
137
138android::binder::Status BinderCommandProxy::abort(
139 const android::String16& errorCode,
140 const android::String16& errorMessage) {
141 auto command = command_.lock();
142 if (!command)
143 return ReportDestroyedError();
144 weave::ErrorPtr command_error;
Vitaly Buka34183c12016-01-22 18:30:49 -0800145 weave::Error::AddTo(&command_error, FROM_HERE, ToString(errorCode),
146 ToString(errorMessage));
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -0800147 weave::ErrorPtr error;
148 return ToStatus(command->Abort(command_error.get(), &error), &error);
149}
150
151android::binder::Status BinderCommandProxy::cancel() {
152 auto command = command_.lock();
153 if (!command)
154 return ReportDestroyedError();
155 weave::ErrorPtr error;
156 return ToStatus(command->Cancel(&error), &error);
157}
158
159android::binder::Status BinderCommandProxy::pause() {
160 auto command = command_.lock();
161 if (!command)
162 return ReportDestroyedError();
163 weave::ErrorPtr error;
164 return ToStatus(command->Pause(&error), &error);
165}
166
167android::binder::Status BinderCommandProxy::setError(
168 const android::String16& errorCode,
169 const android::String16& errorMessage) {
170 auto command = command_.lock();
171 if (!command)
172 return ReportDestroyedError();
173 weave::ErrorPtr command_error;
Vitaly Buka34183c12016-01-22 18:30:49 -0800174 weave::Error::AddTo(&command_error, FROM_HERE, ToString(errorCode),
175 ToString(errorMessage));
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -0800176 weave::ErrorPtr error;
177 return ToStatus(command->SetError(command_error.get(), &error), &error);
178}
179
180} // namespace buffet