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