Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Unified Diff: chromeos/dbus/fake_bluetooth_gatt_characteristic_client.cc

Issue 1347193004: Refactor DBusThreadManager to split away BT clients. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/dbus/fake_bluetooth_gatt_characteristic_client.cc
diff --git a/chromeos/dbus/fake_bluetooth_gatt_characteristic_client.cc b/chromeos/dbus/fake_bluetooth_gatt_characteristic_client.cc
deleted file mode 100644
index 61bbb8dd92042fa88f0776c960b69cc999cc28ec..0000000000000000000000000000000000000000
--- a/chromeos/dbus/fake_bluetooth_gatt_characteristic_client.cc
+++ /dev/null
@@ -1,568 +0,0 @@
-// Copyright 2014 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 "chromeos/dbus/fake_bluetooth_gatt_characteristic_client.h"
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/rand_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
-#include "chromeos/dbus/fake_bluetooth_gatt_descriptor_client.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
-
-namespace chromeos {
-
-namespace {
-
-const int kStartNotifyResponseIntervalMs = 200;
-const int kHeartRateMeasurementNotificationIntervalMs = 2000;
-
-} // namespace
-
-FakeBluetoothGattCharacteristicClient::DelayedCallback::DelayedCallback(
- base::Closure callback,
- size_t delay)
- : callback_(callback), delay_(delay) {
-}
-
-FakeBluetoothGattCharacteristicClient::DelayedCallback::~DelayedCallback() {
-}
-
-// static
-const char FakeBluetoothGattCharacteristicClient::
- kHeartRateMeasurementPathComponent[] = "char0000";
-const char FakeBluetoothGattCharacteristicClient::
- kBodySensorLocationPathComponent[] = "char0001";
-const char FakeBluetoothGattCharacteristicClient::
- kHeartRateControlPointPathComponent[] = "char0002";
-
-// static
-const char FakeBluetoothGattCharacteristicClient::kHeartRateMeasurementUUID[] =
- "00002a37-0000-1000-8000-00805f9b34fb";
-const char FakeBluetoothGattCharacteristicClient::kBodySensorLocationUUID[] =
- "00002a38-0000-1000-8000-00805f9b34fb";
-const char FakeBluetoothGattCharacteristicClient::kHeartRateControlPointUUID[] =
- "00002a39-0000-1000-8000-00805f9b34fb";
-
-FakeBluetoothGattCharacteristicClient::Properties::Properties(
- const PropertyChangedCallback& callback)
- : BluetoothGattCharacteristicClient::Properties(
- NULL,
- bluetooth_gatt_characteristic::kBluetoothGattCharacteristicInterface,
- callback) {
-}
-
-FakeBluetoothGattCharacteristicClient::Properties::~Properties() {
-}
-
-void FakeBluetoothGattCharacteristicClient::Properties::Get(
- dbus::PropertyBase* property,
- dbus::PropertySet::GetCallback callback) {
- VLOG(1) << "Get " << property->name();
- callback.Run(true);
-}
-
-void FakeBluetoothGattCharacteristicClient::Properties::GetAll() {
- VLOG(1) << "GetAll";
-}
-
-void FakeBluetoothGattCharacteristicClient::Properties::Set(
- dbus::PropertyBase* property,
- dbus::PropertySet::SetCallback callback) {
- VLOG(1) << "Set " << property->name();
- callback.Run(false);
-}
-
-FakeBluetoothGattCharacteristicClient::FakeBluetoothGattCharacteristicClient()
- : heart_rate_visible_(false),
- authorized_(true),
- authenticated_(true),
- calories_burned_(0),
- extra_requests_(0),
- weak_ptr_factory_(this) {
-}
-
-FakeBluetoothGattCharacteristicClient::
- ~FakeBluetoothGattCharacteristicClient() {
- for (const auto& it : action_extra_requests_) {
- delete it.second;
- }
- action_extra_requests_.clear();
-}
-
-void FakeBluetoothGattCharacteristicClient::Init(dbus::Bus* bus) {
-}
-
-void FakeBluetoothGattCharacteristicClient::AddObserver(Observer* observer) {
- observers_.AddObserver(observer);
-}
-
-void FakeBluetoothGattCharacteristicClient::RemoveObserver(Observer* observer) {
- observers_.RemoveObserver(observer);
-}
-
-std::vector<dbus::ObjectPath>
-FakeBluetoothGattCharacteristicClient::GetCharacteristics() {
- std::vector<dbus::ObjectPath> paths;
- if (IsHeartRateVisible()) {
- paths.push_back(dbus::ObjectPath(heart_rate_measurement_path_));
- paths.push_back(dbus::ObjectPath(body_sensor_location_path_));
- paths.push_back(dbus::ObjectPath(heart_rate_control_point_path_));
- }
- return paths;
-}
-
-FakeBluetoothGattCharacteristicClient::Properties*
-FakeBluetoothGattCharacteristicClient::GetProperties(
- const dbus::ObjectPath& object_path) {
- if (object_path.value() == heart_rate_measurement_path_) {
- DCHECK(heart_rate_measurement_properties_.get());
- return heart_rate_measurement_properties_.get();
- }
- if (object_path.value() == body_sensor_location_path_) {
- DCHECK(body_sensor_location_properties_.get());
- return body_sensor_location_properties_.get();
- }
- if (object_path.value() == heart_rate_control_point_path_) {
- DCHECK(heart_rate_control_point_properties_.get());
- return heart_rate_control_point_properties_.get();
- }
- return NULL;
-}
-
-void FakeBluetoothGattCharacteristicClient::ReadValue(
- const dbus::ObjectPath& object_path,
- const ValueCallback& callback,
- const ErrorCallback& error_callback) {
- if (!authenticated_) {
- error_callback.Run("org.bluez.Error.NotPaired", "Please login");
- return;
- }
-
- if (!authorized_) {
- error_callback.Run("org.bluez.Error.NotAuthorized", "Authorize first");
- return;
- }
-
- if (object_path.value() == heart_rate_control_point_path_) {
- error_callback.Run("org.bluez.Error.NotPermitted",
- "Reads of this value are not allowed");
- return;
- }
-
- if (object_path.value() == heart_rate_measurement_path_) {
- error_callback.Run("org.bluez.Error.NotSupported",
- "Action not supported on this characteristic");
- return;
- }
-
- if (object_path.value() != body_sensor_location_path_) {
- error_callback.Run(kUnknownCharacteristicError, "");
- return;
- }
-
- if (action_extra_requests_.find("ReadValue") !=
- action_extra_requests_.end()) {
- DelayedCallback* delayed = action_extra_requests_["ReadValue"];
- delayed->delay_--;
- error_callback.Run("org.bluez.Error.InProgress",
- "Another read is currenty in progress");
- if (delayed->delay_ == 0) {
- delayed->callback_.Run();
- action_extra_requests_.erase("ReadValue");
- delete delayed;
- }
- return;
- }
-
- base::Closure completed_callback;
- if (!IsHeartRateVisible()) {
- completed_callback =
- base::Bind(error_callback, kUnknownCharacteristicError, "");
- } else {
- std::vector<uint8> value = {0x06}; // Location is "foot".
- completed_callback = base::Bind(
- &FakeBluetoothGattCharacteristicClient::DelayedReadValueCallback,
- weak_ptr_factory_.GetWeakPtr(), object_path, callback, value);
- }
-
- if (extra_requests_ > 0) {
- action_extra_requests_["ReadValue"] =
- new DelayedCallback(completed_callback, extra_requests_);
- return;
- }
-
- completed_callback.Run();
-}
-
-void FakeBluetoothGattCharacteristicClient::WriteValue(
- const dbus::ObjectPath& object_path,
- const std::vector<uint8>& value,
- const base::Closure& callback,
- const ErrorCallback& error_callback) {
- if (!authenticated_) {
- error_callback.Run("org.bluez.Error.NotPaired", "Please login");
- return;
- }
-
- if (!authorized_) {
- error_callback.Run("org.bluez.Error.NotAuthorized", "Authorize first");
- return;
- }
-
- if (!IsHeartRateVisible()) {
- error_callback.Run(kUnknownCharacteristicError, "");
- return;
- }
-
- if (object_path.value() == heart_rate_measurement_path_) {
- error_callback.Run("org.bluez.Error.NotSupported",
- "Action not supported on this characteristic");
- return;
- }
-
- if (object_path.value() != heart_rate_control_point_path_) {
- error_callback.Run("org.bluez.Error.NotPermitted",
- "Writes of this value are not allowed");
- return;
- }
-
- DCHECK(heart_rate_control_point_properties_.get());
- if (action_extra_requests_.find("WriteValue") !=
- action_extra_requests_.end()) {
- DelayedCallback* delayed = action_extra_requests_["WriteValue"];
- delayed->delay_--;
- error_callback.Run("org.bluez.Error.InProgress",
- "Another write is in progress");
- if (delayed->delay_ == 0) {
- delayed->callback_.Run();
- action_extra_requests_.erase("WriteValue");
- delete delayed;
- }
- return;
- }
- base::Closure completed_callback;
- if (value.size() != 1) {
- completed_callback = base::Bind(error_callback,
- "org.bluez.Error.InvalidValueLength",
- "Invalid length for write");
- } else if (value[0] > 1) {
- completed_callback = base::Bind(error_callback,
- "org.bluez.Error.Failed",
- "Invalid value given for write");
- } else if (value[0] == 1) {
- // TODO(jamuraa): make this happen when the callback happens
- calories_burned_ = 0;
- completed_callback = callback;
- }
-
- if (extra_requests_ > 0) {
- action_extra_requests_["WriteValue"] =
- new DelayedCallback(completed_callback, extra_requests_);
- return;
- }
- completed_callback.Run();
-}
-
-void FakeBluetoothGattCharacteristicClient::StartNotify(
- const dbus::ObjectPath& object_path,
- const base::Closure& callback,
- const ErrorCallback& error_callback) {
- if (!IsHeartRateVisible()) {
- error_callback.Run(kUnknownCharacteristicError, "");
- return;
- }
-
- if (object_path.value() != heart_rate_measurement_path_) {
- error_callback.Run("org.bluez.Error.NotSupported",
- "This characteristic does not support notifications");
- return;
- }
-
- if (heart_rate_measurement_properties_->notifying.value()) {
- error_callback.Run("org.bluez.Error.InProgress",
- "Characteristic already notifying");
- return;
- }
-
- heart_rate_measurement_properties_->notifying.ReplaceValue(true);
- ScheduleHeartRateMeasurementValueChange();
-
- // Respond asynchronously.
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
- FROM_HERE, callback,
- base::TimeDelta::FromMilliseconds(kStartNotifyResponseIntervalMs));
-}
-
-void FakeBluetoothGattCharacteristicClient::StopNotify(
- const dbus::ObjectPath& object_path,
- const base::Closure& callback,
- const ErrorCallback& error_callback) {
- if (!IsHeartRateVisible()) {
- error_callback.Run(kUnknownCharacteristicError, "");
- return;
- }
-
- if (object_path.value() != heart_rate_measurement_path_) {
- error_callback.Run("org.bluez.Error.NotSupported",
- "This characteristic does not support notifications");
- return;
- }
-
- if (!heart_rate_measurement_properties_->notifying.value()) {
- error_callback.Run("org.bluez.Error.Failed", "Not notifying");
- return;
- }
-
- heart_rate_measurement_properties_->notifying.ReplaceValue(false);
-
- callback.Run();
-}
-
-void FakeBluetoothGattCharacteristicClient::ExposeHeartRateCharacteristics(
- const dbus::ObjectPath& service_path) {
- if (IsHeartRateVisible()) {
- VLOG(2) << "Fake Heart Rate characteristics are already visible.";
- return;
- }
-
- VLOG(2) << "Exposing fake Heart Rate characteristics.";
-
- std::vector<std::string> flags;
-
- // ==== Heart Rate Measurement Characteristic ====
- heart_rate_measurement_path_ =
- service_path.value() + "/" + kHeartRateMeasurementPathComponent;
- heart_rate_measurement_properties_.reset(new Properties(base::Bind(
- &FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
- weak_ptr_factory_.GetWeakPtr(),
- dbus::ObjectPath(heart_rate_measurement_path_))));
- heart_rate_measurement_properties_->uuid.ReplaceValue(
- kHeartRateMeasurementUUID);
- heart_rate_measurement_properties_->service.ReplaceValue(service_path);
- flags.push_back(bluetooth_gatt_characteristic::kFlagNotify);
- heart_rate_measurement_properties_->flags.ReplaceValue(flags);
-
- // ==== Body Sensor Location Characteristic ====
- body_sensor_location_path_ =
- service_path.value() + "/" + kBodySensorLocationPathComponent;
- body_sensor_location_properties_.reset(new Properties(base::Bind(
- &FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
- weak_ptr_factory_.GetWeakPtr(),
- dbus::ObjectPath(body_sensor_location_path_))));
- body_sensor_location_properties_->uuid.ReplaceValue(kBodySensorLocationUUID);
- body_sensor_location_properties_->service.ReplaceValue(service_path);
- flags.clear();
- flags.push_back(bluetooth_gatt_characteristic::kFlagRead);
- body_sensor_location_properties_->flags.ReplaceValue(flags);
-
- // ==== Heart Rate Control Point Characteristic ====
- heart_rate_control_point_path_ =
- service_path.value() + "/" + kHeartRateControlPointPathComponent;
- heart_rate_control_point_properties_.reset(new Properties(base::Bind(
- &FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
- weak_ptr_factory_.GetWeakPtr(),
- dbus::ObjectPath(heart_rate_control_point_path_))));
- heart_rate_control_point_properties_->uuid.ReplaceValue(
- kHeartRateControlPointUUID);
- heart_rate_control_point_properties_->service.ReplaceValue(service_path);
- flags.clear();
- flags.push_back(bluetooth_gatt_characteristic::kFlagWrite);
- heart_rate_control_point_properties_->flags.ReplaceValue(flags);
-
- heart_rate_visible_ = true;
-
- NotifyCharacteristicAdded(dbus::ObjectPath(heart_rate_measurement_path_));
- NotifyCharacteristicAdded(dbus::ObjectPath(body_sensor_location_path_));
- NotifyCharacteristicAdded(dbus::ObjectPath(heart_rate_control_point_path_));
-
- // Expose CCC descriptor for Heart Rate Measurement characteristic.
- FakeBluetoothGattDescriptorClient* descriptor_client =
- static_cast<FakeBluetoothGattDescriptorClient*>(
- DBusThreadManager::Get()->GetBluetoothGattDescriptorClient());
- dbus::ObjectPath ccc_path(descriptor_client->ExposeDescriptor(
- dbus::ObjectPath(heart_rate_measurement_path_),
- FakeBluetoothGattDescriptorClient::
- kClientCharacteristicConfigurationUUID));
- DCHECK(ccc_path.IsValid());
- heart_rate_measurement_ccc_desc_path_ = ccc_path.value();
-
- std::vector<dbus::ObjectPath> desc_paths;
- desc_paths.push_back(ccc_path);
-
- heart_rate_measurement_properties_->descriptors.ReplaceValue(desc_paths);
-}
-
-void FakeBluetoothGattCharacteristicClient::HideHeartRateCharacteristics() {
- VLOG(2) << "Hiding fake Heart Rate characteristics.";
-
- // Hide the descriptors.
- FakeBluetoothGattDescriptorClient* descriptor_client =
- static_cast<FakeBluetoothGattDescriptorClient*>(
- DBusThreadManager::Get()->GetBluetoothGattDescriptorClient());
- descriptor_client->HideDescriptor(
- dbus::ObjectPath(heart_rate_measurement_ccc_desc_path_));
-
- // Notify the observers before deleting the properties structures so that they
- // can be accessed from the observer method.
- NotifyCharacteristicRemoved(dbus::ObjectPath(heart_rate_measurement_path_));
- NotifyCharacteristicRemoved(dbus::ObjectPath(body_sensor_location_path_));
- NotifyCharacteristicRemoved(dbus::ObjectPath(heart_rate_control_point_path_));
-
- heart_rate_measurement_properties_.reset();
- body_sensor_location_properties_.reset();
- heart_rate_control_point_properties_.reset();
-
- heart_rate_measurement_path_.clear();
- body_sensor_location_path_.clear();
- heart_rate_control_point_path_.clear();
- heart_rate_visible_ = false;
-}
-
-void FakeBluetoothGattCharacteristicClient::SetExtraProcessing(
- size_t requests) {
- extra_requests_ = requests;
- if (extra_requests_ == 0) {
- for (const auto& it : action_extra_requests_) {
- it.second->callback_.Run();
- delete it.second;
- }
- action_extra_requests_.clear();
- return;
- }
- VLOG(2) << "Requests SLOW now, " << requests << " InProgress errors each.";
-}
-
-size_t FakeBluetoothGattCharacteristicClient::GetExtraProcessing() const {
- return extra_requests_;
-}
-
-dbus::ObjectPath
-FakeBluetoothGattCharacteristicClient::GetHeartRateMeasurementPath() const {
- return dbus::ObjectPath(heart_rate_measurement_path_);
-}
-
-dbus::ObjectPath
-FakeBluetoothGattCharacteristicClient::GetBodySensorLocationPath() const {
- return dbus::ObjectPath(body_sensor_location_path_);
-}
-
-dbus::ObjectPath
-FakeBluetoothGattCharacteristicClient::GetHeartRateControlPointPath() const {
- return dbus::ObjectPath(heart_rate_control_point_path_);
-}
-
-void FakeBluetoothGattCharacteristicClient::OnPropertyChanged(
- const dbus::ObjectPath& object_path,
- const std::string& property_name) {
- VLOG(2) << "Characteristic property changed: " << object_path.value()
- << ": " << property_name;
-
- FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_,
- GattCharacteristicPropertyChanged(
- object_path, property_name));
-}
-
-void FakeBluetoothGattCharacteristicClient::NotifyCharacteristicAdded(
- const dbus::ObjectPath& object_path) {
- VLOG(2) << "GATT characteristic added: " << object_path.value();
- FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_,
- GattCharacteristicAdded(object_path));
-}
-
-void FakeBluetoothGattCharacteristicClient::NotifyCharacteristicRemoved(
- const dbus::ObjectPath& object_path) {
- VLOG(2) << "GATT characteristic removed: " << object_path.value();
- FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_,
- GattCharacteristicRemoved(object_path));
-}
-
-void FakeBluetoothGattCharacteristicClient::
- ScheduleHeartRateMeasurementValueChange() {
- if (!IsHeartRateVisible())
- return;
-
- // Don't send updates if the characteristic is not notifying.
- if (!heart_rate_measurement_properties_->notifying.value())
- return;
-
- VLOG(2) << "Updating heart rate value.";
- std::vector<uint8> measurement = GetHeartRateMeasurementValue();
- heart_rate_measurement_properties_->value.ReplaceValue(measurement);
-
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
- FROM_HERE, base::Bind(&FakeBluetoothGattCharacteristicClient::
- ScheduleHeartRateMeasurementValueChange,
- weak_ptr_factory_.GetWeakPtr()),
- base::TimeDelta::FromMilliseconds(
- kHeartRateMeasurementNotificationIntervalMs));
-}
-
-void FakeBluetoothGattCharacteristicClient::DelayedReadValueCallback(
- const dbus::ObjectPath& object_path,
- const ValueCallback& callback,
- const std::vector<uint8_t>& value) {
- Properties* properties = GetProperties(object_path);
- DCHECK(properties);
-
- properties->value.ReplaceValue(value);
- callback.Run(value);
-}
-
-std::vector<uint8>
-FakeBluetoothGattCharacteristicClient::GetHeartRateMeasurementValue() {
- // TODO(armansito): We should make sure to properly pack this struct to ensure
- // correct byte alignment and endianness. It doesn't matter too much right now
- // as this is a fake and GCC on Linux seems to do the right thing.
- struct {
- uint8 flags;
- uint8 bpm;
- uint16 energy_expanded;
- uint16 rr_interval;
- } value;
-
- // Flags in LSB: 0 11 1 1 000
- // | | | | |
- // 8-bit bpm format -- | | | |
- // Sensor contact supported -- | | |
- // Energy expanded field present -- | |
- // RR-Interval values present ------- |
- // Reserved for future use ------------
- value.flags = 0x0;
- value.flags |= (0x03 << 1);
- value.flags |= (0x01 << 3);
- value.flags |= (0x01 << 4);
-
- // Pick a value between 117 bpm and 153 bpm for heart rate.
- value.bpm = static_cast<uint8>(base::RandInt(117, 153));
-
- // Total calories burned in kJoules since the last reset. Increment this by 1
- // every time. It's fine if it overflows: it becomes 0 when the user resets
- // the heart rate monitor (or pretend that he had a lot of cheeseburgers).
- value.energy_expanded = calories_burned_++;
-
- // Include one RR-Interval value, in seconds.
- value.rr_interval = 60/value.bpm;
-
- // Return the bytes in an array.
- uint8* bytes = reinterpret_cast<uint8*>(&value);
- std::vector<uint8> return_value;
- return_value.assign(bytes, bytes + sizeof(value));
- return return_value;
-}
-
-bool FakeBluetoothGattCharacteristicClient::IsHeartRateVisible() const {
- DCHECK(heart_rate_visible_ != heart_rate_measurement_path_.empty());
- DCHECK(heart_rate_visible_ != body_sensor_location_path_.empty());
- DCHECK(heart_rate_visible_ != heart_rate_control_point_path_.empty());
- DCHECK(heart_rate_visible_ == !!heart_rate_measurement_properties_.get());
- DCHECK(heart_rate_visible_ == !!body_sensor_location_properties_.get());
- DCHECK(heart_rate_visible_ == !!heart_rate_control_point_properties_.get());
- return heart_rate_visible_;
-}
-
-} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698