Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1990)

Unified Diff: device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc

Issue 1606013002: BLE GATT service implementation in Chrome for Windows 8 and later (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update Build.gn Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc b/device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b1e5b84375f848e4c9913ac7f00ea03afbf08855
--- /dev/null
+++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_win.cc
@@ -0,0 +1,170 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/bluetooth/bluetooth_remote_gatt_descriptor_win.h"
+
+#include "base/bind.h"
+
+namespace device {
+
+BluetoothRemoteGattDescriptorWin::BluetoothRemoteGattDescriptorWin(
+ BluetoothAdapterWin* adapter,
+ base::FilePath service_path,
+ BluetoothRemoteGattCharacteristicWin* parent_characteristic,
+ BTH_LE_GATT_DESCRIPTOR* descriptor_info,
+ scoped_refptr<base::SequencedTaskRunner>& ui_task_runner)
+ : adapter_(adapter),
+ service_path_(service_path),
+ parent_characteristic_(parent_characteristic),
+ descriptor_info_(descriptor_info),
+ ui_task_runner_(ui_task_runner),
+ descriptor_initialized_(false),
+ weak_ptr_factory_(this) {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ descriptor_value_.clear();
+ read_remote_descriptor_value_callbacks_.clear();
+ write_remote_descriptor_value_callbacks_.clear();
+
+ task_manager_ = adapter_->GetWinBluetoothTaskManager();
+ DCHECK(parent_characteristic_);
+ DCHECK(descriptor_info_.get());
+ DCHECK(adapter_);
+ DCHECK(task_manager_);
+
+ descriptor_uuid_ = task_manager_->BluetoothLowEnergyUuidToBluetoothUuid(
+ descriptor_info_.get()->DescriptorUuid);
+ // TODO(gogerald): Could not find permission information from
+ // BTH_LE_GATT_DESCRIPTOR. Give read and write permission by default. Update
+ // it according to future read/write feedback. Use system information when it
+ // is available.
+ permissions_ = BluetoothGattCharacteristic::PERMISSION_READ |
+ BluetoothGattCharacteristic::PERMISSION_WRITE;
+ Update();
+}
+
+BluetoothRemoteGattDescriptorWin::~BluetoothRemoteGattDescriptorWin() {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ adapter_->NotifyGattDescriptorRemoved(this);
+}
+
+std::string BluetoothRemoteGattDescriptorWin::GetIdentifier() const {
+ return parent_characteristic_->GetIdentifier() + "_" +
+ descriptor_uuid_.value();
+}
+
+BluetoothUUID BluetoothRemoteGattDescriptorWin::GetUUID() const {
+ return descriptor_uuid_;
+}
+
+bool BluetoothRemoteGattDescriptorWin::IsLocal() const {
+ return false;
+}
+
+std::vector<uint8_t>& BluetoothRemoteGattDescriptorWin::GetValue() const {
+ return const_cast<std::vector<uint8_t>&>(descriptor_value_);
+}
+
+BluetoothGattCharacteristic*
+BluetoothRemoteGattDescriptorWin::GetCharacteristic() const {
+ return parent_characteristic_;
+}
+
+BluetoothGattCharacteristic::Permissions
+BluetoothRemoteGattDescriptorWin::GetPermissions() const {
+ return permissions_;
+}
+
+BluetoothGattService::GattErrorCode
+BluetoothRemoteGattDescriptorWin::SystemErrorToGattErrorCode(HRESULT hr) {
+ if (hr == E_BLUETOOTH_ATT_READ_NOT_PERMITTED ||
+ hr == E_BLUETOOTH_ATT_WRITE_NOT_PERMITTED) {
+ return BluetoothGattService::GATT_ERROR_NOT_PERMITTED;
+ }
+ return BluetoothGattService::GATT_ERROR_FAILED;
+}
+
+void BluetoothRemoteGattDescriptorWin::ReadRemoteDescriptorValueCallback(
+ BTH_LE_GATT_DESCRIPTOR_VALUE* value,
+ HRESULT hr) {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ if (FAILED(hr)) {
+ LOG(ERROR) << "Failed at reading descriptor value";
+ BluetoothGattService::GattErrorCode error = SystemErrorToGattErrorCode(hr);
+ if (error == BluetoothGattService::GATT_ERROR_NOT_PERMITTED) {
+ permissions_ =
+ permissions_ & ~BluetoothGattCharacteristic::PERMISSION_READ;
+ }
+ for (const auto callback : read_remote_descriptor_value_callbacks_)
+ callback.second.Run(error);
+ } else {
+ descriptor_value_.clear();
+ for (ULONG i = 0; i < value->DataSize; i++)
+ descriptor_value_.push_back(value->Data[i]);
+ for (const auto callback : read_remote_descriptor_value_callbacks_)
+ callback.first.Run(descriptor_value_);
+ }
+
+ if (!descriptor_initialized_) {
+ parent_characteristic_->NotifyGattDescriptorAdded(this);
+ descriptor_initialized_ = true;
+ }
+ read_remote_descriptor_value_callbacks_.clear();
+}
+
+void BluetoothRemoteGattDescriptorWin::ReadRemoteDescriptor(
+ const ValueCallback& callback,
+ const ErrorCallback& error_callback) {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ read_remote_descriptor_value_callbacks_.push_back(
+ std::make_pair(callback, error_callback));
+ task_manager_->PostReadDescriptorValue(
+ service_path_, descriptor_info_.get(),
+ base::Bind(
+ &BluetoothRemoteGattDescriptorWin::ReadRemoteDescriptorValueCallback,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+void BluetoothRemoteGattDescriptorWin::WriteRemoteDescriptorValueCallback(
+ HRESULT hr) {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ if (FAILED(hr)) {
+ BluetoothGattService::GattErrorCode error = SystemErrorToGattErrorCode(hr);
+ if (error == BluetoothGattService::GATT_ERROR_NOT_PERMITTED) {
+ permissions_ =
+ permissions_ & ~BluetoothGattCharacteristic::PERMISSION_WRITE;
+ }
+ for (const auto callback : write_remote_descriptor_value_callbacks_)
+ callback.second.Run(error);
+ } else {
+ for (auto callback : write_remote_descriptor_value_callbacks_)
+ callback.first.Run();
+ }
+
+ write_remote_descriptor_value_callbacks_.clear();
+}
+
+void BluetoothRemoteGattDescriptorWin::WriteRemoteDescriptor(
+ const std::vector<uint8_t>& new_value,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ write_remote_descriptor_value_callbacks_.push_back(
+ std::make_pair(callback, error_callback));
+ task_manager_->PostWriteDescriptorValue(
+ service_path_, descriptor_info_.get(), new_value,
+ base::Bind(
+ &BluetoothRemoteGattDescriptorWin::WriteRemoteDescriptorValueCallback,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+void BluetoothRemoteGattDescriptorWin::Update() {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ task_manager_->PostReadDescriptorValue(
+ service_path_, descriptor_info_.get(),
+ base::Bind(
+ &BluetoothRemoteGattDescriptorWin::ReadRemoteDescriptorValueCallback,
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+} // namespace device.

Powered by Google App Engine
This is Rietveld 408576698