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_DESCRIPTOR_CLIENT_H_ 6 #define CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_DESCRIPTOR_CLIENT_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/memory/weak_ptr.h" 12 #include "base/observer_list.h" 13 #include "chromeos/chromeos_export.h" 14 #include "chromeos/dbus/bluetooth_gatt_descriptor_client.h" 15 #include "dbus/object_path.h" 16 17 namespace chromeos { 18 19 // FakeBluetoothGattDescriptorClient simulates the behavior of the Bluetooth 20 // Daemon GATT characteristic descriptor objects and is used in test cases in 21 // place of a mock and on the Linux desktop. 22 class CHROMEOS_EXPORT FakeBluetoothGattDescriptorClient 23 : public BluetoothGattDescriptorClient { 24 public: 25 struct Properties : public BluetoothGattDescriptorClient::Properties { 26 explicit Properties(const PropertyChangedCallback& callback); 27 virtual ~Properties(); 28 29 // dbus::PropertySet override 30 virtual void Get(dbus::PropertyBase* property, 31 dbus::PropertySet::GetCallback callback) OVERRIDE; 32 virtual void GetAll() OVERRIDE; 33 virtual void Set(dbus::PropertyBase* property, 34 dbus::PropertySet::SetCallback callback) OVERRIDE; 35 }; 36 37 FakeBluetoothGattDescriptorClient(); 38 virtual ~FakeBluetoothGattDescriptorClient(); 39 40 // DBusClient override. 41 virtual void Init(dbus::Bus* bus) OVERRIDE; 42 43 // BluetoothGattDescriptorClient overrides. 44 virtual void AddObserver(Observer* observer) OVERRIDE; 45 virtual void RemoveObserver(Observer* observer) OVERRIDE; 46 virtual std::vector<dbus::ObjectPath> GetDescriptors() OVERRIDE; 47 virtual Properties* GetProperties(const dbus::ObjectPath& object_path) 48 OVERRIDE; 49 virtual void ReadValue(const dbus::ObjectPath& object_path, 50 const ValueCallback& callback, 51 const ErrorCallback& error_callback) OVERRIDE; 52 virtual void WriteValue(const dbus::ObjectPath& object_path, 53 const std::vector<uint8>& value, 54 const base::Closure& callback, 55 const ErrorCallback& error_callback) OVERRIDE; 56 57 // Makes the descriptor with the UUID |uuid| visible under the characteristic 58 // with object path |characteristic_path|. Descriptor object paths are 59 // hierarchical to their characteristics. |uuid| must belong to a descriptor 60 // for which there is a constant defined below, otherwise this method has no 61 // effect. Returns the object path of the created descriptor. In the no-op 62 // case, returns an invalid path. 63 dbus::ObjectPath ExposeDescriptor(const dbus::ObjectPath& characteristic_path, 64 const std::string& uuid); 65 void HideDescriptor(const dbus::ObjectPath& descriptor_path); 66 67 // Object path components and UUIDs of GATT characteristic descriptors. 68 static const char kClientCharacteristicConfigurationPathComponent[]; 69 static const char kClientCharacteristicConfigurationUUID[]; 70 71 private: 72 // Property callback passed when we create Properties structures. 73 void OnPropertyChanged(const dbus::ObjectPath& object_path, 74 const std::string& property_name); 75 76 // Notifies observers. 77 void NotifyDescriptorAdded(const dbus::ObjectPath& object_path); 78 void NotifyDescriptorRemoved(const dbus::ObjectPath& object_path); 79 80 // Mapping from object paths to Properties structures. 81 struct DescriptorData { 82 DescriptorData(); 83 ~DescriptorData(); 84 85 scoped_ptr<Properties> properties; 86 std::vector<uint8> value; 87 }; 88 typedef std::map<dbus::ObjectPath, DescriptorData*> PropertiesMap; 89 PropertiesMap properties_; 90 91 // List of observers interested in event notifications from us. 92 ObserverList<Observer> observers_; 93 94 // Weak pointer factory for generating 'this' pointers that might live longer 95 // than we do. 96 // Note: This should remain the last member so it'll be destroyed and 97 // invalidate its weak pointers before any other members are destroyed. 98 base::WeakPtrFactory<FakeBluetoothGattDescriptorClient> 99 weak_ptr_factory_; 100 101 DISALLOW_COPY_AND_ASSIGN(FakeBluetoothGattDescriptorClient); 102 }; 103 104 } // namespace chromeos 105 106 #endif // CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_DESCRIPTOR_CLIENT_H_ 107