Chromium Code Reviews| Index: chromeos/dbus/bluetooth_gatt_descriptor_client.cc |
| diff --git a/chromeos/dbus/bluetooth_gatt_descriptor_client.cc b/chromeos/dbus/bluetooth_gatt_descriptor_client.cc |
| index 9ec73e7315ad22a16ee890cf0682f8c2f4056c26..5632690a9e1db4f574a01d0dcf0691fe50c0f3b4 100644 |
| --- a/chromeos/dbus/bluetooth_gatt_descriptor_client.cc |
| +++ b/chromeos/dbus/bluetooth_gatt_descriptor_client.cc |
| @@ -13,6 +13,21 @@ |
| namespace chromeos { |
| +namespace { |
| + |
| +// TODO(armansito): Move these definitions to service_constants.h |
| +const char kReadValue[] = "ReadValue"; |
| +const char kWriteValue[] = "WriteValue"; |
| + |
| +} // namespace |
|
keybuk
2014/05/30 22:23:41
Again, no reason not to do this before submitting
armansito
2014/06/05 06:13:51
Done.
|
| + |
| +// static |
| +const char BluetoothGattDescriptorClient::kNoResponseError[] = |
| + "org.chromium.Error.NoResponse"; |
| +// static |
| +const char BluetoothGattDescriptorClient::kUnknownDescriptorError[] = |
| + "org.chromium.Error.UnknownDescriptor"; |
| + |
| BluetoothGattDescriptorClient::Properties::Properties( |
| dbus::ObjectProxy* object_proxy, |
| const std::string& interface_name, |
| @@ -21,7 +36,6 @@ BluetoothGattDescriptorClient::Properties::Properties( |
| RegisterProperty(bluetooth_gatt_descriptor::kUUIDProperty, &uuid); |
| RegisterProperty(bluetooth_gatt_descriptor::kCharacteristicProperty, |
| &characteristic); |
| - RegisterProperty(bluetooth_gatt_descriptor::kValueProperty, &value); |
| } |
| BluetoothGattDescriptorClient::Properties::~Properties() { |
| @@ -73,6 +87,61 @@ class BluetoothGattDescriptorClientImpl |
| bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface)); |
| } |
| + // BluetoothGattDescriptorClientImpl override. |
| + virtual void ReadValue(const dbus::ObjectPath& object_path, |
| + const ValueCallback& callback, |
| + const ErrorCallback& error_callback) OVERRIDE { |
| + dbus::ObjectProxy* object_proxy = |
| + object_manager_->GetObjectProxy(object_path); |
| + if (!object_proxy) { |
| + error_callback.Run(kUnknownDescriptorError, ""); |
| + return; |
| + } |
| + |
| + dbus::MethodCall method_call( |
| + bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface, |
| + kReadValue); |
| + |
| + object_proxy->CallMethodWithErrorCallback( |
| + &method_call, |
| + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| + base::Bind(&BluetoothGattDescriptorClientImpl::OnValueSuccess, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + callback), |
| + base::Bind(&BluetoothGattDescriptorClientImpl::OnError, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + error_callback)); |
| + } |
| + |
| + // BluetoothGattDescriptorClientImpl override. |
| + virtual void WriteValue(const dbus::ObjectPath& object_path, |
| + const std::vector<uint8>& value, |
| + const base::Closure& callback, |
| + const ErrorCallback& error_callback) OVERRIDE { |
| + dbus::ObjectProxy* object_proxy = |
| + object_manager_->GetObjectProxy(object_path); |
| + if (!object_proxy) { |
| + error_callback.Run(kUnknownDescriptorError, ""); |
| + return; |
| + } |
| + |
| + dbus::MethodCall method_call( |
| + bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface, |
| + kWriteValue); |
| + dbus::MessageWriter writer(&method_call); |
| + writer.AppendArrayOfBytes(value.data(), value.size()); |
| + |
| + object_proxy->CallMethodWithErrorCallback( |
| + &method_call, |
| + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| + base::Bind(&BluetoothGattDescriptorClientImpl::OnSuccess, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + callback), |
| + base::Bind(&BluetoothGattDescriptorClientImpl::OnError, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + error_callback)); |
| + } |
| + |
| // dbus::ObjectManager::Interface override. |
| virtual dbus::PropertySet* CreateProperties( |
| dbus::ObjectProxy *object_proxy, |
| @@ -128,6 +197,49 @@ class BluetoothGattDescriptorClientImpl |
| property_name)); |
| } |
| + // Called when a response for a successful method call is received. |
| + void OnSuccess(const base::Closure& callback, dbus::Response* response) { |
| + DCHECK(response); |
| + callback.Run(); |
| + } |
| + |
| + // Called when a descriptor value response for a successful method call is |
| + // received. |
| + void OnValueSuccess(const ValueCallback& callback, dbus::Response* response) { |
| + DCHECK(response); |
| + dbus::MessageReader reader(response); |
| + |
| + const uint8* bytes = NULL; |
| + size_t length = 0; |
| + |
| + if (!reader.PopArrayOfBytes(&bytes, &length)) |
| + VLOG(2) << "Error reading array of bytes in ValueCallback"; |
| + |
| + std::vector<uint8> value; |
| + |
| + if (bytes) |
| + value.assign(bytes, bytes + length); |
| + |
| + callback.Run(value); |
| + } |
| + |
| + // Called when a response for a failed method call is received. |
| + void OnError(const ErrorCallback& error_callback, |
| + dbus::ErrorResponse* response) { |
| + // Error response has optional error message argument. |
| + std::string error_name; |
| + std::string error_message; |
| + if (response) { |
| + dbus::MessageReader reader(response); |
| + error_name = response->GetErrorName(); |
| + reader.PopString(&error_message); |
| + } else { |
| + error_name = kNoResponseError; |
| + error_message = ""; |
| + } |
| + error_callback.Run(error_name, error_message); |
| + } |
| + |
| dbus::ObjectManager* object_manager_; |
| // List of observers interested in event notifications from us. |