1 // 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
22 using weaved::binder_utils::ParseDictionary;
23 using weaved::binder_utils::ToStatus;
24 using weaved::binder_utils::ToString;
25 using weaved::binder_utils::ToString16;
26
27 namespace buffet {
28
29 namespace {
30
ReportDestroyedError()31 android::binder::Status ReportDestroyedError() {
32 return android::binder::Status::fromServiceSpecificError(
33 1, android::String8{"Command has been destroyed"});
34 }
35
36 } // anonymous namespace
37
BinderCommandProxy(const std::weak_ptr<weave::Command> & command)38 BinderCommandProxy::BinderCommandProxy(
39 const std::weak_ptr<weave::Command>& command) : command_{command} {}
40
getId(android::String16 * id)41 android::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
getName(android::String16 * name)49 android::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
getComponent(android::String16 * component)57 android::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
getState(android::String16 * state)66 android::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
getOrigin(android::String16 * origin)74 android::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
getParameters(android::String16 * parameters)83 android::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
getProgress(android::String16 * progress)92 android::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
getResults(android::String16 * results)101 android::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
setProgress(const android::String16 & progress)110 android::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
complete(const android::String16 & results)124 android::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
abort(const android::String16 & errorCode,const android::String16 & errorMessage)138 android::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;
145 weave::Error::AddTo(&command_error, FROM_HERE, ToString(errorCode),
146 ToString(errorMessage));
147 weave::ErrorPtr error;
148 return ToStatus(command->Abort(command_error.get(), &error), &error);
149 }
150
cancel()151 android::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
pause()159 android::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
setError(const android::String16 & errorCode,const android::String16 & errorMessage)167 android::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;
174 weave::Error::AddTo(&command_error, FROM_HERE, ToString(errorCode),
175 ToString(errorMessage));
176 weave::ErrorPtr error;
177 return ToStatus(command->SetError(command_error.get(), &error), &error);
178 }
179
180 } // namespace buffet
181