Index: device/bluetooth/bluetooth_remote_gatt_characteristic_win.cc |
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_win.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_win.cc |
index baf4a73467996ec9f7a2c7f90109cf8e859d1df0..f93f6fc977181348b9d8e25acad6ca39c3f305fb 100644 |
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic_win.cc |
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_win.cc |
@@ -56,7 +56,6 @@ bool BluetoothRemoteGattCharacteristicWin::IsLocal() const { |
} |
std::vector<uint8_t>& BluetoothRemoteGattCharacteristicWin::GetValue() const { |
- NOTIMPLEMENTED(); |
return const_cast<std::vector<uint8_t>&>(characteristic_value_); |
} |
@@ -147,16 +146,40 @@ void BluetoothRemoteGattCharacteristicWin::StartNotifySession( |
void BluetoothRemoteGattCharacteristicWin::ReadRemoteCharacteristic( |
const ValueCallback& callback, |
const ErrorCallback& error_callback) { |
- NOTIMPLEMENTED(); |
- error_callback.Run(BluetoothGattService::GATT_ERROR_NOT_SUPPORTED); |
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ if (!characteristic_info_.get()->IsReadable) { |
+ error_callback.Run(BluetoothGattService::GATT_ERROR_NOT_PERMITTED); |
+ return; |
+ } |
+ |
+ read_remote_characteristic_value_callbacks_.push_back( |
scheib
2016/03/02 05:59:05
Android is supporting only one outstanding read op
gogerald1
2016/03/02 23:56:29
Done.
|
+ std::make_pair(callback, error_callback)); |
+ task_manager_->PostReadGattCharacteristicValue( |
+ parent_service_->GetServicePath(), characteristic_info_.get(), |
+ base::Bind(&BluetoothRemoteGattCharacteristicWin:: |
+ OnReadRemoteCharacteristicValueCallback, |
+ weak_ptr_factory_.GetWeakPtr())); |
} |
void BluetoothRemoteGattCharacteristicWin::WriteRemoteCharacteristic( |
const std::vector<uint8_t>& new_value, |
const base::Closure& callback, |
const ErrorCallback& error_callback) { |
- NOTIMPLEMENTED(); |
- error_callback.Run(BluetoothGattService::GATT_ERROR_NOT_SUPPORTED); |
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ if (!characteristic_info_.get()->IsWritable) { |
+ error_callback.Run(BluetoothGattService::GATT_ERROR_NOT_PERMITTED); |
+ return; |
+ } |
+ |
+ write_remote_characteristic_value_callbacks_.push_back( |
+ std::make_pair(callback, error_callback)); |
+ task_manager_->PostWriteGattCharacteristicValue( |
+ parent_service_->GetServicePath(), characteristic_info_.get(), new_value, |
+ base::Bind(&BluetoothRemoteGattCharacteristicWin:: |
+ OnWriteRemoteCharacteristicValueCallback, |
+ weak_ptr_factory_.GetWeakPtr())); |
} |
void BluetoothRemoteGattCharacteristicWin::Update() { |
@@ -253,4 +276,55 @@ bool BluetoothRemoteGattCharacteristicWin::DoesDescriptorExist( |
return false; |
} |
+void BluetoothRemoteGattCharacteristicWin:: |
+ OnReadRemoteCharacteristicValueCallback( |
+ scoped_ptr<BTH_LE_GATT_CHARACTERISTIC_VALUE> value, |
+ HRESULT hr) { |
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ if (FAILED(hr)) { |
+ for (const auto& callback : read_remote_characteristic_value_callbacks_) |
+ callback.second.Run(HRESULTToGattErrorCode(hr)); |
+ } else { |
+ characteristic_value_.clear(); |
+ for (ULONG i = 0; i < value->DataSize; i++) |
+ characteristic_value_.push_back(value->Data[i]); |
+ for (const auto& callback : read_remote_characteristic_value_callbacks_) |
scheib
2016/03/02 05:59:05
When running callbacks always clear the member var
gogerald1
2016/03/02 23:56:29
Done.
|
+ callback.first.Run(characteristic_value_); |
+ } |
+ |
+ read_remote_characteristic_value_callbacks_.clear(); |
+} |
+ |
+void BluetoothRemoteGattCharacteristicWin:: |
+ OnWriteRemoteCharacteristicValueCallback(HRESULT hr) { |
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ if (FAILED(hr)) { |
+ for (const auto& callback : write_remote_characteristic_value_callbacks_) |
+ callback.second.Run(HRESULTToGattErrorCode(hr)); |
+ } else { |
+ for (const auto& callback : write_remote_characteristic_value_callbacks_) |
+ callback.first.Run(); |
+ } |
+ |
+ write_remote_characteristic_value_callbacks_.clear(); |
+} |
+ |
+BluetoothGattService::GattErrorCode |
+BluetoothRemoteGattCharacteristicWin::HRESULTToGattErrorCode(HRESULT hr) { |
+ switch (hr) { |
+ case E_BLUETOOTH_ATT_READ_NOT_PERMITTED: |
+ case E_BLUETOOTH_ATT_WRITE_NOT_PERMITTED: |
+ return BluetoothGattService::GATT_ERROR_NOT_PERMITTED; |
+ case E_BLUETOOTH_ATT_UNKNOWN_ERROR: |
+ return BluetoothGattService::GATT_ERROR_UNKNOWN; |
+ case ERROR_INVALID_USER_BUFFER: |
+ case E_BLUETOOTH_ATT_INVALID_ATTRIBUTE_VALUE_LENGTH: |
+ return BluetoothGattService::GATT_ERROR_INVALID_LENGTH; |
+ default: |
+ return BluetoothGattService::GATT_ERROR_FAILED; |
+ } |
+} |
+ |
} // namespace device. |