| // 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. |
| |
| #ifndef DEVICE_BLUETOOTH_DBUS_FAKE_BLUETOOTH_GATT_SERVICE_CLIENT_H_ |
| #define DEVICE_BLUETOOTH_DBUS_FAKE_BLUETOOTH_GATT_SERVICE_CLIENT_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/observer_list.h" |
| #include "dbus/object_path.h" |
| #include "dbus/property.h" |
| #include "device/bluetooth/bluetooth_export.h" |
| #include "device/bluetooth/dbus/bluetooth_gatt_service_client.h" |
| |
| namespace bluez { |
| |
| // FakeBluetoothGattServiceClient simulates the behavior of the Bluetooth Daemon |
| // GATT service objects and is used in test cases in place of a mock and on the |
| // Linux desktop. |
| class DEVICE_BLUETOOTH_EXPORT FakeBluetoothGattServiceClient |
| : public BluetoothGattServiceClient { |
| public: |
| struct Properties : public BluetoothGattServiceClient::Properties { |
| explicit Properties(const PropertyChangedCallback& callback); |
| ~Properties() override; |
| |
| // dbus::PropertySet override |
| void Get(dbus::PropertyBase* property, |
| dbus::PropertySet::GetCallback callback) override; |
| void GetAll() override; |
| void Set(dbus::PropertyBase* property, |
| dbus::PropertySet::SetCallback callback) override; |
| }; |
| |
| FakeBluetoothGattServiceClient(); |
| ~FakeBluetoothGattServiceClient() override; |
| |
| // DBusClient override. |
| void Init(dbus::Bus* bus, const std::string& bluetooth_service_name) override; |
| |
| // BluetoothGattServiceClient overrides. |
| void AddObserver(Observer* observer) override; |
| void RemoveObserver(Observer* observer) override; |
| std::vector<dbus::ObjectPath> GetServices() override; |
| Properties* GetProperties(const dbus::ObjectPath& object_path) override; |
| |
| // Makes a service visible for device with object path |device_path|. Note |
| // that only one instance of a specific service is simulated at a time. Hence, |
| // this method will fail, if the service is already visible. |
| void ExposeHeartRateService(const dbus::ObjectPath& device_path); |
| void HideHeartRateService(); |
| |
| // Makes a service visible for device with object path |device_path|. Note |
| // that only one instance of a specific service is simulated at a time. Hence, |
| // this method will fail, if the service is already visible. |
| void ExposeBatteryService(const dbus::ObjectPath& device_path); |
| |
| // Returns whether or not the Heart Rate Service is visible. |
| bool IsHeartRateVisible() const; |
| // Returns whether or not the Battery Service is visible. |
| bool IsBatteryServiceVisible() const; |
| |
| // Returns the current object path of the visible Heart Rate service. If the |
| // service is not visible, returns an invalid empty path. |
| dbus::ObjectPath GetHeartRateServicePath() const; |
| |
| // Returns the current object path of the visible Battery service. If the |
| // service is not visible, returns an invalid empty path. |
| dbus::ObjectPath GetBatteryServicePath() const; |
| |
| // Final object path components and the corresponding UUIDs of the GATT |
| // services that we emulate. Service paths are hierarchical to Bluetooth |
| // device paths, so if the path component is "service0000", and the device |
| // path is "/org/foo/device0", the service path is |
| // "/org/foo/device0/service0000". |
| static const char kHeartRateServicePathComponent[]; |
| static const char kHeartRateServiceUUID[]; |
| |
| // Final object path components and the corresponding UUIDs of the GATT |
| // services that we emulate. Service paths are hierarchical to Bluetooth |
| // device paths, so if the path component is "service0001", and the device |
| // path is "/org/foo/device0", the service path is |
| // "/org/foo/device0/service0001". |
| static const char kBatteryServicePathComponent[]; |
| static const char kBatteryServiceUUID[]; |
| |
| static const char kGenericAccessServiceUUID[]; |
| |
| private: |
| // Property callback passed when we create Properties structures. |
| void OnPropertyChanged(const dbus::ObjectPath& object_path, |
| const std::string& property_name); |
| |
| // Notifies observers. |
| void NotifyServiceAdded(const dbus::ObjectPath& object_path); |
| void NotifyServiceRemoved(const dbus::ObjectPath& object_path); |
| |
| // Tells FakeBluetoothGattCharacteristicClient to expose GATT characteristics. |
| // This is scheduled from ExposeHeartRateService to simulate asynchronous |
| // retrieval of characteristics. If the Heart Rate Service is hidden at the |
| // time this method is called, then it does nothing. |
| void ExposeHeartRateCharacteristics(); |
| |
| // Static properties we return. As long as a service is exposed, this will be |
| // non-null. Otherwise it will be null. |
| std::unique_ptr<Properties> heart_rate_service_properties_; |
| std::unique_ptr<Properties> battery_service_properties_; |
| std::string heart_rate_service_path_; |
| std::string battery_service_path_; |
| |
| // List of observers interested in event notifications from us. |
| base::ObserverList<Observer>::Unchecked observers_; |
| |
| // Weak pointer factory for generating 'this' pointers that might live longer |
| // than we do. |
| // Note: This should remain the last member so it'll be destroyed and |
| // invalidate its weak pointers before any other members are destroyed. |
| base::WeakPtrFactory<FakeBluetoothGattServiceClient> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FakeBluetoothGattServiceClient); |
| }; |
| |
| } // namespace bluez |
| |
| #endif // DEVICE_BLUETOOTH_DBUS_FAKE_BLUETOOTH_GATT_SERVICE_CLIENT_H_ |