Index: content/child/bluetooth/bluetooth_dispatcher.cc |
diff --git a/content/child/bluetooth/bluetooth_dispatcher.cc b/content/child/bluetooth/bluetooth_dispatcher.cc |
index 40e5bef012b41e871bf33a229fc5290b7492ac2a..74358255246f5460610f28a1260ba32ec48ab3c1 100644 |
--- a/content/child/bluetooth/bluetooth_dispatcher.cc |
+++ b/content/child/bluetooth/bluetooth_dispatcher.cc |
@@ -12,12 +12,14 @@ |
#include "content/common/bluetooth/bluetooth_messages.h" |
#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothDevice.h" |
#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h" |
+#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothGATTCharacteristic.h" |
#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothGATTRemoteServer.h" |
#include "third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothGATTService.h" |
using blink::WebBluetoothConnectGATTCallbacks; |
using blink::WebBluetoothDevice; |
using blink::WebBluetoothError; |
+using blink::WebBluetoothGATTCharacteristic; |
using blink::WebBluetoothGATTRemoteServer; |
using blink::WebBluetoothGATTService; |
using blink::WebBluetoothRequestDeviceCallbacks; |
@@ -39,6 +41,21 @@ struct BluetoothPrimaryServiceRequest { |
scoped_ptr<blink::WebBluetoothGetPrimaryServiceCallbacks> callbacks; |
}; |
+struct BluetoothCharacteristicRequest { |
+ BluetoothCharacteristicRequest( |
+ blink::WebString service_instance_id, |
+ blink::WebString characteristic_uuid, |
+ blink::WebBluetoothGetCharacteristicCallbacks* callbacks) |
+ : service_instance_id(service_instance_id), |
+ characteristic_uuid(characteristic_uuid), |
+ callbacks(callbacks) {} |
+ ~BluetoothCharacteristicRequest() {} |
+ |
+ blink::WebString service_instance_id; |
+ blink::WebString characteristic_uuid; |
+ scoped_ptr<blink::WebBluetoothGetCharacteristicCallbacks> callbacks; |
+}; |
+ |
namespace content { |
namespace { |
@@ -123,6 +140,10 @@ void BluetoothDispatcher::OnMessageReceived(const IPC::Message& msg) { |
OnGetPrimaryServiceSuccess); |
IPC_MESSAGE_HANDLER(BluetoothMsg_GetPrimaryServiceError, |
OnGetPrimaryServiceError); |
+ IPC_MESSAGE_HANDLER(BluetoothMsg_GetCharacteristicSuccess, |
+ OnGetCharacteristicSuccess); |
+ IPC_MESSAGE_HANDLER(BluetoothMsg_GetCharacteristicError, |
+ OnGetCharacteristicError); |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
DCHECK(handled) << "Unhandled message:" << msg.type(); |
@@ -154,6 +175,18 @@ void BluetoothDispatcher::getPrimaryService( |
service_uuid.utf8())); |
} |
+void BluetoothDispatcher::getCharacteristic( |
+ const blink::WebString& service_instance_id, |
+ const blink::WebString& characteristic_uuid, |
+ blink::WebBluetoothGetCharacteristicCallbacks* callbacks) { |
+ int request_id = |
+ pending_characteristic_requests_.Add(new BluetoothCharacteristicRequest( |
+ service_instance_id, characteristic_uuid, callbacks)); |
+ Send(new BluetoothHostMsg_GetCharacteristic(CurrentWorkerId(), request_id, |
+ service_instance_id.utf8(), |
+ characteristic_uuid.utf8())); |
+} |
+ |
void BluetoothDispatcher::OnWorkerRunLoopStopped() { |
delete this; |
} |
@@ -248,4 +281,40 @@ void BluetoothDispatcher::OnGetPrimaryServiceError(int thread_id, |
pending_primary_service_requests_.Remove(request_id); |
} |
+void BluetoothDispatcher::OnGetCharacteristicSuccess( |
+ int thread_id, |
+ int request_id, |
+ const std::string& characteristic_instance_id) { |
+ DCHECK(pending_characteristic_requests_.Lookup(request_id)) << request_id; |
+ |
+ BluetoothCharacteristicRequest* request = |
+ pending_characteristic_requests_.Lookup(request_id); |
+ request->callbacks->onSuccess(new WebBluetoothGATTCharacteristic( |
+ WebString::fromUTF8(characteristic_instance_id), |
+ request->service_instance_id, request->characteristic_uuid)); |
+ |
+ pending_characteristic_requests_.Remove(request_id); |
+} |
+ |
+void BluetoothDispatcher::OnGetCharacteristicError(int thread_id, |
+ int request_id, |
+ BluetoothError error_type) { |
+ DCHECK(pending_characteristic_requests_.Lookup(request_id)) << request_id; |
+ |
+ // Since we couldn't find the characteristic return null. See Step 3 of |
+ // getCharacteristic algorithm: |
+ // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothgattservice-getcharacteristic |
+ if (error_type == BluetoothError::NOT_FOUND) { |
+ pending_characteristic_requests_.Lookup(request_id) |
+ ->callbacks->onSuccess(nullptr); |
+ } else { |
+ pending_characteristic_requests_.Lookup(request_id) |
+ ->callbacks->onError(new WebBluetoothError( |
+ // TODO(ortuno): Return more descriptive error messages. |
+ // http://crbug.com/490419 |
+ WebBluetoothErrorFromBluetoothError(error_type), "")); |
+ } |
+ pending_characteristic_requests_.Remove(request_id); |
+} |
+ |
} // namespace content |