| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // NETWORK_ERROR Note: | 5 // NETWORK_ERROR Note: |
| 6 // When a device can't be found in the BluetoothAdapter, that generally | 6 // When a device can't be found in the BluetoothAdapter, that generally |
| 7 // indicates that it's gone out of range. We reject with a NetworkError in that | 7 // indicates that it's gone out of range. We reject with a NetworkError in that |
| 8 // case. | 8 // case. |
| 9 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-conne
ctgatt | 9 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-conne
ctgatt |
| 10 | 10 |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 bool handled = true; | 206 bool handled = true; |
| 207 IPC_BEGIN_MESSAGE_MAP(BluetoothDispatcherHost, message) | 207 IPC_BEGIN_MESSAGE_MAP(BluetoothDispatcherHost, message) |
| 208 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RequestDevice, OnRequestDevice) | 208 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RequestDevice, OnRequestDevice) |
| 209 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ConnectGATT, OnConnectGATT) | 209 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ConnectGATT, OnConnectGATT) |
| 210 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) | 210 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) |
| 211 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristic, OnGetCharacteristic) | 211 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristic, OnGetCharacteristic) |
| 212 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ReadValue, OnReadValue) | 212 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ReadValue, OnReadValue) |
| 213 IPC_MESSAGE_HANDLER(BluetoothHostMsg_WriteValue, OnWriteValue) | 213 IPC_MESSAGE_HANDLER(BluetoothHostMsg_WriteValue, OnWriteValue) |
| 214 IPC_MESSAGE_HANDLER(BluetoothHostMsg_StartNotifications, OnStartNotifications) | 214 IPC_MESSAGE_HANDLER(BluetoothHostMsg_StartNotifications, OnStartNotifications) |
| 215 IPC_MESSAGE_HANDLER(BluetoothHostMsg_StopNotifications, OnStopNotifications) | 215 IPC_MESSAGE_HANDLER(BluetoothHostMsg_StopNotifications, OnStopNotifications) |
| 216 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RegisterCharacteristic, |
| 217 OnRegisterCharacteristicObject); |
| 218 IPC_MESSAGE_HANDLER(BluetoothHostMsg_UnregisterCharacteristic, |
| 219 OnUnregisterCharacteristicObject); |
| 216 IPC_MESSAGE_UNHANDLED(handled = false) | 220 IPC_MESSAGE_UNHANDLED(handled = false) |
| 217 IPC_END_MESSAGE_MAP() | 221 IPC_END_MESSAGE_MAP() |
| 218 return handled; | 222 return handled; |
| 219 } | 223 } |
| 220 | 224 |
| 221 void BluetoothDispatcherHost::SetBluetoothAdapterForTesting( | 225 void BluetoothDispatcherHost::SetBluetoothAdapterForTesting( |
| 222 scoped_refptr<device::BluetoothAdapter> mock_adapter) { | 226 scoped_refptr<device::BluetoothAdapter> mock_adapter) { |
| 223 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 227 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 224 current_delay_time_ = kTestingDelayTime; | 228 current_delay_time_ = kTestingDelayTime; |
| 225 // Reset the discovery session timer to use the new delay time. | 229 // Reset the discovery session timer to use the new delay time. |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 if (session->chooser) { | 368 if (session->chooser) { |
| 365 session->chooser->RemoveDevice(device->GetAddress()); | 369 session->chooser->RemoveDevice(device->GetAddress()); |
| 366 } | 370 } |
| 367 } | 371 } |
| 368 } | 372 } |
| 369 | 373 |
| 370 void BluetoothDispatcherHost::GattCharacteristicValueChanged( | 374 void BluetoothDispatcherHost::GattCharacteristicValueChanged( |
| 371 device::BluetoothAdapter* adapter, | 375 device::BluetoothAdapter* adapter, |
| 372 device::BluetoothGattCharacteristic* characteristic, | 376 device::BluetoothGattCharacteristic* characteristic, |
| 373 const std::vector<uint8>& value) { | 377 const std::vector<uint8>& value) { |
| 374 // TODO(ortuno): Notify renderer the characteristic changed. | 378 VLOG(1) << "Characteristic updated: " << characteristic->GetIdentifier(); |
| 375 // http://crbug.com/529560 | 379 auto iter = |
| 376 VLOG(1) << "Characteristic updated."; | 380 active_characteristic_threads_.find(characteristic->GetIdentifier()); |
| 381 |
| 382 if (iter == active_characteristic_threads_.end()) { |
| 383 return; |
| 384 } |
| 385 |
| 386 for (int thread_id : iter->second) { |
| 387 // Yield to the event loop so that the event gets dispatched after the |
| 388 // readValue promise resolves. |
| 389 // TODO(ortuno): Make sure the order of fulfulling promises and triggering |
| 390 // events matches the spec and that events don't get lost. |
| 391 // https://crbug.com/543882 |
| 392 if (!base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 393 FROM_HERE, |
| 394 base::Bind(&BluetoothDispatcherHost::NotifyActiveCharacteristic, |
| 395 weak_ptr_on_ui_thread_, thread_id, |
| 396 characteristic->GetIdentifier(), value))) { |
| 397 LOG(WARNING) << "No TaskRunner."; |
| 398 } |
| 399 } |
| 400 } |
| 401 |
| 402 void BluetoothDispatcherHost::NotifyActiveCharacteristic( |
| 403 int thread_id, |
| 404 const std::string& characteristic_instance_id, |
| 405 const std::vector<uint8>& value) { |
| 406 Send(new BluetoothMsg_CharacteristicValueChanged( |
| 407 thread_id, characteristic_instance_id, value)); |
| 377 } | 408 } |
| 378 | 409 |
| 379 void BluetoothDispatcherHost::OnRequestDevice( | 410 void BluetoothDispatcherHost::OnRequestDevice( |
| 380 int thread_id, | 411 int thread_id, |
| 381 int request_id, | 412 int request_id, |
| 382 int frame_routing_id, | 413 int frame_routing_id, |
| 383 const std::vector<BluetoothScanFilter>& filters, | 414 const std::vector<BluetoothScanFilter>& filters, |
| 384 const std::vector<BluetoothUUID>& optional_services) { | 415 const std::vector<BluetoothUUID>& optional_services) { |
| 385 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 416 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 386 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::REQUEST_DEVICE); | 417 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::REQUEST_DEVICE); |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 798 if (notify_session_iter == characteristic_id_to_notify_session_.end()) { | 829 if (notify_session_iter == characteristic_id_to_notify_session_.end()) { |
| 799 Send(new BluetoothMsg_StopNotificationsSuccess(thread_id, request_id)); | 830 Send(new BluetoothMsg_StopNotificationsSuccess(thread_id, request_id)); |
| 800 return; | 831 return; |
| 801 } | 832 } |
| 802 notify_session_iter->second->Stop( | 833 notify_session_iter->second->Stop( |
| 803 base::Bind(&BluetoothDispatcherHost::OnStopNotifySession, | 834 base::Bind(&BluetoothDispatcherHost::OnStopNotifySession, |
| 804 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, | 835 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, |
| 805 characteristic_instance_id)); | 836 characteristic_instance_id)); |
| 806 } | 837 } |
| 807 | 838 |
| 839 void BluetoothDispatcherHost::OnRegisterCharacteristicObject( |
| 840 int thread_id, |
| 841 const std::string& characteristic_instance_id) { |
| 842 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 843 active_characteristic_threads_[characteristic_instance_id].insert(thread_id); |
| 844 } |
| 845 |
| 846 void BluetoothDispatcherHost::OnUnregisterCharacteristicObject( |
| 847 int thread_id, |
| 848 const std::string& characteristic_instance_id) { |
| 849 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 850 auto active_iter = |
| 851 active_characteristic_threads_.find(characteristic_instance_id); |
| 852 if (active_iter == active_characteristic_threads_.end()) { |
| 853 return; |
| 854 } |
| 855 std::set<int>& thread_ids_set = active_iter->second; |
| 856 thread_ids_set.erase(thread_id); |
| 857 if (thread_ids_set.empty()) { |
| 858 active_characteristic_threads_.erase(active_iter); |
| 859 } |
| 860 } |
| 861 |
| 808 void BluetoothDispatcherHost::OnDiscoverySessionStarted( | 862 void BluetoothDispatcherHost::OnDiscoverySessionStarted( |
| 809 int chooser_id, | 863 int chooser_id, |
| 810 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { | 864 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { |
| 811 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 865 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 812 VLOG(1) << "Started discovery session for " << chooser_id; | 866 VLOG(1) << "Started discovery session for " << chooser_id; |
| 813 if (RequestDeviceSession* session = | 867 if (RequestDeviceSession* session = |
| 814 request_device_sessions_.Lookup(chooser_id)) { | 868 request_device_sessions_.Lookup(chooser_id)) { |
| 815 session->discovery_session = discovery_session.Pass(); | 869 session->discovery_session = discovery_session.Pass(); |
| 816 | 870 |
| 817 // Arrange to stop discovery later. | 871 // Arrange to stop discovery later. |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1084 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1138 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1085 NOTIMPLEMENTED(); | 1139 NOTIMPLEMENTED(); |
| 1086 } | 1140 } |
| 1087 | 1141 |
| 1088 void BluetoothDispatcherHost::ShowBluetoothAdapterOffLink() { | 1142 void BluetoothDispatcherHost::ShowBluetoothAdapterOffLink() { |
| 1089 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1143 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1090 NOTIMPLEMENTED(); | 1144 NOTIMPLEMENTED(); |
| 1091 } | 1145 } |
| 1092 | 1146 |
| 1093 } // namespace content | 1147 } // namespace content |
| OLD | NEW |