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..850b228e756ca9efbaf6457de10898784041f5b4 100644 |
--- a/chromeos/dbus/bluetooth_gatt_descriptor_client.cc |
+++ b/chromeos/dbus/bluetooth_gatt_descriptor_client.cc |
@@ -13,6 +13,13 @@ |
namespace chromeos { |
+// 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 +28,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 +79,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, |
+ bluetooth_gatt_descriptor::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, |
+ bluetooth_gatt_descriptor::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 +189,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. |