• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_chromeos.h"
6 
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/strings/stringprintf.h"
10 #include "chromeos/dbus/bluetooth_gatt_descriptor_client.h"
11 #include "chromeos/dbus/dbus_thread_manager.h"
12 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_chromeos.h"
13 #include "device/bluetooth/bluetooth_remote_gatt_service_chromeos.h"
14 
15 namespace chromeos {
16 
17 namespace {
18 
19 // Stream operator for logging vector<uint8>.
operator <<(std::ostream & out,const std::vector<uint8> bytes)20 std::ostream& operator<<(std::ostream& out, const std::vector<uint8> bytes) {
21   out << "[";
22   for (std::vector<uint8>::const_iterator iter = bytes.begin();
23        iter != bytes.end(); ++iter) {
24     out << base::StringPrintf("%02X", *iter);
25   }
26   return out << "]";
27 }
28 
29 }  // namespace
30 
BluetoothRemoteGattDescriptorChromeOS(BluetoothRemoteGattCharacteristicChromeOS * characteristic,const dbus::ObjectPath & object_path)31 BluetoothRemoteGattDescriptorChromeOS::BluetoothRemoteGattDescriptorChromeOS(
32     BluetoothRemoteGattCharacteristicChromeOS* characteristic,
33     const dbus::ObjectPath& object_path)
34     : object_path_(object_path),
35       characteristic_(characteristic),
36       weak_ptr_factory_(this) {
37   VLOG(1) << "Creating remote GATT descriptor with identifier: "
38           << GetIdentifier() << ", UUID: " << GetUUID().canonical_value();
39 }
40 
41 BluetoothRemoteGattDescriptorChromeOS::
~BluetoothRemoteGattDescriptorChromeOS()42     ~BluetoothRemoteGattDescriptorChromeOS() {
43 }
44 
GetIdentifier() const45 std::string BluetoothRemoteGattDescriptorChromeOS::GetIdentifier() const {
46   return object_path_.value();
47 }
48 
GetUUID() const49 device::BluetoothUUID BluetoothRemoteGattDescriptorChromeOS::GetUUID() const {
50   BluetoothGattDescriptorClient::Properties* properties =
51       DBusThreadManager::Get()->GetBluetoothGattDescriptorClient()->
52           GetProperties(object_path_);
53   DCHECK(properties);
54   return device::BluetoothUUID(properties->uuid.value());
55 }
56 
IsLocal() const57 bool BluetoothRemoteGattDescriptorChromeOS::IsLocal() const {
58   return false;
59 }
60 
61 const std::vector<uint8>&
GetValue() const62 BluetoothRemoteGattDescriptorChromeOS::GetValue() const {
63   return cached_value_;
64 }
65 
66 device::BluetoothGattCharacteristic*
GetCharacteristic() const67 BluetoothRemoteGattDescriptorChromeOS::GetCharacteristic() const {
68   return characteristic_;
69 }
70 
71 device::BluetoothGattCharacteristic::Permissions
GetPermissions() const72 BluetoothRemoteGattDescriptorChromeOS::GetPermissions() const {
73   // TODO(armansito): Once BlueZ defines the permissions, return the correct
74   // values here.
75   return device::BluetoothGattCharacteristic::kPermissionNone;
76 }
77 
ReadRemoteDescriptor(const ValueCallback & callback,const ErrorCallback & error_callback)78 void BluetoothRemoteGattDescriptorChromeOS::ReadRemoteDescriptor(
79     const ValueCallback& callback,
80     const ErrorCallback& error_callback) {
81   VLOG(1) << "Sending GATT characteristic descriptor read request to "
82           << "descriptor: " << GetIdentifier() << ", UUID: "
83           << GetUUID().canonical_value();
84 
85   DBusThreadManager::Get()->GetBluetoothGattDescriptorClient()->ReadValue(
86       object_path_,
87       base::Bind(&BluetoothRemoteGattDescriptorChromeOS::OnValueSuccess,
88                  weak_ptr_factory_.GetWeakPtr(),
89                  callback),
90       base::Bind(&BluetoothRemoteGattDescriptorChromeOS::OnError,
91                  weak_ptr_factory_.GetWeakPtr(),
92                  error_callback));
93 }
94 
WriteRemoteDescriptor(const std::vector<uint8> & new_value,const base::Closure & callback,const ErrorCallback & error_callback)95 void BluetoothRemoteGattDescriptorChromeOS::WriteRemoteDescriptor(
96     const std::vector<uint8>& new_value,
97     const base::Closure& callback,
98     const ErrorCallback& error_callback) {
99   VLOG(1) << "Sending GATT characteristic descriptor write request to "
100           << "characteristic: " << GetIdentifier() << ", UUID: "
101           << GetUUID().canonical_value() << ", with value: "
102           << new_value << ".";
103 
104   DBusThreadManager::Get()->GetBluetoothGattDescriptorClient()->WriteValue(
105       object_path_,
106       new_value,
107       callback,
108       base::Bind(&BluetoothRemoteGattDescriptorChromeOS::OnError,
109                  weak_ptr_factory_.GetWeakPtr(),
110                  error_callback));
111 }
112 
OnValueSuccess(const ValueCallback & callback,const std::vector<uint8> & value)113 void BluetoothRemoteGattDescriptorChromeOS::OnValueSuccess(
114     const ValueCallback& callback,
115     const std::vector<uint8>& value) {
116   VLOG(1) << "Descriptor value read: " << value;
117   cached_value_ = value;
118 
119   DCHECK(characteristic_);
120   BluetoothRemoteGattServiceChromeOS* service =
121       static_cast<BluetoothRemoteGattServiceChromeOS*>(
122           characteristic_->GetService());
123   DCHECK(service);
124   service->NotifyDescriptorValueChanged(characteristic_, this, value);
125   callback.Run(value);
126 }
127 
OnError(const ErrorCallback & error_callback,const std::string & error_name,const std::string & error_message)128 void BluetoothRemoteGattDescriptorChromeOS::OnError(
129     const ErrorCallback& error_callback,
130     const std::string& error_name,
131     const std::string& error_message) {
132   VLOG(1) << "Operation failed: " << error_name
133           << ", message: " << error_message;
134   error_callback.Run();
135 }
136 
137 }  // namespace chromeos
138