blob: 5d420648ecd068087925fc9bf9604b9b7920c4a1 [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/libiioservice_ipc/sensor_client.h"
#include <memory>
#include <utility>
#include <mojo/core/embedder/embedder.h>
#include "iioservice/include/common.h"
#include "iioservice/include/constants.h"
namespace iioservice {
// static
void SensorClient::SensorClientDeleter(SensorClient* client) {
if (client == nullptr)
return;
if (!client->ipc_task_runner_->RunsTasksInCurrentSequence()) {
client->ipc_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&SensorClient::SensorClientDeleter, client));
return;
}
delete client;
}
// static
SensorClient::ScopedSensorClient SensorClient::Create(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
mojo::PendingReceiver<cros::mojom::SensorHalClient> pending_receiver,
SensorServiceReceivedCallback sensor_service_received_callback,
ClientOnFailureCallback client_on_failure_callback) {
DCHECK(ipc_task_runner->RunsTasksInCurrentSequence());
ScopedSensorClient client(
new SensorClient(ipc_task_runner, std::move(pending_receiver),
std::move(sensor_service_received_callback),
std::move(client_on_failure_callback)),
SensorClientDeleter);
return client;
}
void SensorClient::SetUpChannel(
mojo::PendingRemote<cros::mojom::SensorService> sensor_service_ptr) {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
LOGF(INFO) << "Received SensorService from sensor HAL dispatcher";
sensor_service_received_callback_.Run(std::move(sensor_service_ptr));
}
SensorClient::SensorClient(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
mojo::PendingReceiver<cros::mojom::SensorHalClient> pending_receiver,
SensorServiceReceivedCallback sensor_service_received_callback,
ClientOnFailureCallback client_on_failure_callback)
: ipc_task_runner_(ipc_task_runner),
receiver_(this),
sensor_service_received_callback_(
std::move(sensor_service_received_callback)),
client_on_failure_callback_(std::move(client_on_failure_callback)) {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
receiver_.Bind(std::move(pending_receiver), ipc_task_runner_);
receiver_.set_disconnect_handler(
base::BindOnce(&SensorClient::OnClientError, base::Unretained(this)));
LOGF(INFO) << "Connected to broker";
}
void SensorClient::OnClientError() {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
DCHECK(receiver_.is_bound());
DCHECK(!client_on_failure_callback_.is_null());
LOGF(ERROR) << "Connection to broker lost";
receiver_.reset();
std::move(client_on_failure_callback_).Run();
}
} // namespace iioservice