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 DEVICE_BLUETOOTH_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_CHROMEOS_H_
6#define DEVICE_BLUETOOTH_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_CHROMEOS_H_
7
8#include <string>
9#include <vector>
10
11#include "base/memory/weak_ptr.h"
12#include "dbus/object_path.h"
13#include "device/bluetooth/bluetooth_gatt_descriptor.h"
14#include "device/bluetooth/bluetooth_uuid.h"
15
16namespace device {
17
18class BluetoothGattCharacteristic;
19
20}  // namespace device
21
22namespace chromeos {
23
24class BluetoothRemoteGattCharacteristicChromeOS;
25
26// The BluetoothRemoteGattDescriptorChromeOS class implements
27// BluetoothGattDescriptor for remote GATT characteristic descriptors on the
28// Chrome OS platform.
29class BluetoothRemoteGattDescriptorChromeOS
30    : public device::BluetoothGattDescriptor {
31 public:
32  // device::BluetoothGattDescriptor overrides.
33  virtual std::string GetIdentifier() const OVERRIDE;
34  virtual device::BluetoothUUID GetUUID() const OVERRIDE;
35  virtual bool IsLocal() const OVERRIDE;
36  virtual const std::vector<uint8>& GetValue() const OVERRIDE;
37  virtual device::BluetoothGattCharacteristic*
38      GetCharacteristic() const OVERRIDE;
39  virtual device::BluetoothGattCharacteristic::Permissions
40      GetPermissions() const OVERRIDE;
41  virtual void ReadRemoteDescriptor(
42      const ValueCallback& callback,
43      const ErrorCallback& error_callback) OVERRIDE;
44  virtual void WriteRemoteDescriptor(
45      const std::vector<uint8>& new_value,
46      const base::Closure& callback,
47      const ErrorCallback& error_callback) OVERRIDE;
48
49  // Object path of the underlying D-Bus characteristic.
50  const dbus::ObjectPath& object_path() const { return object_path_; }
51
52 private:
53  friend class BluetoothRemoteGattCharacteristicChromeOS;
54
55  BluetoothRemoteGattDescriptorChromeOS(
56      BluetoothRemoteGattCharacteristicChromeOS* characteristic,
57      const dbus::ObjectPath& object_path);
58  virtual ~BluetoothRemoteGattDescriptorChromeOS();
59
60  // Called by dbus:: on successful completion of a request to read
61  // the descriptor value.
62  void OnValueSuccess(const ValueCallback& callback,
63                      const std::vector<uint8>& value);
64
65  // Called by dbus:: on unsuccessful completion of a request to read or write
66  // the descriptor value.
67  void OnError(const ErrorCallback& error_callback,
68               const std::string& error_name,
69               const std::string& error_message);
70
71  // Object path of the D-Bus descriptor object.
72  dbus::ObjectPath object_path_;
73
74  // The GATT characteristic this descriptor belongs to.
75  BluetoothRemoteGattCharacteristicChromeOS* characteristic_;
76
77  // The cached characteristic value based on the most recent read request.
78  std::vector<uint8> cached_value_;
79
80  // Note: This should remain the last member so it'll be destroyed and
81  // invalidate its weak pointers before any other members are destroyed.
82  base::WeakPtrFactory<BluetoothRemoteGattDescriptorChromeOS> weak_ptr_factory_;
83
84  DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteGattDescriptorChromeOS);
85};
86
87}  // namespace chromeos
88
89#endif  // DEVICE_BLUETOOTH_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_CHROMEOS_H_
90