90 lines
3.3 KiB
C++
90 lines
3.3 KiB
C++
// 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
|