Home | History | Annotate | Download | only in dbus
      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