Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chromeos / dbus / bluetooth_gatt_descriptor_client.cc
index 9ec73e7..e079000 100644 (file)
 
 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() {
@@ -44,20 +50,20 @@ class BluetoothGattDescriptorClientImpl
 
   // BluetoothGattDescriptorClientImpl override.
   virtual void AddObserver(
-      BluetoothGattDescriptorClient::Observer* observer) OVERRIDE {
+      BluetoothGattDescriptorClient::Observer* observer) override {
     DCHECK(observer);
     observers_.AddObserver(observer);
   }
 
   // BluetoothGattDescriptorClientImpl override.
   virtual void RemoveObserver(
-      BluetoothGattDescriptorClient::Observer* observer) OVERRIDE {
+      BluetoothGattDescriptorClient::Observer* observer) override {
     DCHECK(observer);
     observers_.RemoveObserver(observer);
   }
 
   // BluetoothGattDescriptorClientImpl override.
-  virtual std::vector<dbus::ObjectPath> GetDescriptors() OVERRIDE {
+  virtual std::vector<dbus::ObjectPath> GetDescriptors() override {
     DCHECK(object_manager_);
     return object_manager_->GetObjectsWithInterface(
         bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface);
@@ -65,7 +71,7 @@ class BluetoothGattDescriptorClientImpl
 
   // BluetoothGattDescriptorClientImpl override.
   virtual Properties* GetProperties(
-      const dbus::ObjectPath& object_path) OVERRIDE {
+      const dbus::ObjectPath& object_path) override {
     DCHECK(object_manager_);
     return static_cast<Properties*>(
         object_manager_->GetProperties(
@@ -73,11 +79,66 @@ 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,
       const dbus::ObjectPath& object_path,
-      const std::string& interface_name) OVERRIDE {
+      const std::string& interface_name) override {
     Properties* properties = new Properties(
         object_proxy,
         interface_name,
@@ -89,7 +150,7 @@ class BluetoothGattDescriptorClientImpl
 
   // dbus::ObjectManager::Interface override.
   virtual void ObjectAdded(const dbus::ObjectPath& object_path,
-                           const std::string& interface_name) OVERRIDE {
+                           const std::string& interface_name) override {
     VLOG(2) << "Remote GATT descriptor added: " << object_path.value();
     FOR_EACH_OBSERVER(BluetoothGattDescriptorClient::Observer, observers_,
                       GattDescriptorAdded(object_path));
@@ -97,7 +158,7 @@ class BluetoothGattDescriptorClientImpl
 
   // dbus::ObjectManager::Interface override.
   virtual void ObjectRemoved(const dbus::ObjectPath& object_path,
-                             const std::string& interface_name) OVERRIDE {
+                             const std::string& interface_name) override {
     VLOG(2) << "Remote GATT descriptor removed: " << object_path.value();
     FOR_EACH_OBSERVER(BluetoothGattDescriptorClient::Observer, observers_,
                       GattDescriptorRemoved(object_path));
@@ -105,7 +166,7 @@ class BluetoothGattDescriptorClientImpl
 
  protected:
   // chromeos::DBusClient override.
-  virtual void Init(dbus::Bus* bus) OVERRIDE {
+  virtual void Init(dbus::Bus* bus) override {
     object_manager_ = bus->GetObjectManager(
         bluetooth_object_manager::kBluetoothObjectManagerServiceName,
         dbus::ObjectPath(
@@ -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.