• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_CHARACTERISTIC_CLIENT_H_
6 #define CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_CHARACTERISTIC_CLIENT_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "base/basictypes.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/observer_list.h"
15 #include "chromeos/chromeos_export.h"
16 #include "chromeos/dbus/bluetooth_gatt_characteristic_client.h"
17 #include "dbus/object_path.h"
18 #include "dbus/property.h"
19 
20 namespace chromeos {
21 
22 // FakeBluetoothGattCharacteristicClient simulates the behavior of the
23 // Bluetooth Daemon GATT characteristic objects and is used in test cases in
24 // place of a mock and on the Linux desktop.
25 class CHROMEOS_EXPORT FakeBluetoothGattCharacteristicClient
26     : public BluetoothGattCharacteristicClient {
27  public:
28   struct Properties : public BluetoothGattCharacteristicClient::Properties {
29     explicit Properties(const PropertyChangedCallback& callback);
30     virtual ~Properties();
31 
32     // dbus::PropertySet override
33     virtual void Get(dbus::PropertyBase* property,
34                      dbus::PropertySet::GetCallback callback) OVERRIDE;
35     virtual void GetAll() OVERRIDE;
36     virtual void Set(dbus::PropertyBase* property,
37                      dbus::PropertySet::SetCallback callback) OVERRIDE;
38   };
39 
40   FakeBluetoothGattCharacteristicClient();
41   virtual ~FakeBluetoothGattCharacteristicClient();
42 
43   // DBusClient override.
44   virtual void Init(dbus::Bus* bus) OVERRIDE;
45 
46   // BluetoothGattCharacteristicClient overrides.
47   virtual void AddObserver(Observer* observer) OVERRIDE;
48   virtual void RemoveObserver(Observer* observer) OVERRIDE;
49   virtual std::vector<dbus::ObjectPath> GetCharacteristics() OVERRIDE;
50   virtual Properties* GetProperties(const dbus::ObjectPath& object_path)
51       OVERRIDE;
52   virtual void ReadValue(const dbus::ObjectPath& object_path,
53                          const ValueCallback& callback,
54                          const ErrorCallback& error_callback) OVERRIDE;
55   virtual void WriteValue(const dbus::ObjectPath& object_path,
56                           const std::vector<uint8>& value,
57                           const base::Closure& callback,
58                           const ErrorCallback& error_callback) OVERRIDE;
59   virtual void StartNotify(const dbus::ObjectPath& object_path,
60                            const base::Closure& callback,
61                            const ErrorCallback& error_callback) OVERRIDE;
62   virtual void StopNotify(const dbus::ObjectPath& object_path,
63                           const base::Closure& callback,
64                           const ErrorCallback& error_callback) OVERRIDE;
65 
66   // Makes the group of characteristics belonging to a particular GATT based
67   // profile available under the GATT service with object path |service_path|.
68   // Characteristic paths are hierarchical to service paths.
69   void ExposeHeartRateCharacteristics(const dbus::ObjectPath& service_path);
70   void HideHeartRateCharacteristics();
71 
72   // Returns whether or not the heart rate characteristics are visible and
73   // performs the appropriate assertions.
74   bool IsHeartRateVisible() const;
75 
76   // Returns the current object paths of exposed characteristics. If the
77   // characteristic is not visible, returns an invalid empty path.
78   dbus::ObjectPath GetHeartRateMeasurementPath() const;
79   dbus::ObjectPath GetBodySensorLocationPath() const;
80   dbus::ObjectPath GetHeartRateControlPointPath() const;
81 
82   // Object path components and UUIDs of GATT characteristics.
83   // Heart Rate Service:
84   static const char kHeartRateMeasurementPathComponent[];
85   static const char kHeartRateMeasurementUUID[];
86   static const char kBodySensorLocationPathComponent[];
87   static const char kBodySensorLocationUUID[];
88   static const char kHeartRateControlPointPathComponent[];
89   static const char kHeartRateControlPointUUID[];
90 
91  private:
92   // Property callback passed when we create Properties structures.
93   void OnPropertyChanged(const dbus::ObjectPath& object_path,
94                          const std::string& property_name);
95 
96   // Notifies observers.
97   void NotifyCharacteristicAdded(const dbus::ObjectPath& object_path);
98   void NotifyCharacteristicRemoved(const dbus::ObjectPath& object_path);
99 
100   // Schedules a heart rate measurement value change, if the heart rate
101   // characteristics are visible.
102   void ScheduleHeartRateMeasurementValueChange();
103 
104   // Returns a random Heart Rate Measurement value. All the fields of the value
105   // are populated according to the the fake behavior. The measurement value
106   // is a random value within a reasonable range.
107   std::vector<uint8> GetHeartRateMeasurementValue();
108 
109   // If true, characteristics of the Heart Rate Service are visible. Use
110   // IsHeartRateVisible() to check the value.
111   bool heart_rate_visible_;
112 
113   // Total calories burned, used for the Heart Rate Measurement characteristic.
114   uint16 calories_burned_;
115 
116   // Static properties returned for simulated characteristics for the Heart
117   // Rate Service. These pointers are not NULL only if the characteristics are
118   // actually exposed.
119   scoped_ptr<Properties> heart_rate_measurement_properties_;
120   scoped_ptr<Properties> body_sensor_location_properties_;
121   scoped_ptr<Properties> heart_rate_control_point_properties_;
122 
123   // Object paths of the exposed characteristics. If a characteristic is not
124   // exposed, these will be empty.
125   std::string heart_rate_measurement_path_;
126   std::string heart_rate_measurement_ccc_desc_path_;
127   std::string body_sensor_location_path_;
128   std::string heart_rate_control_point_path_;
129 
130   // List of observers interested in event notifications from us.
131   ObserverList<Observer> observers_;
132 
133   // Weak pointer factory for generating 'this' pointers that might live longer
134   // than we do.
135   // Note: This should remain the last member so it'll be destroyed and
136   // invalidate its weak pointers before any other members are destroyed.
137   base::WeakPtrFactory<FakeBluetoothGattCharacteristicClient>
138       weak_ptr_factory_;
139 
140   DISALLOW_COPY_AND_ASSIGN(FakeBluetoothGattCharacteristicClient);
141 };
142 
143 }  // namespace chromeos
144 
145 #endif  // CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_CHARACTERISTIC_CLIENT_H_
146