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

Unified Diff: content/renderer/bluetooth/web_bluetooth_impl.cc

Issue 2466223002: Implement WebBluetooth getDescriptor[s] (Closed)
Patch Set: Ensure that we throw a kGattServerNotConnected error if getDescriptor[s] is called while not connec… Created 4 years, 1 month 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: content/renderer/bluetooth/web_bluetooth_impl.cc
diff --git a/content/renderer/bluetooth/web_bluetooth_impl.cc b/content/renderer/bluetooth/web_bluetooth_impl.cc
index ebfcce61da8aec0458e0e6be632de281274c1177..fcea1384506f5f72af7b8be2ef9c8b67eded73b8 100644
--- a/content/renderer/bluetooth/web_bluetooth_impl.cc
+++ b/content/renderer/bluetooth/web_bluetooth_impl.cc
@@ -21,6 +21,8 @@
#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothDeviceInit.h"
#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTCharacteristic.h"
#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTCharacteristicInit.h"
+#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTDescriptor.h"
+#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTDescriptorInit.h"
#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTService.h"
#include "third_party/WebKit/public/platform/modules/bluetooth/WebRequestDeviceOptions.h"
@@ -112,7 +114,7 @@ void WebBluetoothImpl::getCharacteristics(
base::Passed(base::WrapUnique(callbacks))));
}
-void WebBluetoothImpl::readValue(
+void WebBluetoothImpl::characteristicReadValue(
const blink::WebString& characteristic_instance_id,
blink::WebBluetoothReadValueCallbacks* callbacks) {
GetWebBluetoothService().RemoteCharacteristicReadValue(
@@ -121,7 +123,7 @@ void WebBluetoothImpl::readValue(
base::Passed(base::WrapUnique(callbacks))));
}
-void WebBluetoothImpl::writeValue(
+void WebBluetoothImpl::characteristicWriteValue(
const blink::WebString& characteristic_instance_id,
const blink::WebVector<uint8_t>& value,
blink::WebBluetoothWriteValueCallbacks* callbacks) {
@@ -153,6 +155,46 @@ void WebBluetoothImpl::stopNotifications(
base::Passed(base::WrapUnique(callbacks))));
}
+void WebBluetoothImpl::getDescriptors(
+ const blink::WebString& characteristic_instance_id,
+ int32_t quantity,
+ const blink::WebString& descriptors_uuid,
+ blink::WebBluetoothGetDescriptorsCallbacks* callbacks) {
+ DCHECK(blink::mojom::IsKnownEnumValue(
+ static_cast<blink::mojom::WebBluetoothGATTQueryQuantity>(quantity)));
+
+ GetWebBluetoothService().RemoteCharacteristicGetDescriptors(
+ mojo::String::From(characteristic_instance_id),
+ static_cast<blink::mojom::WebBluetoothGATTQueryQuantity>(quantity),
+ descriptors_uuid.isEmpty()
+ ? base::nullopt
+ : base::make_optional(device::BluetoothUUID(descriptors_uuid.utf8())),
+ base::Bind(&WebBluetoothImpl::OnGetDescriptorsComplete,
+ base::Unretained(this), characteristic_instance_id,
+ base::Passed(base::WrapUnique(callbacks))));
+}
+
+void WebBluetoothImpl::descriptorReadValue(
+ const blink::WebString& descriptor_instance_id,
+ blink::WebBluetoothReadValueCallbacks* callbacks) {
+ GetWebBluetoothService().RemoteDescriptorReadValue(
+ mojo::String::From(descriptor_instance_id),
+ base::Bind(&WebBluetoothImpl::OnReadValueComplete, base::Unretained(this),
+ base::Passed(base::WrapUnique(callbacks))));
+}
+
+void WebBluetoothImpl::descriptorWriteValue(
+ const blink::WebString& descriptor_instance_id,
+ const blink::WebVector<uint8_t>& value,
+ blink::WebBluetoothWriteValueCallbacks* callbacks) {
+ GetWebBluetoothService().RemoteDescriptorWriteValue(
+ mojo::String::From(descriptor_instance_id),
+ mojo::Array<uint8_t>::From(value),
+ base::Bind(&WebBluetoothImpl::OnWriteValueComplete,
+ base::Unretained(this), value,
+ base::Passed(base::WrapUnique(callbacks))));
+}
+
void WebBluetoothImpl::characteristicObjectRemoved(
const blink::WebString& characteristic_instance_id,
blink::WebBluetoothRemoteGATTCharacteristic* characteristic) {
@@ -181,6 +223,33 @@ void WebBluetoothImpl::RemoteCharacteristicValueChanged(
value.PassStorage()));
}
+void WebBluetoothImpl::RemoteDescriptorValueChanged(
+ const mojo::String& descriptor_instance_id,
+ mojo::Array<uint8_t> value) {
+ // We post a task so that the event is fired after any pending promises have
+ // resolved.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::Bind(&WebBluetoothImpl::DispatchDescriptorValueChanged,
+ base::Unretained(this), descriptor_instance_id,
+ value.PassStorage()));
+}
+
+void WebBluetoothImpl::descriptorObjectRemoved(
+ const blink::WebString& descriptor_instance_id,
+ blink::WebBluetoothRemoteGATTDescriptor* descriptor) {
+ active_descriptors_.erase(descriptor_instance_id.utf8());
+}
+
+void WebBluetoothImpl::registerDescriptorObject(
+ const blink::WebString& descriptor_instance_id,
+ blink::WebBluetoothRemoteGATTDescriptor* descriptor) {
+ // TODO(dft): After the Bluetooth Tree is implemented, there will
+ // only be one object per descriptor. But for now we replace
+ // the previous object.
+ // https://crbug.com/xxx
+ active_descriptors_[descriptor_instance_id.utf8()] = descriptor;
+}
+
void WebBluetoothImpl::OnRequestDeviceComplete(
std::unique_ptr<blink::WebBluetoothRequestDeviceCallbacks> callbacks,
const blink::mojom::WebBluetoothResult result,
@@ -266,6 +335,29 @@ void WebBluetoothImpl::OnGetCharacteristicsComplete(
}
}
+void WebBluetoothImpl::OnGetDescriptorsComplete(
+ const blink::WebString& characteristic_instance_id,
+ std::unique_ptr<blink::WebBluetoothGetDescriptorsCallbacks> callbacks,
+ blink::mojom::WebBluetoothResult result,
+ mojo::Array<blink::mojom::WebBluetoothRemoteGATTDescriptorPtr>
+ descriptors) {
+ if (result == blink::mojom::WebBluetoothResult::SUCCESS) {
+ // TODO(dcheng): This WebVector should use smart pointers.
+ blink::WebVector<blink::WebBluetoothRemoteGATTDescriptorInit*>
+ promise_descriptors(descriptors.size());
+
+ for (size_t i = 0; i < descriptors.size(); i++) {
+ promise_descriptors[i] = new blink::WebBluetoothRemoteGATTDescriptorInit(
+ characteristic_instance_id,
+ blink::WebString::fromUTF8(descriptors[i]->instance_id),
+ blink::WebString::fromUTF8(descriptors[i]->uuid));
+ }
+ callbacks->onSuccess(promise_descriptors);
+ } else {
+ callbacks->onError(ToInt32(result));
+ }
+}
+
void WebBluetoothImpl::OnReadValueComplete(
std::unique_ptr<blink::WebBluetoothReadValueCallbacks> callbacks,
blink::mojom::WebBluetoothResult result,
@@ -312,6 +404,15 @@ void WebBluetoothImpl::DispatchCharacteristicValueChanged(
}
}
+void WebBluetoothImpl::DispatchDescriptorValueChanged(
+ const std::string& descriptor_instance_id,
+ const std::vector<uint8_t>& value) {
+ auto active_iter = active_descriptors_.find(descriptor_instance_id);
+ if (active_iter != active_descriptors_.end()) {
+ active_iter->second->dispatchDescriptorValueChanged(value);
+ }
+}
+
blink::mojom::WebBluetoothService& WebBluetoothImpl::GetWebBluetoothService() {
if (!web_bluetooth_service_) {
remote_interfaces_->GetInterface(mojo::GetProxy(&web_bluetooth_service_));

Powered by Google App Engine
This is Rietveld 408576698