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,
RegisterProperty(bluetooth_gatt_descriptor::kUUIDProperty, &uuid);
RegisterProperty(bluetooth_gatt_descriptor::kCharacteristicProperty,
&characteristic);
- RegisterProperty(bluetooth_gatt_descriptor::kValueProperty, &value);
}
BluetoothGattDescriptorClient::Properties::~Properties() {
// 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);
// 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(
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,
// 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));
// 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));
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(
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.