summaryrefslogtreecommitdiffstats
path: root/chromeos/dbus/bluetooth_gatt_characteristic_client.h
blob: ab5fd702dfb03f5175c0d59fff906da4c589f59b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// 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 CHROMEOS_DBUS_BLUETOOTH_GATT_CHARACTERISTIC_CLIENT_H_
#define CHROMEOS_DBUS_BLUETOOTH_GATT_CHARACTERISTIC_CLIENT_H_

#include <string>

#include "base/basictypes.h"
#include "base/callback.h"
#include "chromeos/chromeos_export.h"
#include "chromeos/dbus/dbus_client.h"
#include "dbus/object_path.h"
#include "dbus/property.h"

namespace chromeos {

// BluetoothGattCharacteristicClient is used to communicate with remote GATT
// characteristic objects exposed by the Bluetooth daemon.
class CHROMEOS_EXPORT BluetoothGattCharacteristicClient : public DBusClient {
 public:
  // Structure of properties associated with GATT characteristics.
  struct Properties : public dbus::PropertySet {
    // The 128-bit characteristic UUID. [read-only]
    dbus::Property<std::string> uuid;

    // Object path of the GATT service the characteristic belongs to.
    // [read-only]
    dbus::Property<dbus::ObjectPath> service;

    // Whether or not this characteristic is currently sending ValueUpdated
    // signals. [read-only]
    dbus::Property<bool> notifying;

    // List of flags representing the GATT "Characteristic Properties bit field"
    // and properties read from the GATT "Characteristic Extended Properties"
    // descriptor bit field. [read-only, optional]
    dbus::Property<std::vector<std::string> > flags;

    // Array of object paths representing the descriptors of this
    // characteristic. [read-only]
    dbus::Property<std::vector<dbus::ObjectPath> > descriptors;

    Properties(dbus::ObjectProxy* object_proxy,
               const std::string& interface_name,
               const PropertyChangedCallback& callback);
    virtual ~Properties();
  };

  // Interface for observing changes from a remote GATT characteristic.
  class Observer {
   public:
    virtual ~Observer() {}

    // Called when the GATT characteristic with object path |object_path| is
    // added to the system.
    virtual void GattCharacteristicAdded(const dbus::ObjectPath& object_path) {}

    // Called when the GATT characteristic with object path |object_path| is
    // removed from the system.
    virtual void GattCharacteristicRemoved(
        const dbus::ObjectPath& object_path) {}

    // Called when the GATT characteristic with object path |object_path| has a
    // change in the value of the property named |property_name|.
    virtual void GattCharacteristicPropertyChanged(
        const dbus::ObjectPath& object_path,
        const std::string& property_name) {}

    // Called when a "ValueUpdated" signal is received from the remote GATT
    // characteristic with object path |object_path| with characteristic value
    // |value|.
    virtual void GattCharacteristicValueUpdated(
        const dbus::ObjectPath& object_path,
        const std::vector<uint8>& value) {}
  };

  // Callbacks used to report the result of asynchronous methods.
  typedef base::Callback<void(const std::string& error_name,
                              const std::string& error_message)> ErrorCallback;
  typedef base::Callback<void(const std::vector<uint8>& value)> ValueCallback;

  virtual ~BluetoothGattCharacteristicClient();

  // Adds and removes observers for events on all remote GATT characteristics.
  // Check the |object_path| parameter of observer methods to determine which
  // GATT characteristic is issuing the event.
  virtual void AddObserver(Observer* observer) = 0;
  virtual void RemoveObserver(Observer* observer) = 0;

  // Returns the list of GATT characteristic object paths known to the system.
  virtual std::vector<dbus::ObjectPath> GetCharacteristics() = 0;

  // Obtain the properties for the GATT characteristic with object path
  // |object_path|. Values should be copied if needed.
  virtual Properties* GetProperties(const dbus::ObjectPath& object_path) = 0;

  // Issues a request to read the value of GATT characteristic with object path
  // |object_path| and returns the value in |callback| on success. On error,
  // invokes |error_callback|.
  virtual void ReadValue(const dbus::ObjectPath& object_path,
                         const ValueCallback& callback,
                         const ErrorCallback& error_callback) = 0;

  // Issues a request to write the value of GATT characteristic with object path
  // |object_path| with value |value|. Invokes |callback| on success and
  // |error_callback| on failure.
  virtual void WriteValue(const dbus::ObjectPath& object_path,
                          const std::vector<uint8>& value,
                          const base::Closure& callback,
                          const ErrorCallback& error_callback) = 0;

  // Starts a notification session from this characteristic with object path
  // |object_path| if it supports value notifications or indications. Invokes
  // |callback| on success and |error_callback| on failure.
  virtual void StartNotify(const dbus::ObjectPath& object_path,
                           const base::Closure& callback,
                           const ErrorCallback& error_callback) = 0;

  // Cancels any previous StartNotify transaction for characteristic with
  // object path |object_path|. Invokes |callback| on success and
  // |error_callback| on failure.
  virtual void StopNotify(const dbus::ObjectPath& object_path,
                          const base::Closure& callback,
                          const ErrorCallback& error_callback) = 0;

  // Creates the instance.
  static BluetoothGattCharacteristicClient* Create();

  // Constants used to indicate exceptional error conditions.
  static const char kNoResponseError[];
  static const char kUnknownCharacteristicError[];

 protected:
  BluetoothGattCharacteristicClient();

 private:
  DISALLOW_COPY_AND_ASSIGN(BluetoothGattCharacteristicClient);
};

}  // namespace chromeos

#endif  // CHROMEOS_DBUS_BLUETOOTH_GATT_CHARACTERISTIC_CLIENT_H_