| Index: device/generic_sensor/platform_sensor.cc
|
| diff --git a/device/generic_sensor/platform_sensor.cc b/device/generic_sensor/platform_sensor.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8123b6012b5127a608253a2cad777e1847d076fc
|
| --- /dev/null
|
| +++ b/device/generic_sensor/platform_sensor.cc
|
| @@ -0,0 +1,91 @@
|
| +// Copyright 2016 The Chromium 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 "device/generic_sensor/platform_sensor.h"
|
| +
|
| +#include <utility>
|
| +
|
| +#include "device/generic_sensor/platform_sensor_configuration.h"
|
| +#include "device/generic_sensor/platform_sensor_provider.h"
|
| +
|
| +namespace device {
|
| +
|
| +PlatformSensor::PlatformSensor(mojom::SensorType type,
|
| + mojo::ScopedSharedBufferMapping mapping,
|
| + PlatformSensorProvider* provider)
|
| + : shared_buffer_mapping_(std::move(mapping)),
|
| + type_(type),
|
| + provider_(provider),
|
| + weak_factory_(this) {}
|
| +
|
| +PlatformSensor::~PlatformSensor() {
|
| + provider_->RemoveSensor(GetType());
|
| +}
|
| +
|
| +mojom::SensorType PlatformSensor::GetType() const {
|
| + return type_;
|
| +}
|
| +
|
| +bool PlatformSensor::StartListening(Client* client,
|
| + const PlatformSensorConfiguration& config) {
|
| + DCHECK(clients_.HasObserver(client));
|
| + if (!CheckSensorConfiguration(config))
|
| + return false;
|
| +
|
| + auto& config_list = config_map_[client];
|
| + config_list.push_back(config);
|
| +
|
| + if (!UpdateSensorInternal(config_map_)) {
|
| + config_list.pop_back();
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool PlatformSensor::StopListening(Client* client,
|
| + const PlatformSensorConfiguration& config) {
|
| + DCHECK(clients_.HasObserver(client));
|
| + auto client_entry = config_map_.find(client);
|
| + if (client_entry == config_map_.end())
|
| + return false;
|
| +
|
| + auto& config_list = client_entry->second;
|
| + auto config_entry = std::find(config_list.begin(), config_list.end(), config);
|
| + if (config_entry == config_list.end())
|
| + return false;
|
| +
|
| + config_list.erase(config_entry);
|
| +
|
| + return UpdateSensorInternal(config_map_);
|
| +}
|
| +
|
| +void PlatformSensor::UpdateSensor() {
|
| + UpdateSensorInternal(config_map_);
|
| +}
|
| +
|
| +void PlatformSensor::AddClient(Client* client) {
|
| + DCHECK(client);
|
| + clients_.AddObserver(client);
|
| +}
|
| +
|
| +void PlatformSensor::RemoveClient(Client* client) {
|
| + DCHECK(client);
|
| + clients_.RemoveObserver(client);
|
| + auto client_entry = config_map_.find(client);
|
| + if (client_entry != config_map_.end()) {
|
| + config_map_.erase(client_entry);
|
| + UpdateSensorInternal(config_map_);
|
| + }
|
| +}
|
| +
|
| +void PlatformSensor::NotifySensorReadingChanged() {
|
| + FOR_EACH_OBSERVER(Client, clients_, OnSensorReadingChanged());
|
| +}
|
| +
|
| +void PlatformSensor::NotifySensorError() {
|
| + FOR_EACH_OBSERVER(Client, clients_, OnSensorError());
|
| +}
|
| +
|
| +} // namespace device
|
|
|