blob: 9950673c42305c2ea07d3067afaa5f5b605fef75 [file] [log] [blame]
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -08001// Copyright 2015 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.
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070014
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080015#include "libweaved/command.h"
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070016
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080017#include "android/weave/IWeaveCommand.h"
18#include "common/binder_utils.h"
19#include "common/data_conversion.h"
20
21using weaved::binder_utils::ParseDictionary;
22using weaved::binder_utils::ToString;
23using weaved::binder_utils::ToString16;
24using weaved::binder_utils::StatusToError;
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070025
26namespace weaved {
27
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080028Command::Command(const android::sp<android::weave::IWeaveCommand>& proxy)
29 : binder_proxy_{proxy} {}
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070030
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080031Command::~Command() {}
32
33std::string Command::GetID() const {
34 std::string id;
35 android::String16 id16;
36 if (binder_proxy_->getId(&id16).isOk())
37 id.assign(ToString(id16));
38 return id;
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070039}
40
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080041std::string Command::GetName() const {
42 std::string name;
43 android::String16 name16;
44 if (binder_proxy_->getId(&name16).isOk())
45 name.assign(ToString(name16));
46 return name;
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070047}
48
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080049std::string Command::GetComponent() const {
50 std::string component;
51 android::String16 component16;
52 if (binder_proxy_->getId(&component16).isOk())
53 component.assign(ToString(component16));
54 return component;
Alex Vakulenko3bd3ece2015-12-09 12:29:01 -080055}
56
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070057Command::State Command::GetState() const {
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080058 std::string state;
59 android::String16 state16;
60 if (binder_proxy_->getState(&state16).isOk())
61 state.assign(ToString(state16));
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070062 if (state == "queued")
63 return Command::State::kQueued;
64 else if (state == "inProgress")
65 return Command::State::kInProgress;
66 else if (state == "paused")
67 return Command::State::kPaused;
68 else if (state == "error")
69 return Command::State::kError;
70 else if (state == "done")
71 return Command::State::kDone;
72 else if (state == "cancelled")
73 return Command::State::kCancelled;
74 else if (state == "aborted")
75 return Command::State::kAborted;
76 else if (state == "expired")
77 return Command::State::kExpired;
78 LOG(WARNING) << "Unknown command state: " << state;
79 return Command::State::kQueued;
80}
81
82Command::Origin Command::GetOrigin() const {
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080083 std::string origin;
84 android::String16 origin16;
85 if (binder_proxy_->getState(&origin16).isOk())
86 origin.assign(ToString(origin16));
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -070087 if (origin == "local")
88 return Command::Origin::kLocal;
89 else if (origin == "cloud")
90 return Command::Origin::kCloud;
91 LOG(WARNING) << "Unknown command origin: " << origin;
92 return Command::Origin::kLocal;
93}
94
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -080095brillo::VariantDictionary Command::GetParameters() const {
96 brillo::VariantDictionary params;
97 android::String16 params_string16;
98 if (binder_proxy_->getParameters(&params_string16).isOk()) {
99 std::unique_ptr<base::DictionaryValue> dict;
100 if (ParseDictionary(params_string16, &dict).isOk())
101 params = details::DictionaryValueToVariantDictionary(*dict);
102 }
103 return params;
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -0700104}
105
Alex Vakulenko41705852015-10-13 10:12:06 -0700106bool Command::SetProgress(const brillo::VariantDictionary& progress,
107 brillo::ErrorPtr* error) {
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -0800108 auto dict = details::VariantDictionaryToDictionaryValue(progress, error);
109 return dict && StatusToError(binder_proxy_->setProgress(ToString16(*dict)),
110 error);
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -0700111}
112
Alex Vakulenko41705852015-10-13 10:12:06 -0700113bool Command::Complete(const brillo::VariantDictionary& results,
114 brillo::ErrorPtr* error) {
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -0800115 auto dict = details::VariantDictionaryToDictionaryValue(results, error);
116 return dict && StatusToError(binder_proxy_->complete(ToString16(*dict)),
117 error);
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -0700118}
119
120bool Command::Abort(const std::string& error_code,
121 const std::string& error_message,
Alex Vakulenko41705852015-10-13 10:12:06 -0700122 brillo::ErrorPtr* error) {
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -0800123 return StatusToError(binder_proxy_->abort(ToString16(error_code),
124 ToString16(error_message)),
125 error);
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -0700126}
127
Alex Vakulenko41705852015-10-13 10:12:06 -0700128bool Command::Cancel(brillo::ErrorPtr* error) {
Alex Vakulenkoae29f7d2015-12-21 16:30:37 -0800129 return StatusToError(binder_proxy_->cancel(), error);
Alex Vakulenkoabbcdea2015-10-09 19:33:15 -0700130}
131
132} // namespace weave