Index: device/bluetooth/device.cc |
diff --git a/device/bluetooth/device.cc b/device/bluetooth/device.cc |
index 873d277849efa3b4b2f2b46db4e9506960b89479..acba3d246cbdc4c8dea3b201fe274d4fd3a720cd 100644 |
--- a/device/bluetooth/device.cc |
+++ b/device/bluetooth/device.cc |
@@ -213,12 +213,90 @@ void Device::GetDescriptors(const std::string& service_id, |
descriptor_info->id = descriptor->GetIdentifier(); |
descriptor_info->uuid = descriptor->GetUUID(); |
+ descriptor_info->last_known_value = descriptor->GetValue(); |
+ |
descriptors.push_back(std::move(descriptor_info)); |
} |
callback.Run(std::move(descriptors)); |
} |
+void Device::ReadValueForDescriptor( |
+ const std::string& service_id, |
+ const std::string& characteristic_id, |
+ const std::string& descriptor_id, |
+ const ReadValueForDescriptorCallback& callback) { |
+ device::BluetoothDevice* device = adapter_->GetDevice(GetAddress()); |
+ DCHECK(device); |
+ |
+ device::BluetoothRemoteGattService* service = |
+ device->GetGattService(service_id); |
+ if (!service) { |
+ callback.Run(mojom::GattResult::SERVICE_NOT_FOUND, |
+ base::nullopt /* value */); |
+ return; |
+ } |
+ |
+ device::BluetoothRemoteGattCharacteristic* characteristic = |
+ service->GetCharacteristic(characteristic_id); |
+ if (!characteristic) { |
+ callback.Run(mojom::GattResult::CHARACTERISTIC_NOT_FOUND, |
+ base::nullopt /* value */); |
+ return; |
+ } |
+ |
+ device::BluetoothRemoteGattDescriptor* descriptor = |
+ characteristic->GetDescriptor(descriptor_id); |
+ if (!descriptor) { |
+ callback.Run(mojom::GattResult::DESCRIPTOR_NOT_FOUND, |
+ base::nullopt /* value */); |
+ return; |
+ } |
+ |
+ descriptor->ReadRemoteDescriptor( |
+ base::Bind(&Device::OnReadRemoteDescriptor, |
+ weak_ptr_factory_.GetWeakPtr(), callback), |
+ base::Bind(&Device::OnReadRemoteDescriptorError, |
+ weak_ptr_factory_.GetWeakPtr(), callback)); |
+} |
+ |
+void Device::WriteValueForDescriptor( |
+ const std::string& service_id, |
+ const std::string& characteristic_id, |
+ const std::string& descriptor_id, |
+ const std::vector<uint8_t>& value, |
+ const WriteValueForDescriptorCallback& callback) { |
+ device::BluetoothDevice* device = adapter_->GetDevice(GetAddress()); |
+ DCHECK(device); |
+ |
+ device::BluetoothRemoteGattService* service = |
+ device->GetGattService(service_id); |
+ if (!service) { |
+ callback.Run(mojom::GattResult::SERVICE_NOT_FOUND); |
+ return; |
+ } |
+ |
+ device::BluetoothRemoteGattCharacteristic* characteristic = |
+ service->GetCharacteristic(characteristic_id); |
+ if (!characteristic) { |
+ callback.Run(mojom::GattResult::CHARACTERISTIC_NOT_FOUND); |
+ return; |
+ } |
+ |
+ device::BluetoothRemoteGattDescriptor* descriptor = |
+ characteristic->GetDescriptor(descriptor_id); |
+ if (!descriptor) { |
+ callback.Run(mojom::GattResult::DESCRIPTOR_NOT_FOUND); |
+ return; |
+ } |
+ |
+ descriptor->WriteRemoteDescriptor( |
+ value, base::Bind(&Device::OnWriteRemoteDescriptor, |
+ weak_ptr_factory_.GetWeakPtr(), callback), |
+ base::Bind(&Device::OnWriteRemoteDescriptorError, |
+ weak_ptr_factory_.GetWeakPtr(), callback)); |
+} |
+ |
Device::Device(scoped_refptr<device::BluetoothAdapter> adapter, |
std::unique_ptr<device::BluetoothGattConnection> connection) |
: adapter_(std::move(adapter)), |
@@ -276,6 +354,30 @@ void Device::OnWriteRemoteCharacteristicError( |
callback.Run(mojo::ConvertTo<mojom::GattResult>(error_code)); |
} |
+void Device::OnReadRemoteDescriptor( |
+ const ReadValueForDescriptorCallback& callback, |
+ const std::vector<uint8_t>& value) { |
+ callback.Run(mojom::GattResult::SUCCESS, std::move(value)); |
+} |
+ |
+void Device::OnReadRemoteDescriptorError( |
+ const ReadValueForDescriptorCallback& callback, |
+ device::BluetoothGattService::GattErrorCode error_code) { |
+ callback.Run(mojo::ConvertTo<mojom::GattResult>(error_code), |
+ base::nullopt /* value */); |
+} |
+ |
+void Device::OnWriteRemoteDescriptor( |
+ const WriteValueForDescriptorCallback& callback) { |
+ callback.Run(mojom::GattResult::SUCCESS); |
+} |
+ |
+void Device::OnWriteRemoteDescriptorError( |
+ const WriteValueForDescriptorCallback& callback, |
+ device::BluetoothGattService::GattErrorCode error_code) { |
+ callback.Run(mojo::ConvertTo<mojom::GattResult>(error_code)); |
+} |
+ |
const std::string& Device::GetAddress() { |
return connection_->GetDeviceAddress(); |
} |