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