Chromium Code Reviews| 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 "chromeos/dbus/bluetooth_gatt_characteristic_client.h" | 5 #include "chromeos/dbus/bluetooth_gatt_characteristic_client.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
| 9 #include "base/observer_list.h" | 9 #include "base/observer_list.h" |
| 10 #include "dbus/bus.h" | 10 #include "dbus/bus.h" |
| 11 #include "dbus/object_manager.h" | 11 #include "dbus/object_manager.h" |
| 12 #include "third_party/cros_system_api/dbus/service_constants.h" | 12 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 13 | 13 |
| 14 namespace chromeos { | 14 namespace chromeos { |
| 15 | 15 |
| 16 namespace { | |
| 17 | |
| 18 // TODO(armansito): Move these definitions to service_constants.h | |
| 19 const char kReadValue[] = "ReadValue"; | |
| 20 const char kWriteValue[] = "WriteValue"; | |
| 21 const char kValueUpdatedSignal[] = "ValueUpdated"; | |
| 22 | |
|
keybuk
2014/05/30 22:22:40
There doesn't seem to be any reason NOT to do this
armansito
2014/05/30 22:37:20
I guess... At first I wanted to wait until I had t
armansito
2014/06/05 06:14:22
Done.
| |
| 23 } // namespace | |
| 24 | |
| 25 // static | |
| 26 const char BluetoothGattCharacteristicClient::kNoResponseError[] = | |
| 27 "org.chromium.Error.NoResponse"; | |
| 28 // static | |
| 29 const char BluetoothGattCharacteristicClient::kUnknownCharacteristicError[] = | |
| 30 "org.chromium.Error.UnknownCharacteristic"; | |
| 31 | |
| 16 BluetoothGattCharacteristicClient::Properties::Properties( | 32 BluetoothGattCharacteristicClient::Properties::Properties( |
| 17 dbus::ObjectProxy* object_proxy, | 33 dbus::ObjectProxy* object_proxy, |
| 18 const std::string& interface_name, | 34 const std::string& interface_name, |
| 19 const PropertyChangedCallback& callback) | 35 const PropertyChangedCallback& callback) |
| 20 : dbus::PropertySet(object_proxy, interface_name, callback) { | 36 : dbus::PropertySet(object_proxy, interface_name, callback) { |
| 21 RegisterProperty(bluetooth_gatt_characteristic::kUUIDProperty, &uuid); | 37 RegisterProperty(bluetooth_gatt_characteristic::kUUIDProperty, &uuid); |
| 22 RegisterProperty(bluetooth_gatt_characteristic::kServiceProperty, &service); | 38 RegisterProperty(bluetooth_gatt_characteristic::kServiceProperty, &service); |
| 23 RegisterProperty(bluetooth_gatt_characteristic::kValueProperty, &value); | |
| 24 RegisterProperty(bluetooth_gatt_characteristic::kFlagsProperty, &flags); | 39 RegisterProperty(bluetooth_gatt_characteristic::kFlagsProperty, &flags); |
| 25 } | 40 } |
| 26 | 41 |
| 27 BluetoothGattCharacteristicClient::Properties::~Properties() { | 42 BluetoothGattCharacteristicClient::Properties::~Properties() { |
| 28 } | 43 } |
| 29 | 44 |
| 30 // The BluetoothGattCharacteristicClient implementation used in production. | 45 // The BluetoothGattCharacteristicClient implementation used in production. |
| 31 class BluetoothGattCharacteristicClientImpl | 46 class BluetoothGattCharacteristicClientImpl |
| 32 : public BluetoothGattCharacteristicClient, | 47 : public BluetoothGattCharacteristicClient, |
| 33 public dbus::ObjectManager::Interface { | 48 public dbus::ObjectManager::Interface { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 67 virtual Properties* GetProperties( | 82 virtual Properties* GetProperties( |
| 68 const dbus::ObjectPath& object_path) OVERRIDE { | 83 const dbus::ObjectPath& object_path) OVERRIDE { |
| 69 DCHECK(object_manager_); | 84 DCHECK(object_manager_); |
| 70 return static_cast<Properties*>( | 85 return static_cast<Properties*>( |
| 71 object_manager_->GetProperties( | 86 object_manager_->GetProperties( |
| 72 object_path, | 87 object_path, |
| 73 bluetooth_gatt_characteristic:: | 88 bluetooth_gatt_characteristic:: |
| 74 kBluetoothGattCharacteristicInterface)); | 89 kBluetoothGattCharacteristicInterface)); |
| 75 } | 90 } |
| 76 | 91 |
| 92 // BluetoothGattCharacteristicClient override. | |
| 93 virtual void ReadValue(const dbus::ObjectPath& object_path, | |
| 94 const ValueCallback& callback, | |
| 95 const ErrorCallback& error_callback) OVERRIDE { | |
| 96 dbus::ObjectProxy* object_proxy = | |
| 97 object_manager_->GetObjectProxy(object_path); | |
| 98 if (!object_proxy) { | |
| 99 error_callback.Run(kUnknownCharacteristicError, ""); | |
| 100 return; | |
| 101 } | |
| 102 | |
| 103 dbus::MethodCall method_call( | |
| 104 bluetooth_gatt_characteristic::kBluetoothGattCharacteristicInterface, | |
| 105 kReadValue); | |
| 106 | |
| 107 object_proxy->CallMethodWithErrorCallback( | |
| 108 &method_call, | |
| 109 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | |
| 110 base::Bind(&BluetoothGattCharacteristicClientImpl::OnValueSuccess, | |
| 111 weak_ptr_factory_.GetWeakPtr(), | |
| 112 callback), | |
| 113 base::Bind(&BluetoothGattCharacteristicClientImpl::OnError, | |
| 114 weak_ptr_factory_.GetWeakPtr(), | |
| 115 error_callback)); | |
| 116 } | |
| 117 | |
| 118 // BluetoothGattCharacteristicClient override. | |
| 119 virtual void WriteValue(const dbus::ObjectPath& object_path, | |
| 120 const std::vector<uint8>& value, | |
| 121 const base::Closure& callback, | |
| 122 const ErrorCallback& error_callback) OVERRIDE { | |
| 123 dbus::ObjectProxy* object_proxy = | |
| 124 object_manager_->GetObjectProxy(object_path); | |
| 125 if (!object_proxy) { | |
| 126 error_callback.Run(kUnknownCharacteristicError, ""); | |
| 127 return; | |
| 128 } | |
| 129 | |
| 130 dbus::MethodCall method_call( | |
| 131 bluetooth_gatt_characteristic::kBluetoothGattCharacteristicInterface, | |
| 132 kWriteValue); | |
| 133 dbus::MessageWriter writer(&method_call); | |
| 134 writer.AppendArrayOfBytes(value.data(), value.size()); | |
| 135 | |
| 136 object_proxy->CallMethodWithErrorCallback( | |
| 137 &method_call, | |
| 138 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | |
| 139 base::Bind(&BluetoothGattCharacteristicClientImpl::OnSuccess, | |
| 140 weak_ptr_factory_.GetWeakPtr(), | |
| 141 callback), | |
| 142 base::Bind(&BluetoothGattCharacteristicClientImpl::OnError, | |
| 143 weak_ptr_factory_.GetWeakPtr(), | |
| 144 error_callback)); | |
| 145 } | |
| 146 | |
| 77 // dbus::ObjectManager::Interface override. | 147 // dbus::ObjectManager::Interface override. |
| 78 virtual dbus::PropertySet* CreateProperties( | 148 virtual dbus::PropertySet* CreateProperties( |
| 79 dbus::ObjectProxy *object_proxy, | 149 dbus::ObjectProxy *object_proxy, |
| 80 const dbus::ObjectPath& object_path, | 150 const dbus::ObjectPath& object_path, |
| 81 const std::string& interface_name) OVERRIDE { | 151 const std::string& interface_name) OVERRIDE { |
| 82 Properties* properties = new Properties( | 152 Properties* properties = new Properties( |
| 83 object_proxy, | 153 object_proxy, |
| 84 interface_name, | 154 interface_name, |
| 85 base::Bind(&BluetoothGattCharacteristicClientImpl::OnPropertyChanged, | 155 base::Bind(&BluetoothGattCharacteristicClientImpl::OnPropertyChanged, |
| 86 weak_ptr_factory_.GetWeakPtr(), | 156 weak_ptr_factory_.GetWeakPtr(), |
| 87 object_path)); | 157 object_path)); |
| 88 return static_cast<dbus::PropertySet*>(properties); | 158 return static_cast<dbus::PropertySet*>(properties); |
| 89 } | 159 } |
| 90 | 160 |
| 91 // dbus::ObjectManager::Interface override. | 161 // dbus::ObjectManager::Interface override. |
| 92 virtual void ObjectAdded(const dbus::ObjectPath& object_path, | 162 virtual void ObjectAdded(const dbus::ObjectPath& object_path, |
| 93 const std::string& interface_name) OVERRIDE { | 163 const std::string& interface_name) OVERRIDE { |
| 94 VLOG(2) << "Remote GATT characteristic added: " << object_path.value(); | 164 VLOG(2) << "Remote GATT characteristic added: " << object_path.value(); |
| 95 FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_, | 165 FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_, |
| 96 GattCharacteristicAdded(object_path)); | 166 GattCharacteristicAdded(object_path)); |
| 167 | |
| 168 // Connect the "ValueUpdated" signal. | |
| 169 dbus::ObjectProxy* object_proxy = | |
| 170 object_manager_->GetObjectProxy(object_path); | |
| 171 DCHECK(object_proxy); | |
| 172 | |
| 173 object_proxy->ConnectToSignal( | |
| 174 bluetooth_gatt_characteristic::kBluetoothGattCharacteristicInterface, | |
| 175 kValueUpdatedSignal, | |
| 176 base::Bind(&BluetoothGattCharacteristicClientImpl::ValueUpdatedReceived, | |
| 177 weak_ptr_factory_.GetWeakPtr(), | |
| 178 object_path), | |
| 179 base::Bind( | |
| 180 &BluetoothGattCharacteristicClientImpl::ValueUpdatedConnected, | |
| 181 weak_ptr_factory_.GetWeakPtr())); | |
| 97 } | 182 } |
| 98 | 183 |
| 99 // dbus::ObjectManager::Interface override. | 184 // dbus::ObjectManager::Interface override. |
| 100 virtual void ObjectRemoved(const dbus::ObjectPath& object_path, | 185 virtual void ObjectRemoved(const dbus::ObjectPath& object_path, |
| 101 const std::string& interface_name) OVERRIDE { | 186 const std::string& interface_name) OVERRIDE { |
| 102 VLOG(2) << "Remote GATT characteristic removed: " << object_path.value(); | 187 VLOG(2) << "Remote GATT characteristic removed: " << object_path.value(); |
| 103 FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_, | 188 FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_, |
| 104 GattCharacteristicRemoved(object_path)); | 189 GattCharacteristicRemoved(object_path)); |
| 105 } | 190 } |
| 106 | 191 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 122 // observers. | 207 // observers. |
| 123 virtual void OnPropertyChanged(const dbus::ObjectPath& object_path, | 208 virtual void OnPropertyChanged(const dbus::ObjectPath& object_path, |
| 124 const std::string& property_name) { | 209 const std::string& property_name) { |
| 125 VLOG(2) << "Remote GATT characteristic property changed: " | 210 VLOG(2) << "Remote GATT characteristic property changed: " |
| 126 << object_path.value() << ": " << property_name; | 211 << object_path.value() << ": " << property_name; |
| 127 FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_, | 212 FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, observers_, |
| 128 GattCharacteristicPropertyChanged(object_path, | 213 GattCharacteristicPropertyChanged(object_path, |
| 129 property_name)); | 214 property_name)); |
| 130 } | 215 } |
| 131 | 216 |
| 217 // Called by dbus:: when a "ValueUpdated" signal is received. | |
| 218 void ValueUpdatedReceived(const dbus::ObjectPath& object_path, | |
| 219 dbus::Signal* signal) { | |
| 220 DCHECK(signal); | |
| 221 const uint8* bytes = NULL; | |
| 222 size_t length = 0; | |
| 223 dbus::MessageReader reader(signal); | |
| 224 if (!reader.PopArrayOfBytes(&bytes, &length)) { | |
| 225 LOG(WARNING) << "ValueUpdated signal has incorrect parameters: " | |
| 226 << signal->ToString(); | |
| 227 return; | |
| 228 } | |
| 229 | |
| 230 std::vector<uint8> value; | |
| 231 if (bytes) | |
| 232 value.assign(bytes, bytes + length); | |
| 233 | |
| 234 FOR_EACH_OBSERVER(BluetoothGattCharacteristicClient::Observer, | |
| 235 observers_, | |
| 236 GattCharacteristicValueUpdated(object_path, value)); | |
| 237 } | |
| 238 | |
| 239 // Called by dbus:: when the "ValueUpdated" signal is initially connected. | |
| 240 void ValueUpdatedConnected(const std::string& interface_name, | |
| 241 const std::string& signal_name, | |
| 242 bool success) { | |
| 243 LOG_IF(WARNING, !success) << "Failed to connect to the ValueUpdated signal"; | |
| 244 } | |
| 245 | |
| 246 // Called when a response for successful method call is received. | |
| 247 void OnSuccess(const base::Closure& callback, dbus::Response* response) { | |
| 248 DCHECK(response); | |
| 249 callback.Run(); | |
| 250 } | |
| 251 | |
| 252 // Called when a characteristic value response for a successful method call | |
| 253 // is received. | |
| 254 void OnValueSuccess(const ValueCallback& callback, dbus::Response* response) { | |
| 255 DCHECK(response); | |
| 256 dbus::MessageReader reader(response); | |
| 257 | |
| 258 const uint8* bytes = NULL; | |
| 259 size_t length = 0; | |
| 260 | |
| 261 if (!reader.PopArrayOfBytes(&bytes, &length)) | |
| 262 VLOG(2) << "Error reading array of bytes in ValueCallback"; | |
| 263 | |
| 264 std::vector<uint8> value; | |
| 265 | |
| 266 if (bytes) | |
| 267 value.assign(bytes, bytes + length); | |
| 268 | |
| 269 callback.Run(value); | |
| 270 } | |
| 271 | |
| 272 // Called when a response for a failed method call is received. | |
| 273 void OnError(const ErrorCallback& error_callback, | |
| 274 dbus::ErrorResponse* response) { | |
| 275 // Error response has optional error message argument. | |
| 276 std::string error_name; | |
| 277 std::string error_message; | |
| 278 if (response) { | |
| 279 dbus::MessageReader reader(response); | |
| 280 error_name = response->GetErrorName(); | |
| 281 reader.PopString(&error_message); | |
| 282 } else { | |
| 283 error_name = kNoResponseError; | |
| 284 error_message = ""; | |
| 285 } | |
| 286 error_callback.Run(error_name, error_message); | |
| 287 } | |
| 288 | |
| 132 dbus::ObjectManager* object_manager_; | 289 dbus::ObjectManager* object_manager_; |
| 133 | 290 |
| 134 // List of observers interested in event notifications from us. | 291 // List of observers interested in event notifications from us. |
| 135 ObserverList<BluetoothGattCharacteristicClient::Observer> observers_; | 292 ObserverList<BluetoothGattCharacteristicClient::Observer> observers_; |
| 136 | 293 |
| 137 // Weak pointer factory for generating 'this' pointers that might live longer | 294 // Weak pointer factory for generating 'this' pointers that might live longer |
| 138 // than we do. | 295 // than we do. |
| 139 // Note: This should remain the last member so it'll be destroyed and | 296 // Note: This should remain the last member so it'll be destroyed and |
| 140 // invalidate its weak pointers before any other members are destroyed. | 297 // invalidate its weak pointers before any other members are destroyed. |
| 141 base::WeakPtrFactory<BluetoothGattCharacteristicClientImpl> | 298 base::WeakPtrFactory<BluetoothGattCharacteristicClientImpl> |
| 142 weak_ptr_factory_; | 299 weak_ptr_factory_; |
| 143 | 300 |
| 144 DISALLOW_COPY_AND_ASSIGN(BluetoothGattCharacteristicClientImpl); | 301 DISALLOW_COPY_AND_ASSIGN(BluetoothGattCharacteristicClientImpl); |
| 145 }; | 302 }; |
| 146 | 303 |
| 147 BluetoothGattCharacteristicClient::BluetoothGattCharacteristicClient() { | 304 BluetoothGattCharacteristicClient::BluetoothGattCharacteristicClient() { |
| 148 } | 305 } |
| 149 | 306 |
| 150 BluetoothGattCharacteristicClient::~BluetoothGattCharacteristicClient() { | 307 BluetoothGattCharacteristicClient::~BluetoothGattCharacteristicClient() { |
| 151 } | 308 } |
| 152 | 309 |
| 153 // static | 310 // static |
| 154 BluetoothGattCharacteristicClient* BluetoothGattCharacteristicClient::Create() { | 311 BluetoothGattCharacteristicClient* BluetoothGattCharacteristicClient::Create() { |
| 155 return new BluetoothGattCharacteristicClientImpl(); | 312 return new BluetoothGattCharacteristicClientImpl(); |
| 156 } | 313 } |
| 157 | 314 |
| 158 } // namespace chromeos | 315 } // namespace chromeos |
| OLD | NEW |