OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "device/bluetooth/bluetooth_remote_gatt_service_chromeos.h" | 5 #include "device/bluetooth/bluetooth_remote_gatt_service_chromeos.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "chromeos/dbus/bluetooth_gatt_service_client.h" | |
10 #include "chromeos/dbus/dbus_thread_manager.h" | |
11 #include "device/bluetooth/bluetooth_adapter_chromeos.h" | 9 #include "device/bluetooth/bluetooth_adapter_chromeos.h" |
12 #include "device/bluetooth/bluetooth_device_chromeos.h" | 10 #include "device/bluetooth/bluetooth_device_chromeos.h" |
13 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_chromeos.h" | 11 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_chromeos.h" |
14 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_chromeos.h" | 12 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_chromeos.h" |
| 13 #include "device/bluetooth/dbus/bluetooth_gatt_service_client.h" |
| 14 #include "device/bluetooth/dbus/bluez_dbus_manager.h" |
15 | 15 |
16 namespace chromeos { | 16 namespace chromeos { |
17 | 17 |
18 namespace { | 18 namespace { |
19 | 19 |
20 // TODO(jamuraa) move these to cros_system_api later | 20 // TODO(jamuraa) move these to cros_system_api later |
21 const char kErrorFailed[] = "org.bluez.Error.Failed"; | 21 const char kErrorFailed[] = "org.bluez.Error.Failed"; |
22 const char kErrorInProgress[] = "org.bluez.Error.InProgress"; | 22 const char kErrorInProgress[] = "org.bluez.Error.InProgress"; |
23 const char kErrorInvalidValueLength[] = "org.bluez.Error.InvalidValueLength"; | 23 const char kErrorInvalidValueLength[] = "org.bluez.Error.InvalidValueLength"; |
24 const char kErrorNotAuthorized[] = "org.bluez.Error.NotAuthorized"; | 24 const char kErrorNotAuthorized[] = "org.bluez.Error.NotAuthorized"; |
25 const char kErrorNotPaired[] = "org.bluez.Error.NotPaired"; | 25 const char kErrorNotPaired[] = "org.bluez.Error.NotPaired"; |
26 const char kErrorNotSupported[] = "org.bluez.Error.NotSupported"; | 26 const char kErrorNotSupported[] = "org.bluez.Error.NotSupported"; |
27 const char kErrorNotPermitted[] = "org.bluez.Error.NotPermitted"; | 27 const char kErrorNotPermitted[] = "org.bluez.Error.NotPermitted"; |
28 | 28 |
29 } // namespace | 29 } // namespace |
30 | 30 |
31 BluetoothRemoteGattServiceChromeOS::BluetoothRemoteGattServiceChromeOS( | 31 BluetoothRemoteGattServiceChromeOS::BluetoothRemoteGattServiceChromeOS( |
32 BluetoothAdapterChromeOS* adapter, | 32 BluetoothAdapterChromeOS* adapter, |
33 BluetoothDeviceChromeOS* device, | 33 BluetoothDeviceChromeOS* device, |
34 const dbus::ObjectPath& object_path) | 34 const dbus::ObjectPath& object_path) |
35 : object_path_(object_path), | 35 : object_path_(object_path), |
36 adapter_(adapter), | 36 adapter_(adapter), |
37 device_(device), | 37 device_(device), |
38 discovery_complete_(false), | 38 discovery_complete_(false), |
39 weak_ptr_factory_(this) { | 39 weak_ptr_factory_(this) { |
40 VLOG(1) << "Creating remote GATT service with identifier: " | 40 VLOG(1) << "Creating remote GATT service with identifier: " |
41 << object_path.value() << ", UUID: " << GetUUID().canonical_value(); | 41 << object_path.value() << ", UUID: " << GetUUID().canonical_value(); |
42 DCHECK(adapter_); | 42 DCHECK(adapter_); |
43 | 43 |
44 DBusThreadManager::Get()->GetBluetoothGattServiceClient()->AddObserver(this); | 44 bluez::BluezDBusManager::Get()->GetBluetoothGattServiceClient()->AddObserver( |
45 DBusThreadManager::Get()->GetBluetoothGattCharacteristicClient()-> | 45 this); |
46 AddObserver(this); | 46 bluez::BluezDBusManager::Get() |
| 47 ->GetBluetoothGattCharacteristicClient() |
| 48 ->AddObserver(this); |
47 | 49 |
48 // Add all known GATT characteristics. | 50 // Add all known GATT characteristics. |
49 const std::vector<dbus::ObjectPath>& gatt_chars = | 51 const std::vector<dbus::ObjectPath>& gatt_chars = |
50 DBusThreadManager::Get()->GetBluetoothGattCharacteristicClient()-> | 52 bluez::BluezDBusManager::Get() |
51 GetCharacteristics(); | 53 ->GetBluetoothGattCharacteristicClient() |
| 54 ->GetCharacteristics(); |
52 for (std::vector<dbus::ObjectPath>::const_iterator iter = gatt_chars.begin(); | 55 for (std::vector<dbus::ObjectPath>::const_iterator iter = gatt_chars.begin(); |
53 iter != gatt_chars.end(); ++iter) | 56 iter != gatt_chars.end(); ++iter) |
54 GattCharacteristicAdded(*iter); | 57 GattCharacteristicAdded(*iter); |
55 } | 58 } |
56 | 59 |
57 BluetoothRemoteGattServiceChromeOS::~BluetoothRemoteGattServiceChromeOS() { | 60 BluetoothRemoteGattServiceChromeOS::~BluetoothRemoteGattServiceChromeOS() { |
58 DBusThreadManager::Get()->GetBluetoothGattServiceClient()-> | 61 bluez::BluezDBusManager::Get() |
59 RemoveObserver(this); | 62 ->GetBluetoothGattServiceClient() |
60 DBusThreadManager::Get()->GetBluetoothGattCharacteristicClient()-> | 63 ->RemoveObserver(this); |
61 RemoveObserver(this); | 64 bluez::BluezDBusManager::Get() |
| 65 ->GetBluetoothGattCharacteristicClient() |
| 66 ->RemoveObserver(this); |
62 | 67 |
63 // Clean up all the characteristics. Copy the characteristics list here and | 68 // Clean up all the characteristics. Copy the characteristics list here and |
64 // clear the original so that when we send GattCharacteristicRemoved(), | 69 // clear the original so that when we send GattCharacteristicRemoved(), |
65 // GetCharacteristics() returns no characteristics. | 70 // GetCharacteristics() returns no characteristics. |
66 CharacteristicMap characteristics = characteristics_; | 71 CharacteristicMap characteristics = characteristics_; |
67 characteristics_.clear(); | 72 characteristics_.clear(); |
68 for (CharacteristicMap::iterator iter = characteristics.begin(); | 73 for (CharacteristicMap::iterator iter = characteristics.begin(); |
69 iter != characteristics.end(); ++iter) { | 74 iter != characteristics.end(); ++iter) { |
70 DCHECK(adapter_); | 75 DCHECK(adapter_); |
71 adapter_->NotifyGattCharacteristicRemoved(iter->second); | 76 adapter_->NotifyGattCharacteristicRemoved(iter->second); |
72 | 77 |
73 delete iter->second; | 78 delete iter->second; |
74 } | 79 } |
75 } | 80 } |
76 | 81 |
77 std::string BluetoothRemoteGattServiceChromeOS::GetIdentifier() const { | 82 std::string BluetoothRemoteGattServiceChromeOS::GetIdentifier() const { |
78 return object_path_.value(); | 83 return object_path_.value(); |
79 } | 84 } |
80 | 85 |
81 device::BluetoothUUID BluetoothRemoteGattServiceChromeOS::GetUUID() const { | 86 device::BluetoothUUID BluetoothRemoteGattServiceChromeOS::GetUUID() const { |
82 BluetoothGattServiceClient::Properties* properties = | 87 bluez::BluetoothGattServiceClient::Properties* properties = |
83 DBusThreadManager::Get()->GetBluetoothGattServiceClient()-> | 88 bluez::BluezDBusManager::Get() |
84 GetProperties(object_path_); | 89 ->GetBluetoothGattServiceClient() |
| 90 ->GetProperties(object_path_); |
85 DCHECK(properties); | 91 DCHECK(properties); |
86 return device::BluetoothUUID(properties->uuid.value()); | 92 return device::BluetoothUUID(properties->uuid.value()); |
87 } | 93 } |
88 | 94 |
89 bool BluetoothRemoteGattServiceChromeOS::IsLocal() const { | 95 bool BluetoothRemoteGattServiceChromeOS::IsLocal() const { |
90 return false; | 96 return false; |
91 } | 97 } |
92 | 98 |
93 bool BluetoothRemoteGattServiceChromeOS::IsPrimary() const { | 99 bool BluetoothRemoteGattServiceChromeOS::IsPrimary() const { |
94 BluetoothGattServiceClient::Properties* properties = | 100 bluez::BluetoothGattServiceClient::Properties* properties = |
95 DBusThreadManager::Get()->GetBluetoothGattServiceClient()-> | 101 bluez::BluezDBusManager::Get() |
96 GetProperties(object_path_); | 102 ->GetBluetoothGattServiceClient() |
| 103 ->GetProperties(object_path_); |
97 DCHECK(properties); | 104 DCHECK(properties); |
98 return properties->primary.value(); | 105 return properties->primary.value(); |
99 } | 106 } |
100 | 107 |
101 device::BluetoothDevice* BluetoothRemoteGattServiceChromeOS::GetDevice() const { | 108 device::BluetoothDevice* BluetoothRemoteGattServiceChromeOS::GetDevice() const { |
102 return device_; | 109 return device_; |
103 } | 110 } |
104 | 111 |
105 std::vector<device::BluetoothGattCharacteristic*> | 112 std::vector<device::BluetoothGattCharacteristic*> |
106 BluetoothRemoteGattServiceChromeOS::GetCharacteristics() const { | 113 BluetoothRemoteGattServiceChromeOS::GetCharacteristics() const { |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 } | 227 } |
221 | 228 |
222 void BluetoothRemoteGattServiceChromeOS::GattServicePropertyChanged( | 229 void BluetoothRemoteGattServiceChromeOS::GattServicePropertyChanged( |
223 const dbus::ObjectPath& object_path, | 230 const dbus::ObjectPath& object_path, |
224 const std::string& property_name){ | 231 const std::string& property_name){ |
225 if (object_path != object_path_) | 232 if (object_path != object_path_) |
226 return; | 233 return; |
227 | 234 |
228 VLOG(1) << "Service property changed: \"" << property_name << "\", " | 235 VLOG(1) << "Service property changed: \"" << property_name << "\", " |
229 << object_path.value(); | 236 << object_path.value(); |
230 BluetoothGattServiceClient::Properties* properties = | 237 bluez::BluetoothGattServiceClient::Properties* properties = |
231 DBusThreadManager::Get()->GetBluetoothGattServiceClient()->GetProperties( | 238 bluez::BluezDBusManager::Get() |
232 object_path); | 239 ->GetBluetoothGattServiceClient() |
| 240 ->GetProperties(object_path); |
233 DCHECK(properties); | 241 DCHECK(properties); |
234 | 242 |
235 if (property_name != properties->characteristics.name()) { | 243 if (property_name != properties->characteristics.name()) { |
236 NotifyServiceChanged(); | 244 NotifyServiceChanged(); |
237 return; | 245 return; |
238 } | 246 } |
239 | 247 |
240 if (discovery_complete_) | 248 if (discovery_complete_) |
241 return; | 249 return; |
242 | 250 |
243 VLOG(1) << "All characteristics were discovered for service: " | 251 VLOG(1) << "All characteristics were discovered for service: " |
244 << object_path.value(); | 252 << object_path.value(); |
245 discovery_complete_ = true; | 253 discovery_complete_ = true; |
246 DCHECK(adapter_); | 254 DCHECK(adapter_); |
247 adapter_->NotifyGattDiscoveryComplete(this); | 255 adapter_->NotifyGattDiscoveryComplete(this); |
248 } | 256 } |
249 | 257 |
250 void BluetoothRemoteGattServiceChromeOS::GattCharacteristicAdded( | 258 void BluetoothRemoteGattServiceChromeOS::GattCharacteristicAdded( |
251 const dbus::ObjectPath& object_path) { | 259 const dbus::ObjectPath& object_path) { |
252 if (characteristics_.find(object_path) != characteristics_.end()) { | 260 if (characteristics_.find(object_path) != characteristics_.end()) { |
253 VLOG(1) << "Remote GATT characteristic already exists: " | 261 VLOG(1) << "Remote GATT characteristic already exists: " |
254 << object_path.value(); | 262 << object_path.value(); |
255 return; | 263 return; |
256 } | 264 } |
257 | 265 |
258 BluetoothGattCharacteristicClient::Properties* properties = | 266 bluez::BluetoothGattCharacteristicClient::Properties* properties = |
259 DBusThreadManager::Get()->GetBluetoothGattCharacteristicClient()-> | 267 bluez::BluezDBusManager::Get() |
260 GetProperties(object_path); | 268 ->GetBluetoothGattCharacteristicClient() |
| 269 ->GetProperties(object_path); |
261 DCHECK(properties); | 270 DCHECK(properties); |
262 if (properties->service.value() != object_path_) { | 271 if (properties->service.value() != object_path_) { |
263 VLOG(2) << "Remote GATT characteristic does not belong to this service."; | 272 VLOG(2) << "Remote GATT characteristic does not belong to this service."; |
264 return; | 273 return; |
265 } | 274 } |
266 | 275 |
267 VLOG(1) << "Adding new remote GATT characteristic for GATT service: " | 276 VLOG(1) << "Adding new remote GATT characteristic for GATT service: " |
268 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); | 277 << GetIdentifier() << ", UUID: " << GetUUID().canonical_value(); |
269 | 278 |
270 BluetoothRemoteGattCharacteristicChromeOS* characteristic = | 279 BluetoothRemoteGattCharacteristicChromeOS* characteristic = |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 if (iter == characteristics_.end()) { | 314 if (iter == characteristics_.end()) { |
306 VLOG(3) << "Properties of unknown characteristic changed"; | 315 VLOG(3) << "Properties of unknown characteristic changed"; |
307 return; | 316 return; |
308 } | 317 } |
309 | 318 |
310 // We may receive a property changed event in certain cases, e.g. when the | 319 // We may receive a property changed event in certain cases, e.g. when the |
311 // characteristic "Flags" property has been updated with values from the | 320 // characteristic "Flags" property has been updated with values from the |
312 // "Characteristic Extended Properties" descriptor. In this case, kick off | 321 // "Characteristic Extended Properties" descriptor. In this case, kick off |
313 // a service changed observer event to let observers refresh the | 322 // a service changed observer event to let observers refresh the |
314 // characteristics. | 323 // characteristics. |
315 BluetoothGattCharacteristicClient::Properties* properties = | 324 bluez::BluetoothGattCharacteristicClient::Properties* properties = |
316 DBusThreadManager::Get()->GetBluetoothGattCharacteristicClient()-> | 325 bluez::BluezDBusManager::Get() |
317 GetProperties(object_path); | 326 ->GetBluetoothGattCharacteristicClient() |
| 327 ->GetProperties(object_path); |
318 | 328 |
319 DCHECK(properties); | 329 DCHECK(properties); |
320 DCHECK(adapter_); | 330 DCHECK(adapter_); |
321 | 331 |
322 if (property_name == properties->flags.name()) | 332 if (property_name == properties->flags.name()) |
323 NotifyServiceChanged(); | 333 NotifyServiceChanged(); |
324 else if (property_name == properties->value.name()) | 334 else if (property_name == properties->value.name()) |
325 adapter_->NotifyGattCharacteristicValueChanged(iter->second, | 335 adapter_->NotifyGattCharacteristicValueChanged(iter->second, |
326 properties->value.value()); | 336 properties->value.value()); |
327 } | 337 } |
328 | 338 |
329 } // namespace chromeos | 339 } // namespace chromeos |
OLD | NEW |