#ifndef CHROMEOS_COMPONENTS_SENSORS_ASH_SENSOR_HAL_DISPATCHER_H_
#define CHROMEOS_COMPONENTS_SENSORS_ASH_SENSOR_HAL_DISPATCHER_H_
#include "base/component_export.h"
#include "base/sequence_checker.h"
#include "chromeos/ash/components/mojo_service_manager/mojom/mojo_service_manager.mojom.h"
#include "chromeos/components/sensors/mojom/cros_sensor_service.mojom.h"
#include "chromeos/components/sensors/mojom/sensor.mojom.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace chromeos {
namespace sensors {
class COMPONENT_EXPORT(CHROMEOS_SENSORS) SensorHalDispatcher
: public mojo_service_manager::mojom::ServiceObserver {
public:
static void Initialize();
static void Shutdown();
static SensorHalDispatcher* GetInstance();
void RegisterServer(mojo::PendingRemote<mojom::SensorHalServer> remote);
void RegisterClient(mojo::PendingRemote<mojom::SensorHalClient> remote);
void TryToEstablishMojoChannelByServiceManager();
void OnServiceEvent(
mojo_service_manager::mojom::ServiceEventPtr event) override;
private:
SensorHalDispatcher();
~SensorHalDispatcher() override;
void QueryCallback(
mojo_service_manager::mojom::ErrorOrServiceStatePtr result);
void OnIioSensorServiceRegistered();
void EstablishMojoChannel(const mojo::Remote<mojom::SensorHalClient>& client);
void OnSensorHalServerDisconnect();
void OnSensorHalClientDisconnect(mojo::RemoteSetElementId id);
mojo::Remote<mojom::SensorHalServer> sensor_hal_server_;
mojo::RemoteSet<mojom::SensorHalClient> sensor_hal_clients_;
mojo::Receiver<mojo_service_manager::mojom::ServiceObserver> receiver_;
bool iio_sensor_available_ = false;
SEQUENCE_CHECKER(sequence_checker_);
};
}
}
#endif