// Copyright 2016 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 "buffet/binder_command_proxy.h"
#include <weave/enum_to_string.h>
#include "buffet/weave_error_conversion.h"
#include "common/binder_utils.h"
using weaved::binder_utils::ParseDictionary;
using weaved::binder_utils::ToStatus;
using weaved::binder_utils::ToString;
using weaved::binder_utils::ToString16;
namespace buffet {
namespace {
android::binder::Status ReportDestroyedError() {
return android::binder::Status::fromServiceSpecificError(
1, android::String8{"Command has been destroyed"});
}
} // anonymous namespace
BinderCommandProxy::BinderCommandProxy(
const std::weak_ptr<weave::Command>& command) : command_{command} {}
android::binder::Status BinderCommandProxy::getId(android::String16* id) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
*id = ToString16(command->GetID());
return android::binder::Status::ok();
}
android::binder::Status BinderCommandProxy::getName(android::String16* name) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
*name = ToString16(command->GetName());
return android::binder::Status::ok();
}
android::binder::Status BinderCommandProxy::getComponent(
android::String16* component) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
*component = ToString16(command->GetComponent());
return android::binder::Status::ok();
}
android::binder::Status BinderCommandProxy::getState(android::String16* state) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
*state = ToString16(EnumToString(command->GetState()));
return android::binder::Status::ok();
}
android::binder::Status BinderCommandProxy::getOrigin(
android::String16* origin) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
*origin = ToString16(EnumToString(command->GetOrigin()));
return android::binder::Status::ok();
}
android::binder::Status BinderCommandProxy::getParameters(
android::String16* parameters) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
*parameters = ToString16(command->GetParameters());
return android::binder::Status::ok();
}
android::binder::Status BinderCommandProxy::getProgress(
android::String16* progress) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
*progress = ToString16(command->GetProgress());
return android::binder::Status::ok();
}
android::binder::Status BinderCommandProxy::getResults(
android::String16* results) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
*results = ToString16(command->GetResults());
return android::binder::Status::ok();
}
android::binder::Status BinderCommandProxy::setProgress(
const android::String16& progress) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
std::unique_ptr<base::DictionaryValue> dict;
auto status = ParseDictionary(progress, &dict);
if (status.isOk()) {
weave::ErrorPtr error;
status = ToStatus(command->SetProgress(*dict, &error), &error);
}
return status;
}
android::binder::Status BinderCommandProxy::complete(
const android::String16& results) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
std::unique_ptr<base::DictionaryValue> dict;
auto status = ParseDictionary(results, &dict);
if (status.isOk()) {
weave::ErrorPtr error;
status = ToStatus(command->Complete(*dict, &error), &error);
}
return status;
}
android::binder::Status BinderCommandProxy::abort(
const android::String16& errorCode,
const android::String16& errorMessage) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
weave::ErrorPtr command_error;
weave::Error::AddTo(&command_error, FROM_HERE, ToString(errorCode),
ToString(errorMessage));
weave::ErrorPtr error;
return ToStatus(command->Abort(command_error.get(), &error), &error);
}
android::binder::Status BinderCommandProxy::cancel() {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
weave::ErrorPtr error;
return ToStatus(command->Cancel(&error), &error);
}
android::binder::Status BinderCommandProxy::pause() {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
weave::ErrorPtr error;
return ToStatus(command->Pause(&error), &error);
}
android::binder::Status BinderCommandProxy::setError(
const android::String16& errorCode,
const android::String16& errorMessage) {
auto command = command_.lock();
if (!command)
return ReportDestroyedError();
weave::ErrorPtr command_error;
weave::Error::AddTo(&command_error, FROM_HERE, ToString(errorCode),
ToString(errorMessage));
weave::ErrorPtr error;
return ToStatus(command->SetError(command_error.get(), &error), &error);
}
} // namespace buffet