| Index: chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_event_router.cc
|
| diff --git a/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_event_router.cc b/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_event_router.cc
|
| index c505780136886dd7a15420fab6cdc759d374d623..5dd4ec1203bfba8fbd43f4a622f4f0d2bd22f35c 100644
|
| --- a/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_event_router.cc
|
| +++ b/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_event_router.cc
|
| @@ -102,11 +102,6 @@ void PopulateCharacteristic(const BluetoothGattCharacteristic* characteristic,
|
|
|
| namespace extensions {
|
|
|
| -BluetoothLowEnergyEventRouter::GattObjectData::GattObjectData() {
|
| -}
|
| -BluetoothLowEnergyEventRouter::GattObjectData::~GattObjectData() {
|
| -}
|
| -
|
| BluetoothLowEnergyEventRouter::BluetoothLowEnergyEventRouter(
|
| content::BrowserContext* context)
|
| : adapter_(NULL), browser_context_(context), weak_ptr_factory_(this) {
|
| @@ -140,20 +135,9 @@ BluetoothLowEnergyEventRouter::~BluetoothLowEnergyEventRouter() {
|
| observed_gatt_services_.begin();
|
| iter != observed_gatt_services_.end();
|
| ++iter) {
|
| - InstanceIdToObjectDataMap::const_iterator id_iter =
|
| - service_ids_to_objects_.find(*iter);
|
| - if (id_iter == service_ids_to_objects_.end())
|
| - continue;
|
| -
|
| - GattObjectData data = id_iter->second;
|
| - BluetoothDevice* device = adapter_->GetDevice(data.device_address);
|
| - if (!device)
|
| - continue;
|
| -
|
| - BluetoothGattService* service = device->GetGattService(data.service_id);
|
| + BluetoothGattService* service = FindServiceById(*iter);
|
| if (!service)
|
| continue;
|
| -
|
| service->RemoveObserver(this);
|
| }
|
|
|
| @@ -312,6 +296,26 @@ bool BluetoothLowEnergyEventRouter::GetCharacteristics(
|
| return true;
|
| }
|
|
|
| +bool BluetoothLowEnergyEventRouter::GetCharacteristic(
|
| + const std::string& instance_id,
|
| + apibtle::Characteristic* out_characteristic) const {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + if (!adapter_) {
|
| + VLOG(1) << "BluetoothAdapter not ready.";
|
| + return false;
|
| + }
|
| +
|
| + BluetoothGattCharacteristic* characteristic =
|
| + FindCharacteristicById(instance_id);
|
| + if (!characteristic) {
|
| + VLOG(1) << "Characteristic not found: " << instance_id;
|
| + return false;
|
| + }
|
| +
|
| + PopulateCharacteristic(characteristic, out_characteristic);
|
| + return true;
|
| +}
|
| +
|
| void BluetoothLowEnergyEventRouter::SetAdapterForTesting(
|
| device::BluetoothAdapter* adapter) {
|
| adapter_ = adapter;
|
| @@ -344,16 +348,14 @@ void BluetoothLowEnergyEventRouter::GattServiceAdded(
|
|
|
| DCHECK(observed_gatt_services_.find(service->GetIdentifier()) ==
|
| observed_gatt_services_.end());
|
| - DCHECK(service_ids_to_objects_.find(service->GetIdentifier()) ==
|
| - service_ids_to_objects_.end());
|
| + DCHECK(service_id_to_device_address_.find(service->GetIdentifier()) ==
|
| + service_id_to_device_address_.end());
|
|
|
| service->AddObserver(this);
|
| - observed_gatt_services_.insert(service->GetIdentifier());
|
|
|
| - GattObjectData data;
|
| - data.device_address = device->GetAddress();
|
| - data.service_id = service->GetIdentifier();
|
| - service_ids_to_objects_[data.service_id] = data;
|
| + const std::string& service_id = service->GetIdentifier();
|
| + observed_gatt_services_.insert(service_id);
|
| + service_id_to_device_address_[service_id] = device->GetAddress();
|
|
|
| // Signal API event.
|
| apibtle::Service api_service;
|
| @@ -374,15 +376,15 @@ void BluetoothLowEnergyEventRouter::GattServiceRemoved(
|
|
|
| DCHECK(observed_gatt_services_.find(service->GetIdentifier()) !=
|
| observed_gatt_services_.end());
|
| - DCHECK(service_ids_to_objects_.find(service->GetIdentifier()) !=
|
| - service_ids_to_objects_.end());
|
| + DCHECK(service_id_to_device_address_.find(service->GetIdentifier()) !=
|
| + service_id_to_device_address_.end());
|
|
|
| service->RemoveObserver(this);
|
| observed_gatt_services_.erase(service->GetIdentifier());
|
|
|
| DCHECK(device->GetAddress() ==
|
| - service_ids_to_objects_[service->GetIdentifier()].device_address);
|
| - service_ids_to_objects_.erase(service->GetIdentifier());
|
| + service_id_to_device_address_[service->GetIdentifier()]);
|
| + service_id_to_device_address_.erase(service->GetIdentifier());
|
|
|
| // Signal API event.
|
| apibtle::Service api_service;
|
| @@ -402,8 +404,8 @@ void BluetoothLowEnergyEventRouter::GattServiceChanged(
|
|
|
| DCHECK(observed_gatt_services_.find(service->GetIdentifier()) !=
|
| observed_gatt_services_.end());
|
| - DCHECK(service_ids_to_objects_.find(service->GetIdentifier()) !=
|
| - service_ids_to_objects_.end());
|
| + DCHECK(service_id_to_device_address_.find(service->GetIdentifier()) !=
|
| + service_id_to_device_address_.end());
|
|
|
| // Signal API event.
|
| apibtle::Service api_service;
|
| @@ -422,14 +424,11 @@ void BluetoothLowEnergyEventRouter::GattCharacteristicAdded(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| VLOG(2) << "GATT characteristic added: " << characteristic->GetIdentifier();
|
|
|
| - DCHECK(chrc_ids_to_objects_.find(characteristic->GetIdentifier()) ==
|
| - chrc_ids_to_objects_.end());
|
| + DCHECK(chrc_id_to_service_id_.find(characteristic->GetIdentifier()) ==
|
| + chrc_id_to_service_id_.end());
|
|
|
| - GattObjectData data;
|
| - data.device_address = service->GetDevice()->GetAddress();
|
| - data.service_id = service->GetIdentifier();
|
| - data.characteristic_id = characteristic->GetIdentifier();
|
| - chrc_ids_to_objects_[characteristic->GetIdentifier()] = data;
|
| + chrc_id_to_service_id_[characteristic->GetIdentifier()] =
|
| + service->GetIdentifier();
|
| }
|
|
|
| void BluetoothLowEnergyEventRouter::GattCharacteristicRemoved(
|
| @@ -438,14 +437,12 @@ void BluetoothLowEnergyEventRouter::GattCharacteristicRemoved(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| VLOG(2) << "GATT characteristic removed: " << characteristic->GetIdentifier();
|
|
|
| - DCHECK(chrc_ids_to_objects_.find(characteristic->GetIdentifier()) !=
|
| - chrc_ids_to_objects_.end());
|
| - DCHECK(service->GetDevice()->GetAddress() ==
|
| - chrc_ids_to_objects_[characteristic->GetIdentifier()].device_address);
|
| + DCHECK(chrc_id_to_service_id_.find(characteristic->GetIdentifier()) !=
|
| + chrc_id_to_service_id_.end());
|
| DCHECK(service->GetIdentifier() ==
|
| - chrc_ids_to_objects_[characteristic->GetIdentifier()].service_id);
|
| + chrc_id_to_service_id_[characteristic->GetIdentifier()]);
|
|
|
| - chrc_ids_to_objects_.erase(characteristic->GetIdentifier());
|
| + chrc_id_to_service_id_.erase(characteristic->GetIdentifier());
|
| }
|
|
|
| void BluetoothLowEnergyEventRouter::GattCharacteristicValueChanged(
|
| @@ -458,11 +455,6 @@ void BluetoothLowEnergyEventRouter::GattCharacteristicValueChanged(
|
| void BluetoothLowEnergyEventRouter::OnGetAdapter(
|
| const base::Closure& callback,
|
| scoped_refptr<device::BluetoothAdapter> adapter) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(service_ids_to_objects_.empty());
|
| - DCHECK(observed_devices_.empty());
|
| - DCHECK(observed_gatt_services_.empty());
|
| -
|
| adapter_ = adapter;
|
|
|
| // Initialize instance ID mappings for all discovered GATT objects and add
|
| @@ -474,6 +466,12 @@ void BluetoothLowEnergyEventRouter::OnGetAdapter(
|
| }
|
|
|
| void BluetoothLowEnergyEventRouter::InitializeIdentifierMappings() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(service_id_to_device_address_.empty());
|
| + DCHECK(chrc_id_to_service_id_.empty());
|
| + DCHECK(observed_devices_.empty());
|
| + DCHECK(observed_gatt_services_.empty());
|
| +
|
| // Devices
|
| BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
|
| for (BluetoothAdapter::DeviceList::iterator iter = devices.begin();
|
| @@ -490,12 +488,10 @@ void BluetoothLowEnergyEventRouter::InitializeIdentifierMappings() {
|
| ++siter) {
|
| BluetoothGattService* service = *siter;
|
| service->AddObserver(this);
|
| - observed_gatt_services_.insert(service->GetIdentifier());
|
|
|
| - GattObjectData service_data;
|
| - service_data.device_address = device->GetAddress();
|
| - service_data.service_id = service->GetIdentifier();
|
| - service_ids_to_objects_[service_data.service_id] = service_data;
|
| + const std::string& service_id = service->GetIdentifier();
|
| + observed_gatt_services_.insert(service_id);
|
| + service_id_to_device_address_[service_id] = device->GetAddress();
|
|
|
| // Characteristics
|
| std::vector<BluetoothGattCharacteristic*> characteristics =
|
| @@ -505,12 +501,9 @@ void BluetoothLowEnergyEventRouter::InitializeIdentifierMappings() {
|
| citer != characteristics.end();
|
| ++citer) {
|
| BluetoothGattCharacteristic* characteristic = *citer;
|
| - GattObjectData characteristic_data;
|
| - characteristic_data.device_address = device->GetAddress();
|
| - characteristic_data.service_id = service->GetIdentifier();
|
| - characteristic_data.characteristic_id = characteristic->GetIdentifier();
|
| - chrc_ids_to_objects_[characteristic_data.characteristic_id] =
|
| - characteristic_data;
|
| +
|
| + const std::string& chrc_id = characteristic->GetIdentifier();
|
| + chrc_id_to_service_id_[chrc_id] = service_id;
|
|
|
| // TODO(armansito): Initialize mapping for descriptors.
|
| }
|
| @@ -520,33 +513,57 @@ void BluetoothLowEnergyEventRouter::InitializeIdentifierMappings() {
|
|
|
| BluetoothGattService* BluetoothLowEnergyEventRouter::FindServiceById(
|
| const std::string& instance_id) const {
|
| - InstanceIdToObjectDataMap::const_iterator iter =
|
| - service_ids_to_objects_.find(instance_id);
|
| - if (iter == service_ids_to_objects_.end()) {
|
| + InstanceIdMap::const_iterator iter =
|
| + service_id_to_device_address_.find(instance_id);
|
| + if (iter == service_id_to_device_address_.end()) {
|
| VLOG(1) << "GATT service identifier unknown: " << instance_id;
|
| return NULL;
|
| }
|
|
|
| - GattObjectData data = iter->second;
|
| - DCHECK(!data.device_address.empty());
|
| - DCHECK(!data.service_id.empty());
|
| - DCHECK(data.characteristic_id.empty());
|
| - DCHECK(data.descriptor_id.empty());
|
| + const std::string& address = iter->second;
|
|
|
| - BluetoothDevice* device = adapter_->GetDevice(data.device_address);
|
| + BluetoothDevice* device = adapter_->GetDevice(address);
|
| if (!device) {
|
| - VLOG(1) << "Bluetooth device not found: " << data.device_address;
|
| + VLOG(1) << "Bluetooth device not found: " << address;
|
| return NULL;
|
| }
|
|
|
| - BluetoothGattService* service = device->GetGattService(data.service_id);
|
| + BluetoothGattService* service = device->GetGattService(instance_id);
|
| if (!service) {
|
| - VLOG(1) << "GATT service with ID \"" << data.service_id
|
| - << "\" not found on device \"" << data.device_address << "\"";
|
| + VLOG(1) << "GATT service with ID \"" << instance_id
|
| + << "\" not found on device \"" << address << "\"";
|
| return NULL;
|
| }
|
|
|
| return service;
|
| }
|
|
|
| +BluetoothGattCharacteristic*
|
| +BluetoothLowEnergyEventRouter::FindCharacteristicById(
|
| + const std::string& instance_id) const {
|
| + InstanceIdMap::const_iterator iter = chrc_id_to_service_id_.find(instance_id);
|
| + if (iter == chrc_id_to_service_id_.end()) {
|
| + VLOG(1) << "GATT characteristic identifier unknown: " << instance_id;
|
| + return NULL;
|
| + }
|
| +
|
| + const std::string& service_id = iter->second;
|
| +
|
| + BluetoothGattService* service = FindServiceById(service_id);
|
| + if (!service) {
|
| + VLOG(1) << "Failed to obtain service for characteristic: " << instance_id;
|
| + return NULL;
|
| + }
|
| +
|
| + BluetoothGattCharacteristic* characteristic =
|
| + service->GetCharacteristic(instance_id);
|
| + if (!characteristic) {
|
| + VLOG(1) << "GATT characteristic with ID \"" << instance_id
|
| + << "\" not found on service \"" << service_id << "\"";
|
| + return NULL;
|
| + }
|
| +
|
| + return characteristic;
|
| +}
|
| +
|
| } // namespace extensions
|
|
|