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

Side by Side Diff: content/browser/bluetooth/bluetooth_dispatcher_host.cc

Issue 1235243005: Refactor the BluetoothDispatcherHost to store requestDevice sessions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@error-enum-cleanup
Patch Set: Add a comment Created 5 years, 5 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 unified diff | Download patch
OLDNEW
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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 current_delay_time_ = kTestingDelayTime; 179 current_delay_time_ = kTestingDelayTime;
180 set_adapter(mock_adapter.Pass()); 180 set_adapter(mock_adapter.Pass());
181 } 181 }
182 182
183 BluetoothDispatcherHost::~BluetoothDispatcherHost() { 183 BluetoothDispatcherHost::~BluetoothDispatcherHost() {
184 DCHECK_CURRENTLY_ON(BrowserThread::UI); 184 DCHECK_CURRENTLY_ON(BrowserThread::UI);
185 // Clear adapter, releasing observer references. 185 // Clear adapter, releasing observer references.
186 set_adapter(scoped_refptr<device::BluetoothAdapter>()); 186 set_adapter(scoped_refptr<device::BluetoothAdapter>());
187 } 187 }
188 188
189 struct BluetoothDispatcherHost::DiscoverySessionOptions { 189 // Stores information associated with an in-progress requestDevice call. This
190 DiscoverySessionOptions(const std::vector<BluetoothScanFilter>& filters, 190 // will include the state of the active chooser dialog in a future patch.
191 const std::vector<BluetoothUUID>& optional_services) 191 struct BluetoothDispatcherHost::RequestDeviceSession {
192 RequestDeviceSession(const std::vector<BluetoothScanFilter>& filters,
193 const std::vector<BluetoothUUID>& optional_services)
192 : filters(filters), optional_services(optional_services) {} 194 : filters(filters), optional_services(optional_services) {}
193 195
194 std::vector<BluetoothScanFilter> filters; 196 std::vector<BluetoothScanFilter> filters;
195 std::vector<BluetoothUUID> optional_services; 197 std::vector<BluetoothUUID> optional_services;
196 }; 198 };
197 199
198 void BluetoothDispatcherHost::set_adapter( 200 void BluetoothDispatcherHost::set_adapter(
199 scoped_refptr<device::BluetoothAdapter> adapter) { 201 scoped_refptr<device::BluetoothAdapter> adapter) {
200 DCHECK_CURRENTLY_ON(BrowserThread::UI); 202 DCHECK_CURRENTLY_ON(BrowserThread::UI);
201 if (adapter_.get()) 203 if (adapter_.get())
(...skipping 20 matching lines...) Expand all
222 224
223 void BluetoothDispatcherHost::OnRequestDevice( 225 void BluetoothDispatcherHost::OnRequestDevice(
224 int thread_id, 226 int thread_id,
225 int request_id, 227 int request_id,
226 const std::vector<BluetoothScanFilter>& filters, 228 const std::vector<BluetoothScanFilter>& filters,
227 const std::vector<BluetoothUUID>& optional_services) { 229 const std::vector<BluetoothUUID>& optional_services) {
228 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 230 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
229 // TODO(scheib): Device selection UI: crbug.com/436280 231 // TODO(scheib): Device selection UI: crbug.com/436280
230 // TODO(scheib): Utilize BluetoothAdapter::Observer::DeviceAdded/Removed. 232 // TODO(scheib): Utilize BluetoothAdapter::Observer::DeviceAdded/Removed.
231 if (adapter_.get()) { 233 if (adapter_.get()) {
234 if (!request_device_sessions_
235 .insert(std::make_pair(
236 std::make_pair(thread_id, request_id),
237 RequestDeviceSession(filters, optional_services)))
238 .second) {
239 LOG(ERROR) << "2 requestDevice() calls with the same thread_id ("
240 << thread_id << ") and request_id (" << request_id
241 << ") shouldn't arrive at the same BluetoothDispatcherHost.";
242 bad_message::ReceivedBadMessage(
243 this, bad_message::BDH_DUPLICATE_REQUEST_DEVICE_ID);
244 }
232 adapter_->StartDiscoverySessionWithFilter( 245 adapter_->StartDiscoverySessionWithFilter(
233 ComputeScanFilter(filters), 246 ComputeScanFilter(filters),
234 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStarted, 247 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStarted,
235 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, 248 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id),
236 base::Passed(make_scoped_ptr(new DiscoverySessionOptions(
237 filters, optional_services)))),
238 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStartedError, 249 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStartedError,
239 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id)); 250 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id));
240 } else { 251 } else {
241 DLOG(WARNING) << "No BluetoothAdapter. Can't serve requestDevice."; 252 DLOG(WARNING) << "No BluetoothAdapter. Can't serve requestDevice.";
242 Send(new BluetoothMsg_RequestDeviceError( 253 Send(new BluetoothMsg_RequestDeviceError(
243 thread_id, request_id, WebBluetoothError::NoBluetoothAdapter)); 254 thread_id, request_id, WebBluetoothError::NoBluetoothAdapter));
244 } 255 }
245 return; 256 return;
246 } 257 }
247 258
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 characteristic->WriteRemoteCharacteristic( 476 characteristic->WriteRemoteCharacteristic(
466 value, base::Bind(&BluetoothDispatcherHost::OnWriteValueSuccess, 477 value, base::Bind(&BluetoothDispatcherHost::OnWriteValueSuccess,
467 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id), 478 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id),
468 base::Bind(&BluetoothDispatcherHost::OnWriteValueFailed, 479 base::Bind(&BluetoothDispatcherHost::OnWriteValueFailed,
469 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id)); 480 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id));
470 } 481 }
471 482
472 void BluetoothDispatcherHost::OnDiscoverySessionStarted( 483 void BluetoothDispatcherHost::OnDiscoverySessionStarted(
473 int thread_id, 484 int thread_id,
474 int request_id, 485 int request_id,
475 scoped_ptr<DiscoverySessionOptions> options,
476 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { 486 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) {
477 DCHECK_CURRENTLY_ON(BrowserThread::UI); 487 DCHECK_CURRENTLY_ON(BrowserThread::UI);
478 BrowserThread::PostDelayedTask( 488 BrowserThread::PostDelayedTask(
479 BrowserThread::UI, FROM_HERE, 489 BrowserThread::UI, FROM_HERE,
480 base::Bind(&BluetoothDispatcherHost::StopDiscoverySession, 490 base::Bind(&BluetoothDispatcherHost::StopDiscoverySession,
481 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, 491 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id,
482 base::Passed(&options), base::Passed(&discovery_session)), 492 base::Passed(&discovery_session)),
483 base::TimeDelta::FromSeconds(current_delay_time_)); 493 base::TimeDelta::FromSeconds(current_delay_time_));
484 } 494 }
485 495
486 void BluetoothDispatcherHost::OnDiscoverySessionStartedError(int thread_id, 496 void BluetoothDispatcherHost::OnDiscoverySessionStartedError(int thread_id,
487 int request_id) { 497 int request_id) {
488 DCHECK_CURRENTLY_ON(BrowserThread::UI); 498 DCHECK_CURRENTLY_ON(BrowserThread::UI);
489 DLOG(WARNING) << "BluetoothDispatcherHost::OnDiscoverySessionStartedError"; 499 DLOG(WARNING) << "BluetoothDispatcherHost::OnDiscoverySessionStartedError";
490 Send(new BluetoothMsg_RequestDeviceError( 500 Send(new BluetoothMsg_RequestDeviceError(
491 thread_id, request_id, WebBluetoothError::DiscoverySessionStartFailed)); 501 thread_id, request_id, WebBluetoothError::DiscoverySessionStartFailed));
502 request_device_sessions_.erase(std::make_pair(thread_id, request_id));
492 } 503 }
493 504
494 void BluetoothDispatcherHost::StopDiscoverySession( 505 void BluetoothDispatcherHost::StopDiscoverySession(
495 int thread_id, 506 int thread_id,
496 int request_id, 507 int request_id,
497 scoped_ptr<DiscoverySessionOptions> options,
498 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { 508 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) {
499 DCHECK_CURRENTLY_ON(BrowserThread::UI); 509 DCHECK_CURRENTLY_ON(BrowserThread::UI);
500 discovery_session->Stop( 510 discovery_session->Stop(
501 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStopped, 511 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStopped,
502 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, 512 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id),
503 base::Passed(&options)),
504 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStoppedError, 513 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStoppedError,
505 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id)); 514 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id));
506 } 515 }
507 516
508 void BluetoothDispatcherHost::OnDiscoverySessionStopped( 517 void BluetoothDispatcherHost::OnDiscoverySessionStopped(int thread_id,
509 int thread_id, 518 int request_id) {
510 int request_id,
511 scoped_ptr<DiscoverySessionOptions> options) {
512 DCHECK_CURRENTLY_ON(BrowserThread::UI); 519 DCHECK_CURRENTLY_ON(BrowserThread::UI);
520 auto session =
521 request_device_sessions_.find(std::make_pair(thread_id, request_id));
522 CHECK(session != request_device_sessions_.end());
513 BluetoothAdapter::DeviceList devices = adapter_->GetDevices(); 523 BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
514 for (device::BluetoothDevice* device : devices) { 524 for (device::BluetoothDevice* device : devices) {
515 if (MatchesFilters(*device, options->filters)) { 525 if (MatchesFilters(*device, session->second.filters)) {
516 content::BluetoothDevice device_ipc( 526 content::BluetoothDevice device_ipc(
517 device->GetAddress(), // instance_id 527 device->GetAddress(), // instance_id
518 device->GetName(), // name 528 device->GetName(), // name
519 device->GetBluetoothClass(), // device_class 529 device->GetBluetoothClass(), // device_class
520 device->GetVendorIDSource(), // vendor_id_source 530 device->GetVendorIDSource(), // vendor_id_source
521 device->GetVendorID(), // vendor_id 531 device->GetVendorID(), // vendor_id
522 device->GetProductID(), // product_id 532 device->GetProductID(), // product_id
523 device->GetDeviceID(), // product_version 533 device->GetDeviceID(), // product_version
524 device->IsPaired(), // paired 534 device->IsPaired(), // paired
525 content::BluetoothDevice::UUIDsFromBluetoothUUIDs( 535 content::BluetoothDevice::UUIDsFromBluetoothUUIDs(
526 device->GetUUIDs())); // uuids 536 device->GetUUIDs())); // uuids
527 Send(new BluetoothMsg_RequestDeviceSuccess(thread_id, request_id, 537 Send(new BluetoothMsg_RequestDeviceSuccess(thread_id, request_id,
528 device_ipc)); 538 device_ipc));
539 request_device_sessions_.erase(session);
529 return; 540 return;
530 } 541 }
531 } 542 }
532 Send(new BluetoothMsg_RequestDeviceError(thread_id, request_id, 543 Send(new BluetoothMsg_RequestDeviceError(thread_id, request_id,
533 WebBluetoothError::NoDevicesFound)); 544 WebBluetoothError::NoDevicesFound));
545 request_device_sessions_.erase(session);
534 } 546 }
535 547
536 void BluetoothDispatcherHost::OnDiscoverySessionStoppedError(int thread_id, 548 void BluetoothDispatcherHost::OnDiscoverySessionStoppedError(int thread_id,
537 int request_id) { 549 int request_id) {
538 DCHECK_CURRENTLY_ON(BrowserThread::UI); 550 DCHECK_CURRENTLY_ON(BrowserThread::UI);
539 DLOG(WARNING) << "BluetoothDispatcherHost::OnDiscoverySessionStoppedError"; 551 DLOG(WARNING) << "BluetoothDispatcherHost::OnDiscoverySessionStoppedError";
540 Send(new BluetoothMsg_RequestDeviceError( 552 Send(new BluetoothMsg_RequestDeviceError(
541 thread_id, request_id, WebBluetoothError::DiscoverySessionStopFailed)); 553 thread_id, request_id, WebBluetoothError::DiscoverySessionStopFailed));
554 request_device_sessions_.erase(std::make_pair(thread_id, request_id));
542 } 555 }
543 556
544 void BluetoothDispatcherHost::OnGATTConnectionCreated( 557 void BluetoothDispatcherHost::OnGATTConnectionCreated(
545 int thread_id, 558 int thread_id,
546 int request_id, 559 int request_id,
547 const std::string& device_instance_id, 560 const std::string& device_instance_id,
548 scoped_ptr<device::BluetoothGattConnection> connection) { 561 scoped_ptr<device::BluetoothGattConnection> connection) {
549 // TODO(ortuno): Save the BluetoothGattConnection so we can disconnect 562 // TODO(ortuno): Save the BluetoothGattConnection so we can disconnect
550 // from it. 563 // from it.
551 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id, 564 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 634
622 void BluetoothDispatcherHost::OnWriteValueFailed( 635 void BluetoothDispatcherHost::OnWriteValueFailed(
623 int thread_id, 636 int thread_id,
624 int request_id, 637 int request_id,
625 device::BluetoothGattService::GattErrorCode error_code) { 638 device::BluetoothGattService::GattErrorCode error_code) {
626 Send(new BluetoothMsg_WriteCharacteristicValueError( 639 Send(new BluetoothMsg_WriteCharacteristicValueError(
627 thread_id, request_id, TranslateGATTError(error_code))); 640 thread_id, request_id, TranslateGATTError(error_code)));
628 } 641 }
629 642
630 } // namespace content 643 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/bluetooth/bluetooth_dispatcher_host.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698