OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "device/bluetooth/bluetooth_task_manager_win.h" | 5 #include "device/bluetooth/bluetooth_task_manager_win.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <winsock2.h> | 8 #include <winsock2.h> |
9 | 9 |
10 #include <string> | 10 #include <string> |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 } | 135 } |
136 | 136 |
137 BluetoothTaskManagerWin::BluetoothTaskManagerWin( | 137 BluetoothTaskManagerWin::BluetoothTaskManagerWin( |
138 scoped_refptr<base::SequencedTaskRunner> ui_task_runner) | 138 scoped_refptr<base::SequencedTaskRunner> ui_task_runner) |
139 : ui_task_runner_(ui_task_runner), | 139 : ui_task_runner_(ui_task_runner), |
140 discovering_(false), | 140 discovering_(false), |
141 current_logging_batch_count_(0) { | 141 current_logging_batch_count_(0) { |
142 } | 142 } |
143 | 143 |
144 BluetoothTaskManagerWin::~BluetoothTaskManagerWin() { | 144 BluetoothTaskManagerWin::~BluetoothTaskManagerWin() { |
| 145 win::BluetoothLowEnergyWrapper::DeleteInstance(); |
145 } | 146 } |
146 | 147 |
147 void BluetoothTaskManagerWin::AddObserver(Observer* observer) { | 148 void BluetoothTaskManagerWin::AddObserver(Observer* observer) { |
148 DCHECK(observer); | 149 DCHECK(observer); |
149 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); | 150 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); |
150 observers_.AddObserver(observer); | 151 observers_.AddObserver(observer); |
151 } | 152 } |
152 | 153 |
153 void BluetoothTaskManagerWin::RemoveObserver(Observer* observer) { | 154 void BluetoothTaskManagerWin::RemoveObserver(Observer* observer) { |
154 DCHECK(observer); | 155 DCHECK(observer); |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 } | 474 } |
474 | 475 |
475 bool BluetoothTaskManagerWin::SearchLowEnergyDevices( | 476 bool BluetoothTaskManagerWin::SearchLowEnergyDevices( |
476 ScopedVector<DeviceState>* device_list) { | 477 ScopedVector<DeviceState>* device_list) { |
477 if (!win::IsBluetoothLowEnergySupported()) | 478 if (!win::IsBluetoothLowEnergySupported()) |
478 return true; // Bluetooth LE not supported is not an error. | 479 return true; // Bluetooth LE not supported is not an error. |
479 | 480 |
480 ScopedVector<win::BluetoothLowEnergyDeviceInfo> btle_devices; | 481 ScopedVector<win::BluetoothLowEnergyDeviceInfo> btle_devices; |
481 std::string error; | 482 std::string error; |
482 bool success = | 483 bool success = |
483 win::EnumerateKnownBluetoothLowEnergyDevices(&btle_devices, &error); | 484 win::BluetoothLowEnergyWrapper::GetInstance() |
| 485 ->EnumerateKnownBluetoothLowEnergyDevices(&btle_devices, &error); |
484 if (!success) { | 486 if (!success) { |
485 LogPollingError(error.c_str(), 0); | 487 LogPollingError(error.c_str(), 0); |
486 return false; | 488 return false; |
487 } | 489 } |
488 | 490 |
489 for (ScopedVector<win::BluetoothLowEnergyDeviceInfo>::iterator iter = | 491 for (ScopedVector<win::BluetoothLowEnergyDeviceInfo>::iterator iter = |
490 btle_devices.begin(); | 492 btle_devices.begin(); |
491 iter != btle_devices.end(); | 493 iter != btle_devices.end(); |
492 ++iter) { | 494 ++iter) { |
493 win::BluetoothLowEnergyDeviceInfo* device_info = (*iter); | 495 win::BluetoothLowEnergyDeviceInfo* device_info = (*iter); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 } | 632 } |
631 | 633 |
632 bool BluetoothTaskManagerWin::DiscoverLowEnergyDeviceServices( | 634 bool BluetoothTaskManagerWin::DiscoverLowEnergyDeviceServices( |
633 const base::FilePath& device_path, | 635 const base::FilePath& device_path, |
634 ScopedVector<ServiceRecordState>* service_record_states) { | 636 ScopedVector<ServiceRecordState>* service_record_states) { |
635 if (!win::IsBluetoothLowEnergySupported()) | 637 if (!win::IsBluetoothLowEnergySupported()) |
636 return true; // Bluetooth LE not supported is not an error. | 638 return true; // Bluetooth LE not supported is not an error. |
637 | 639 |
638 std::string error; | 640 std::string error; |
639 ScopedVector<win::BluetoothLowEnergyServiceInfo> services; | 641 ScopedVector<win::BluetoothLowEnergyServiceInfo> services; |
640 bool success = win::EnumerateKnownBluetoothLowEnergyServices( | 642 bool success = win::BluetoothLowEnergyWrapper::GetInstance() |
641 device_path, &services, &error); | 643 ->EnumerateKnownBluetoothLowEnergyServices( |
| 644 device_path, &services, &error); |
642 if (!success) { | 645 if (!success) { |
643 LogPollingError(error.c_str(), 0); | 646 LogPollingError(error.c_str(), 0); |
644 return false; | 647 return false; |
645 } | 648 } |
646 | 649 |
647 for (ScopedVector<win::BluetoothLowEnergyServiceInfo>::iterator iter2 = | 650 for (ScopedVector<win::BluetoothLowEnergyServiceInfo>::iterator iter2 = |
648 services.begin(); | 651 services.begin(); |
649 iter2 != services.end(); | 652 iter2 != services.end(); |
650 ++iter2) { | 653 ++iter2) { |
651 ServiceRecordState* service_state = new ServiceRecordState(); | 654 ServiceRecordState* service_state = new ServiceRecordState(); |
(...skipping 10 matching lines...) Expand all Loading... |
662 // lists all GATT service devices and matches them back to correspond GATT | 665 // lists all GATT service devices and matches them back to correspond GATT |
663 // service of the BLE device according to their address and included service | 666 // service of the BLE device according to their address and included service |
664 // attribute handles, as we did not find a more neat way to bond them. | 667 // attribute handles, as we did not find a more neat way to bond them. |
665 bool BluetoothTaskManagerWin::SearchForGattServiceDevicePaths( | 668 bool BluetoothTaskManagerWin::SearchForGattServiceDevicePaths( |
666 const std::string device_address, | 669 const std::string device_address, |
667 ScopedVector<ServiceRecordState>* service_record_states) { | 670 ScopedVector<ServiceRecordState>* service_record_states) { |
668 std::string error; | 671 std::string error; |
669 | 672 |
670 // List all known GATT service devices on the machine. | 673 // List all known GATT service devices on the machine. |
671 ScopedVector<win::BluetoothLowEnergyDeviceInfo> gatt_service_devices; | 674 ScopedVector<win::BluetoothLowEnergyDeviceInfo> gatt_service_devices; |
672 bool success = win::EnumerateKnownBluetoothLowEnergyGattServiceDevices( | 675 bool success = win::BluetoothLowEnergyWrapper::GetInstance() |
673 &gatt_service_devices, &error); | 676 ->EnumerateKnownBluetoothLowEnergyGattServiceDevices( |
| 677 &gatt_service_devices, &error); |
674 if (!success) { | 678 if (!success) { |
675 LogPollingError(error.c_str(), 0); | 679 LogPollingError(error.c_str(), 0); |
676 return false; | 680 return false; |
677 } | 681 } |
678 | 682 |
679 for (auto gatt_service_device : gatt_service_devices) { | 683 for (auto gatt_service_device : gatt_service_devices) { |
680 // Only care about the service devices with |device_address|. | 684 // Only care about the service devices with |device_address|. |
681 if (BluetoothAddressToCanonicalString(gatt_service_device->address) != | 685 if (BluetoothAddressToCanonicalString(gatt_service_device->address) != |
682 device_address) { | 686 device_address) { |
683 continue; | 687 continue; |
684 } | 688 } |
685 | 689 |
686 // Discover this service device's contained services. | 690 // Discover this service device's contained services. |
687 ScopedVector<win::BluetoothLowEnergyServiceInfo> gatt_services; | 691 ScopedVector<win::BluetoothLowEnergyServiceInfo> gatt_services; |
688 if (!win::EnumerateKnownBluetoothLowEnergyServices( | 692 if (!win::BluetoothLowEnergyWrapper::GetInstance() |
689 gatt_service_device->path, &gatt_services, &error)) { | 693 ->EnumerateKnownBluetoothLowEnergyServices( |
| 694 gatt_service_device->path, &gatt_services, &error)) { |
690 LogPollingError(error.c_str(), 0); | 695 LogPollingError(error.c_str(), 0); |
691 continue; | 696 continue; |
692 } | 697 } |
693 | 698 |
694 // Usually each service device correspond to one Gatt service. | 699 // Usually each service device correspond to one Gatt service. |
695 if (gatt_services.size() > 1) { | 700 if (gatt_services.size() > 1) { |
696 LOG(WARNING) << "This GATT service device contains more than one (" | 701 LOG(WARNING) << "This GATT service device contains more than one (" |
697 << gatt_services.size() << ") services"; | 702 << gatt_services.size() << ") services"; |
698 } | 703 } |
699 | 704 |
700 // Associate service device to corresponding service record. Attribute | 705 // Associate service device to corresponding service record. Attribute |
701 // handle is unique on one device. | 706 // handle is unique on one device. |
702 for (auto gatt_service : gatt_services) { | 707 for (auto gatt_service : gatt_services) { |
703 for (auto service_record_state : *service_record_states) { | 708 for (auto service_record_state : *service_record_states) { |
704 if (service_record_state->attribute_handle == | 709 if (service_record_state->attribute_handle == |
705 gatt_service->attribute_handle) { | 710 gatt_service->attribute_handle) { |
706 service_record_state->path = gatt_service_device->path; | 711 service_record_state->path = gatt_service_device->path; |
707 break; | 712 break; |
708 } | 713 } |
709 } | 714 } |
710 } | 715 } |
711 } | 716 } |
712 | 717 |
713 return true; | 718 return true; |
714 } | 719 } |
715 | 720 |
716 } // namespace device | 721 } // namespace device |
OLD | NEW |