Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/bluez/bluetooth_device_bluez.h" | 5 #include "device/bluetooth/bluez/bluetooth_device_bluez.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 149 scoped_refptr<device::BluetoothSocketThread> socket_thread) | 149 scoped_refptr<device::BluetoothSocketThread> socket_thread) |
| 150 : BluetoothDevice(adapter), | 150 : BluetoothDevice(adapter), |
| 151 object_path_(object_path), | 151 object_path_(object_path), |
| 152 num_connecting_calls_(0), | 152 num_connecting_calls_(0), |
| 153 connection_monitor_started_(false), | 153 connection_monitor_started_(false), |
| 154 ui_task_runner_(ui_task_runner), | 154 ui_task_runner_(ui_task_runner), |
| 155 socket_thread_(socket_thread), | 155 socket_thread_(socket_thread), |
| 156 weak_ptr_factory_(this) { | 156 weak_ptr_factory_(this) { |
| 157 bluez::BluezDBusManager::Get()->GetBluetoothGattServiceClient()->AddObserver( | 157 bluez::BluezDBusManager::Get()->GetBluetoothGattServiceClient()->AddObserver( |
| 158 this); | 158 this); |
| 159 bluez::BluezDBusManager::Get()->GetBluetoothDeviceClient()->AddObserver(this); | |
| 160 | 159 |
| 161 InitializeGattServiceMap(); | 160 // If GATT Services have already been discovered update the list of Gatt |
| 161 // Services. | |
| 162 if (IsGattServicesDiscoveryComplete()) { | |
|
ortuno
2016/07/06 21:31:46
luiz: You mentioned that this will always be false
vudentz
2016/07/07 09:45:08
Yep, I was assuming this object to be responsible
| |
| 163 UpdateGattServices(object_path_); | |
| 164 } else { | |
| 165 VLOG(2) << "Gatt services have not been fully resolved for device " | |
| 166 << object_path_.value(); | |
| 167 } | |
| 162 } | 168 } |
| 163 | 169 |
| 164 BluetoothDeviceBlueZ::~BluetoothDeviceBlueZ() { | 170 BluetoothDeviceBlueZ::~BluetoothDeviceBlueZ() { |
| 165 bluez::BluezDBusManager::Get() | 171 bluez::BluezDBusManager::Get() |
| 166 ->GetBluetoothGattServiceClient() | 172 ->GetBluetoothGattServiceClient() |
| 167 ->RemoveObserver(this); | 173 ->RemoveObserver(this); |
| 168 | 174 |
| 169 bluez::BluezDBusManager::Get()->GetBluetoothDeviceClient()->RemoveObserver( | |
| 170 this); | |
| 171 // Copy the GATT services list here and clear the original so that when we | 175 // Copy the GATT services list here and clear the original so that when we |
| 172 // send GattServiceRemoved(), GetGattServices() returns no services. | 176 // send GattServiceRemoved(), GetGattServices() returns no services. |
| 173 GattServiceMap gatt_services_swapped; | 177 GattServiceMap gatt_services_swapped; |
| 174 gatt_services_swapped.swap(gatt_services_); | 178 gatt_services_swapped.swap(gatt_services_); |
| 175 for (const auto& iter : gatt_services_swapped) { | 179 for (const auto& iter : gatt_services_swapped) { |
| 176 DCHECK(adapter()); | 180 DCHECK(adapter()); |
| 177 adapter()->NotifyGattServiceRemoved( | 181 adapter()->NotifyGattServiceRemoved( |
| 178 static_cast<BluetoothRemoteGattServiceBlueZ*>(iter.second)); | 182 static_cast<BluetoothRemoteGattServiceBlueZ*>(iter.second)); |
| 179 } | 183 } |
| 180 } | 184 } |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 574 } | 578 } |
| 575 | 579 |
| 576 BluetoothPairingBlueZ* BluetoothDeviceBlueZ::GetPairing() const { | 580 BluetoothPairingBlueZ* BluetoothDeviceBlueZ::GetPairing() const { |
| 577 return pairing_.get(); | 581 return pairing_.get(); |
| 578 } | 582 } |
| 579 | 583 |
| 580 BluetoothAdapterBlueZ* BluetoothDeviceBlueZ::adapter() const { | 584 BluetoothAdapterBlueZ* BluetoothDeviceBlueZ::adapter() const { |
| 581 return static_cast<BluetoothAdapterBlueZ*>(adapter_); | 585 return static_cast<BluetoothAdapterBlueZ*>(adapter_); |
| 582 } | 586 } |
| 583 | 587 |
| 584 void BluetoothDeviceBlueZ::DevicePropertyChanged( | |
| 585 const dbus::ObjectPath& object_path, | |
| 586 const std::string& property_name) { | |
| 587 if (object_path != object_path_) | |
| 588 return; | |
| 589 | |
| 590 bluez::BluetoothDeviceClient::Properties* properties = | |
| 591 bluez::BluezDBusManager::Get()->GetBluetoothDeviceClient()->GetProperties( | |
| 592 object_path); | |
| 593 DCHECK(properties); | |
| 594 | |
| 595 if (property_name == properties->services_resolved.name() && | |
| 596 properties->services_resolved.value()) { | |
| 597 VLOG(3) << "All services were discovered for device: " | |
| 598 << object_path.value(); | |
| 599 | |
| 600 for (const auto iter : newly_discovered_gatt_services_) { | |
| 601 adapter()->NotifyGattDiscoveryComplete( | |
| 602 static_cast<BluetoothRemoteGattService*>(iter)); | |
| 603 } | |
| 604 newly_discovered_gatt_services_.clear(); | |
| 605 } | |
| 606 } | |
| 607 | |
| 608 void BluetoothDeviceBlueZ::GattServiceAdded( | 588 void BluetoothDeviceBlueZ::GattServiceAdded( |
| 609 const dbus::ObjectPath& object_path) { | 589 const dbus::ObjectPath& object_path) { |
| 610 if (GetGattService(object_path.value())) { | 590 if (GetGattService(object_path.value())) { |
| 611 VLOG(1) << "Remote GATT service already exists: " << object_path.value(); | 591 VLOG(1) << "Remote GATT service already exists: " << object_path.value(); |
| 612 return; | 592 return; |
| 613 } | 593 } |
| 614 | 594 |
| 615 bluez::BluetoothGattServiceClient::Properties* properties = | 595 bluez::BluetoothGattServiceClient::Properties* properties = |
| 616 bluez::BluezDBusManager::Get() | 596 bluez::BluezDBusManager::Get() |
| 617 ->GetBluetoothGattServiceClient() | 597 ->GetBluetoothGattServiceClient() |
| 618 ->GetProperties(object_path); | 598 ->GetProperties(object_path); |
| 619 DCHECK(properties); | 599 DCHECK(properties); |
| 620 if (properties->device.value() != object_path_) { | 600 if (properties->device.value() != object_path_) { |
| 621 VLOG(2) << "Remote GATT service does not belong to this device."; | 601 VLOG(2) << "Remote GATT service does not belong to this device."; |
| 622 return; | 602 return; |
| 623 } | 603 } |
| 624 | 604 |
| 625 VLOG(1) << "Adding new remote GATT service for device: " << GetAddress(); | 605 VLOG(1) << "Adding new remote GATT service for device: " << GetAddress(); |
| 626 | 606 |
| 627 BluetoothRemoteGattServiceBlueZ* service = | 607 BluetoothRemoteGattServiceBlueZ* service = |
| 628 new BluetoothRemoteGattServiceBlueZ(adapter(), this, object_path); | 608 new BluetoothRemoteGattServiceBlueZ(adapter(), this, object_path); |
| 629 | 609 |
| 630 newly_discovered_gatt_services_.push_back( | |
| 631 static_cast<BluetoothRemoteGattServiceBlueZ*>(service)); | |
| 632 | |
| 633 gatt_services_.set(service->GetIdentifier(), | 610 gatt_services_.set(service->GetIdentifier(), |
| 634 std::unique_ptr<BluetoothRemoteGattService>(service)); | 611 std::unique_ptr<BluetoothRemoteGattService>(service)); |
| 635 DCHECK(service->object_path() == object_path); | 612 DCHECK(service->object_path() == object_path); |
| 636 DCHECK(service->GetUUID().IsValid()); | 613 DCHECK(service->GetUUID().IsValid()); |
| 637 | 614 |
| 638 DCHECK(adapter()); | 615 DCHECK(adapter()); |
| 639 adapter()->NotifyGattServiceAdded(service); | 616 adapter()->NotifyGattServiceAdded(service); |
| 640 } | 617 } |
| 641 | 618 |
| 642 void BluetoothDeviceBlueZ::GattServiceRemoved( | 619 void BluetoothDeviceBlueZ::GattServiceRemoved( |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 653 | 630 |
| 654 VLOG(1) << "Removing remote GATT service with UUID: '" | 631 VLOG(1) << "Removing remote GATT service with UUID: '" |
| 655 << service->GetUUID().canonical_value() | 632 << service->GetUUID().canonical_value() |
| 656 << "' from device: " << GetAddress(); | 633 << "' from device: " << GetAddress(); |
| 657 | 634 |
| 658 DCHECK(service->object_path() == object_path); | 635 DCHECK(service->object_path() == object_path); |
| 659 std::unique_ptr<BluetoothRemoteGattService> scoped_service = | 636 std::unique_ptr<BluetoothRemoteGattService> scoped_service = |
| 660 gatt_services_.take_and_erase(iter->first); | 637 gatt_services_.take_and_erase(iter->first); |
| 661 | 638 |
| 662 DCHECK(adapter()); | 639 DCHECK(adapter()); |
| 640 discovery_complete_notified_.erase(service); | |
| 663 adapter()->NotifyGattServiceRemoved(service); | 641 adapter()->NotifyGattServiceRemoved(service); |
| 664 } | 642 } |
| 665 | 643 |
| 666 void BluetoothDeviceBlueZ::InitializeGattServiceMap() { | 644 void BluetoothDeviceBlueZ::UpdateGattServices( |
| 667 DCHECK(gatt_services_.empty()); | 645 const dbus::ObjectPath& object_path) { |
| 668 | 646 if (object_path != object_path_) { |
| 669 if (!IsGattServicesDiscoveryComplete()) { | 647 // No need to update map if update is for a different device. |
| 670 VLOG(2) << "Gatt services have not been fully resolved for device " | |
| 671 << object_path_.value(); | |
| 672 return; | 648 return; |
| 673 } | 649 } |
| 674 | 650 |
| 675 VLOG(3) << "Initializing the list of GATT services associated with device " | 651 DCHECK(IsGattServicesDiscoveryComplete()); |
| 652 | |
| 653 VLOG(3) << "Updating the list of GATT services associated with device " | |
| 676 << object_path_.value(); | 654 << object_path_.value(); |
| 677 | 655 |
| 678 // Add all known GATT services associated with the device. | 656 const std::vector<dbus::ObjectPath> service_paths = |
| 679 const std::vector<dbus::ObjectPath> gatt_services = | |
| 680 bluez::BluezDBusManager::Get() | 657 bluez::BluezDBusManager::Get() |
| 681 ->GetBluetoothGattServiceClient() | 658 ->GetBluetoothGattServiceClient() |
| 682 ->GetServices(); | 659 ->GetServices(); |
| 683 for (const auto& it : gatt_services) | 660 for (const auto& service_path : service_paths) { |
| 684 GattServiceAdded(it); | 661 // Add all previously unknown GATT services associated with the device. |
| 662 GattServiceAdded(service_path); | |
| 685 | 663 |
| 686 // Notify on the discovery complete for each service which is found in the | 664 // If the service does not belong in this device, there is nothing left to |
| 687 // first discovery. | 665 // do. |
| 688 DCHECK(adapter()); | 666 BluetoothRemoteGattService* service = GetGattService(service_path.value()); |
| 689 for (const auto& iter : gatt_services_) | 667 if (service == nullptr) { |
| 690 adapter()->NotifyGattDiscoveryComplete(iter.second); | 668 return; |
| 669 } | |
| 670 | |
| 671 // Notify of GATT discovery complete if we haven't before. | |
| 672 auto notified_pair = discovery_complete_notified_.insert(service); | |
| 673 if (notified_pair.second) { | |
| 674 adapter()->NotifyGattDiscoveryComplete(service); | |
| 675 } | |
| 676 } | |
| 691 } | 677 } |
| 692 | 678 |
| 693 void BluetoothDeviceBlueZ::OnGetConnInfo(const ConnectionInfoCallback& callback, | 679 void BluetoothDeviceBlueZ::OnGetConnInfo(const ConnectionInfoCallback& callback, |
| 694 int16_t rssi, | 680 int16_t rssi, |
| 695 int16_t transmit_power, | 681 int16_t transmit_power, |
| 696 int16_t max_transmit_power) { | 682 int16_t max_transmit_power) { |
| 697 callback.Run(ConnectionInfo(rssi, transmit_power, max_transmit_power)); | 683 callback.Run(ConnectionInfo(rssi, transmit_power, max_transmit_power)); |
| 698 } | 684 } |
| 699 | 685 |
| 700 void BluetoothDeviceBlueZ::OnGetConnInfoError( | 686 void BluetoothDeviceBlueZ::OnGetConnInfoError( |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 887 void BluetoothDeviceBlueZ::OnForgetError(const ErrorCallback& error_callback, | 873 void BluetoothDeviceBlueZ::OnForgetError(const ErrorCallback& error_callback, |
| 888 const std::string& error_name, | 874 const std::string& error_name, |
| 889 const std::string& error_message) { | 875 const std::string& error_message) { |
| 890 LOG(WARNING) << object_path_.value() | 876 LOG(WARNING) << object_path_.value() |
| 891 << ": Failed to remove device: " << error_name << ": " | 877 << ": Failed to remove device: " << error_name << ": " |
| 892 << error_message; | 878 << error_message; |
| 893 error_callback.Run(); | 879 error_callback.Run(); |
| 894 } | 880 } |
| 895 | 881 |
| 896 } // namespace bluez | 882 } // namespace bluez |
| OLD | NEW |