1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_SERVICE_CLIENT_H_ 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_SERVICE_CLIENT_H_ 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <string> 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <vector> 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/scoped_ptr.h" 12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/memory/weak_ptr.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/observer_list.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chromeos/chromeos_export.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chromeos/dbus/bluetooth_gatt_service_client.h" 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "dbus/object_path.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "dbus/property.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace chromeos { 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// FakeBluetoothGattServiceClient simulates the behavior of the Bluetooth Daemon 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// GATT service objects and is used in test cases in place of a mock and on the 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Linux desktop. 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass CHROMEOS_EXPORT FakeBluetoothGattServiceClient 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : public BluetoothGattServiceClient { 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch struct Properties : public BluetoothGattServiceClient::Properties { 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch explicit Properties(const PropertyChangedCallback& callback); 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ~Properties(); 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // dbus::PropertySet override 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void Get(dbus::PropertyBase* property, 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch dbus::PropertySet::GetCallback callback) OVERRIDE; 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void GetAll() OVERRIDE; 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void Set(dbus::PropertyBase* property, 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch dbus::PropertySet::SetCallback callback) OVERRIDE; 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FakeBluetoothGattServiceClient(); 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ~FakeBluetoothGattServiceClient(); 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // DBusClient override. 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void Init(dbus::Bus* bus) OVERRIDE; 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // BluetoothGattServiceClient overrides. 46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void AddObserver(Observer* observer) OVERRIDE; 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void RemoveObserver(Observer* observer) OVERRIDE; 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual std::vector<dbus::ObjectPath> GetServices() OVERRIDE; 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual Properties* GetProperties(const dbus::ObjectPath& object_path) 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OVERRIDE; 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Makes a service visible for device with object path |device_path|. Note 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // that only one instance of a specific service is simulated at a time. Hence, 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // this method will fail, if the service is already visible. 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void ExposeHeartRateService(const dbus::ObjectPath& device_path); 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void HideHeartRateService(); 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns whether or not the Heart Rate Service is visible. 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool IsHeartRateVisible() const; 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns the current object path of the visible Heart Rate service. If the 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // service is not visible, returns an invalid empty path. 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch dbus::ObjectPath GetHeartRateServicePath() const; 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Final object path components and the corresponding UUIDs of the GATT 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // services that we emulate. Service paths are hierarchical to Bluetooth 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // device paths, so if the path component is "service0000", and the device 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // path is "/org/foo/device0", the service path is 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // "/org/foo/device0/service0000". 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static const char kHeartRateServicePathComponent[]; 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static const char kHeartRateServiceUUID[]; 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Property callback passed when we create Properties structures. 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void OnPropertyChanged(const dbus::ObjectPath& object_path, 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& property_name); 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Notifies observers. 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void NotifyServiceAdded(const dbus::ObjectPath& object_path); 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void NotifyServiceRemoved(const dbus::ObjectPath& object_path); 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Tells FakeBluetoothGattCharacteristicClient to expose GATT characteristics. 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // This is scheduled from ExposeHeartRateService to simulate asynchronous 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // retrieval of characteristics. If the Heart Rate Service is hidden at the 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // time this method is called, then it does nothing. 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ExposeHeartRateCharacteristics(); 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Static properties we return. As long as a service is exposed, this will be 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // non-null. Otherwise it will be null. 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<Properties> heart_rate_service_properties_; 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string heart_rate_service_path_; 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // List of observers interested in event notifications from us. 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ObserverList<Observer> observers_; 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Weak pointer factory for generating 'this' pointers that might live longer 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // than we do. 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Note: This should remain the last member so it'll be destroyed and 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // invalidate its weak pointers before any other members are destroyed. 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::WeakPtrFactory<FakeBluetoothGattServiceClient> weak_ptr_factory_; 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(FakeBluetoothGattServiceClient); 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace chromeos 106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif // CHROMEOS_DBUS_FAKE_BLUETOOTH_GATT_SERVICE_CLIENT_H_ 108