blob: 73fa381d4ad9db1c416af6408e6680f5480bfdc6 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "iioservice/daemon/sensor_hal_server_impl.h"
#include <memory>
#include <utility>
#include <base/bind.h>
#include <brillo/udev/udev.h>
#include <libmems/iio_channel_impl.h>
#include <libmems/iio_context_impl.h>
#include <libmems/iio_device_impl.h>
#include "iioservice/include/common.h"
namespace iioservice {
// static
void SensorHalServerImpl::SensorHalServerImplDeleter(
SensorHalServerImpl* server) {
if (server == nullptr)
return;
if (!server->ipc_task_runner_->RunsTasksInCurrentSequence()) {
server->ipc_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&SensorHalServerImpl::SensorHalServerImplDeleter,
server));
return;
}
delete server;
}
// static
SensorHalServerImpl::ScopedSensorHalServerImpl SensorHalServerImpl::Create(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
mojo::PendingReceiver<cros::mojom::SensorHalServer> server_receiver,
MojoOnFailureCallback mojo_on_failure_callback) {
DCHECK(ipc_task_runner->RunsTasksInCurrentSequence());
ScopedSensorHalServerImpl server(
new SensorHalServerImpl(std::move(ipc_task_runner),
std::move(server_receiver),
std::move(mojo_on_failure_callback)),
SensorHalServerImplDeleter);
server->SetSensorService();
return server;
}
void SensorHalServerImpl::CreateChannel(
mojo::PendingReceiver<cros::mojom::SensorService> sensor_service_request) {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
DCHECK(sensor_service_);
LOGF(INFO) << "Received SensorService from sensor HAL dispatcher";
sensor_service_->AddReceiver(std::move(sensor_service_request));
}
SensorHalServerImpl::SensorHalServerImpl(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
mojo::PendingReceiver<cros::mojom::SensorHalServer> server_receiver,
MojoOnFailureCallback mojo_on_failure_callback)
: ipc_task_runner_(std::move(ipc_task_runner)),
receiver_(this),
mojo_on_failure_callback_(std::move(mojo_on_failure_callback)) {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
receiver_.Bind(std::move(server_receiver));
receiver_.set_disconnect_handler(
base::BindOnce(&SensorHalServerImpl::OnSensorHalServerError,
weak_factory_.GetWeakPtr()));
}
void SensorHalServerImpl::SetSensorService() {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
sensor_service_ = SensorServiceImpl::Create(
ipc_task_runner_, std::make_unique<libmems::IioContextImpl>(),
brillo::Udev::Create());
}
void SensorHalServerImpl::OnSensorHalServerError() {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
DCHECK(receiver_.is_bound());
LOGF(ERROR) << "Connection to broker lost";
receiver_.reset();
std::move(mojo_on_failure_callback_).Run();
}
} // namespace iioservice