// 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_weave_service.h"
#include <algorithm>
#include <base/bind.h>
#include <weave/command.h>
#include <weave/device.h>
#include "buffet/binder_command_proxy.h"
#include "common/binder_utils.h"
using weaved::binder_utils::ToStatus;
using weaved::binder_utils::ToString;
using weaved::binder_utils::ToString16;
namespace buffet {
BinderWeaveService::BinderWeaveService(
weave::Device* device,
android::sp<android::weave::IWeaveClient> client)
: device_{device}, client_{client} {}
BinderWeaveService::~BinderWeaveService() {
// TODO(avakulenko): Make it possible to remove components from the tree in
// libweave and enable the following code.
// for (const std::string& component : components_)
// device_->RemoveComponent(component, nullptr);
}
android::binder::Status BinderWeaveService::addComponent(
const android::String16& name,
const std::vector<android::String16>& traits) {
std::string component_name = ToString(name);
weave::ErrorPtr error;
std::vector<std::string> supported_traits;
std::transform(traits.begin(), traits.end(),
std::back_inserter(supported_traits), ToString);
if (!device_->AddComponent(component_name, supported_traits, &error))
return ToStatus(false, &error);
components_.push_back(component_name);
return android::binder::Status::ok();
}
android::binder::Status BinderWeaveService::registerCommandHandler(
const android::String16& component,
const android::String16& command) {
std::string component_name = ToString(component);
std::string command_name = ToString(command);
device_->AddCommandHandler(component_name, command_name,
base::Bind(&BinderWeaveService::OnCommand,
weak_ptr_factory_.GetWeakPtr(),
component_name, command_name));
return android::binder::Status::ok();
}
android::binder::Status BinderWeaveService::updateState(
const android::String16& component,
const android::String16& state) {
weave::ErrorPtr error;
return ToStatus(device_->SetStatePropertiesFromJson(ToString(component),
ToString(state),
&error),
&error);
}
void BinderWeaveService::OnCommand(
const std::string& component_name,
const std::string& command_name,
const std::weak_ptr<weave::Command>& command) {
android::sp<android::weave::IWeaveCommand> command_proxy =
new BinderCommandProxy{command};
client_->onCommand(ToString16(component_name), ToString16(command_name),
command_proxy);
}
} // namespace buffet