// 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