191 lines
6.5 KiB
C++
191 lines
6.5 KiB
C++
// Copyright 2015 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "libweaved/command.h"
|
|
|
|
#include "android/weave/IWeaveCommand.h"
|
|
#include "common/binder_utils.h"
|
|
|
|
using weaved::binder_utils::ParseDictionary;
|
|
using weaved::binder_utils::ToString;
|
|
using weaved::binder_utils::ToString16;
|
|
using weaved::binder_utils::StatusToError;
|
|
|
|
namespace weaved {
|
|
|
|
namespace {
|
|
|
|
// Converts binder exception code into a weave error code string.
|
|
std::string BinderExceptionString(int32_t exception_code) {
|
|
if (exception_code == android::binder::Status::EX_NONE)
|
|
return "_none";
|
|
else if (exception_code == android::binder::Status::EX_SECURITY)
|
|
return "_security";
|
|
else if (exception_code == android::binder::Status::EX_BAD_PARCELABLE)
|
|
return "_bad_parcelable";
|
|
else if (exception_code == android::binder::Status::EX_ILLEGAL_ARGUMENT)
|
|
return "_illegal_argument";
|
|
else if (exception_code == android::binder::Status::EX_NULL_POINTER)
|
|
return "_null_pointer";
|
|
else if (exception_code == android::binder::Status::EX_ILLEGAL_STATE)
|
|
return "_illegal_state";
|
|
else if (exception_code == android::binder::Status::EX_NETWORK_MAIN_THREAD)
|
|
return "_network_error";
|
|
else if (exception_code == android::binder::Status::EX_UNSUPPORTED_OPERATION)
|
|
return "_unsupported_operation";
|
|
else if (exception_code == android::binder::Status::EX_SERVICE_SPECIFIC)
|
|
return "_general_failure";
|
|
|
|
return "_unknown";
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
Command::Command(const android::sp<android::weave::IWeaveCommand>& proxy)
|
|
: binder_proxy_{proxy} {}
|
|
|
|
Command::~Command() {}
|
|
|
|
std::string Command::GetID() const {
|
|
std::string id;
|
|
android::String16 id16;
|
|
if (binder_proxy_->getId(&id16).isOk())
|
|
id.assign(ToString(id16));
|
|
return id;
|
|
}
|
|
|
|
std::string Command::GetName() const {
|
|
std::string name;
|
|
android::String16 name16;
|
|
if (binder_proxy_->getId(&name16).isOk())
|
|
name.assign(ToString(name16));
|
|
return name;
|
|
}
|
|
|
|
std::string Command::GetComponent() const {
|
|
std::string component;
|
|
android::String16 component16;
|
|
if (binder_proxy_->getId(&component16).isOk())
|
|
component.assign(ToString(component16));
|
|
return component;
|
|
}
|
|
|
|
Command::State Command::GetState() const {
|
|
std::string state;
|
|
android::String16 state16;
|
|
if (binder_proxy_->getState(&state16).isOk())
|
|
state.assign(ToString(state16));
|
|
if (state == "queued")
|
|
return Command::State::kQueued;
|
|
else if (state == "inProgress")
|
|
return Command::State::kInProgress;
|
|
else if (state == "paused")
|
|
return Command::State::kPaused;
|
|
else if (state == "error")
|
|
return Command::State::kError;
|
|
else if (state == "done")
|
|
return Command::State::kDone;
|
|
else if (state == "cancelled")
|
|
return Command::State::kCancelled;
|
|
else if (state == "aborted")
|
|
return Command::State::kAborted;
|
|
else if (state == "expired")
|
|
return Command::State::kExpired;
|
|
LOG(WARNING) << "Unknown command state: " << state;
|
|
return Command::State::kQueued;
|
|
}
|
|
|
|
Command::Origin Command::GetOrigin() const {
|
|
std::string origin;
|
|
android::String16 origin16;
|
|
if (binder_proxy_->getState(&origin16).isOk())
|
|
origin.assign(ToString(origin16));
|
|
if (origin == "local")
|
|
return Command::Origin::kLocal;
|
|
else if (origin == "cloud")
|
|
return Command::Origin::kCloud;
|
|
LOG(WARNING) << "Unknown command origin: " << origin;
|
|
return Command::Origin::kLocal;
|
|
}
|
|
|
|
const base::DictionaryValue& Command::GetParameters() const {
|
|
if (!parameter_cache_) {
|
|
android::String16 params_string16;
|
|
if (!binder_proxy_->getParameters(¶ms_string16).isOk() ||
|
|
!ParseDictionary(params_string16, ¶meter_cache_).isOk()) {
|
|
parameter_cache_.reset(new base::DictionaryValue);
|
|
}
|
|
}
|
|
return *parameter_cache_;
|
|
}
|
|
|
|
bool Command::SetProgress(const base::DictionaryValue& progress,
|
|
brillo::ErrorPtr* error) {
|
|
return StatusToError(binder_proxy_->setProgress(ToString16(progress)), error);
|
|
}
|
|
|
|
bool Command::Complete(const base::DictionaryValue& results,
|
|
brillo::ErrorPtr* error) {
|
|
return StatusToError(binder_proxy_->complete(ToString16(results)), error);
|
|
}
|
|
|
|
bool Command::Abort(const std::string& error_code,
|
|
const std::string& error_message,
|
|
brillo::ErrorPtr* error) {
|
|
return StatusToError(binder_proxy_->abort(ToString16(error_code),
|
|
ToString16(error_message)),
|
|
error);
|
|
}
|
|
|
|
bool Command::AbortWithCustomError(const brillo::Error* command_error,
|
|
brillo::ErrorPtr* error) {
|
|
std::string error_code = "_" + command_error->GetCode();
|
|
return Abort(error_code, command_error->GetMessage(), error);
|
|
}
|
|
|
|
bool Command::AbortWithCustomError(android::binder::Status status,
|
|
brillo::ErrorPtr* error) {
|
|
std::string error_code = BinderExceptionString(status.exceptionCode());
|
|
return Abort(error_code, status.exceptionMessage().string(), error);
|
|
}
|
|
|
|
bool Command::Cancel(brillo::ErrorPtr* error) {
|
|
return StatusToError(binder_proxy_->cancel(), error);
|
|
}
|
|
|
|
bool Command::Pause(brillo::ErrorPtr* error) {
|
|
return StatusToError(binder_proxy_->pause(), error);
|
|
}
|
|
|
|
bool Command::SetError(const std::string& error_code,
|
|
const std::string& error_message,
|
|
brillo::ErrorPtr* error) {
|
|
return StatusToError(binder_proxy_->setError(ToString16(error_code),
|
|
ToString16(error_message)),
|
|
error);
|
|
}
|
|
|
|
bool Command::SetCustomError(const brillo::Error* command_error,
|
|
brillo::ErrorPtr* error) {
|
|
std::string error_code = "_" + command_error->GetCode();
|
|
return SetError(error_code, command_error->GetMessage(), error);
|
|
}
|
|
|
|
bool Command::SetCustomError(android::binder::Status status,
|
|
brillo::ErrorPtr* error) {
|
|
std::string error_code = BinderExceptionString(status.exceptionCode());
|
|
return SetError(error_code, status.exceptionMessage().string(), error);
|
|
}
|
|
|
|
} // namespace weave
|