• Home
  • Raw
  • Download

Lines Matching refs:device

174       auto device =  in Connect()  local
176 if (device == devices_.end()) { in Connect()
181 device->is_connecting_actively = true; in Connect()
182 if (!device->IsConnected()) { in Connect()
204 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(addr)); in Connect() local
205 if (device == devices_.end()) { in Connect()
210 device->is_connecting_actively = true; in Connect()
211 if (!device->IsConnected()) { in Connect()
224 auto device = in AddFromStorage() local
226 if (device == devices_.end()) { in AddFromStorage()
239 auto device = in Disconnect() local
241 if (device == devices_.end()) { in Disconnect()
246 auto conn_id = device->conn_id; in Disconnect()
247 auto is_connecting_actively = device->is_connecting_actively; in Disconnect()
249 DoDisconnectCleanUp(*device); in Disconnect()
250 devices_.erase(device); in Disconnect()
283 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(addr)); in Disconnect() local
284 if (device == devices_.end()) { in Disconnect()
289 auto conn_id = device->conn_id; in Disconnect()
290 auto is_connecting_actively = device->is_connecting_actively; in Disconnect()
291 DoDisconnectCleanUp(*device); in Disconnect()
292 devices_.erase(device); in Disconnect()
310 void UpdateJournalOpEntryStatus(HasDevice& device, HasGattOpContext context, in UpdateJournalOpEntryStatus() argument
314 device.has_journal_.begin(), device.has_journal_.end(), [&context](auto const& record) { in UpdateJournalOpEntryStatus()
321 if (journal_entry == device.has_journal_.end()) { in UpdateJournalOpEntryStatus()
328 if (journal_entry == device.has_journal_.end()) { in UpdateJournalOpEntryStatus()
354 auto device = GetDevice(conn_id); in OnHasActivePresetCycleStatus() local
355 if (!device) { in OnHasActivePresetCycleStatus()
363 UpdateJournalOpEntryStatus(*device, context, status); in OnHasActivePresetCycleStatus()
382 log::info("Database out of sync for {}", device->addr); in OnHasActivePresetCycleStatus()
383 ClearDeviceInformationAndStartSearch(device); in OnHasActivePresetCycleStatus()
388 auto device = GetDevice(conn_id); in OnHasPresetNameSetStatus() local
389 if (!device) { in OnHasPresetNameSetStatus()
398 UpdateJournalOpEntryStatus(*device, context, status); in OnHasPresetNameSetStatus()
414 callbacks_->OnSetPresetNameError(device->addr, op.index, GattStatus2SvcErrorCode(status)); in OnHasPresetNameSetStatus()
416 log::info("Database out of sync for {}", device->addr); in OnHasPresetNameSetStatus()
417 ClearDeviceInformationAndStartSearch(device); in OnHasPresetNameSetStatus()
422 auto device = GetDevice(conn_id); in OnHasPresetNameGetStatus() local
423 if (!device) { in OnHasPresetNameGetStatus()
432 UpdateJournalOpEntryStatus(*device, context, status); in OnHasPresetNameGetStatus()
445 callbacks_->OnPresetInfoError(device->addr, op.index, GattStatus2SvcErrorCode(status)); in OnHasPresetNameGetStatus()
448 log::info("Database out of sync for {}", device->addr); in OnHasPresetNameGetStatus()
449 ClearDeviceInformationAndStartSearch(device); in OnHasPresetNameGetStatus()
451 log::error("Devices {}: Control point not usable. Disconnecting!", device->addr); in OnHasPresetNameGetStatus()
459 auto device = GetDevice(conn_id); in OnHasPresetIndexOperation() local
460 if (!device) { in OnHasPresetIndexOperation()
469 UpdateJournalOpEntryStatus(*device, context, status); in OnHasPresetIndexOperation()
487 callbacks_->OnPresetInfoError(device->addr, op.index, GattStatus2SvcErrorCode(status)); in OnHasPresetIndexOperation()
494 log::info("Database out of sync for {}", device->addr); in OnHasPresetIndexOperation()
495 ClearDeviceInformationAndStartSearch(device); in OnHasPresetIndexOperation()
497 log::error("Devices {}: Control point not usable. Disconnecting!", device->addr); in OnHasPresetIndexOperation()
512 auto device = in CpReadAllPresetsOperation() local
515 if (device == devices_.end()) { in CpReadAllPresetsOperation()
518 callbacks_->OnPresetInfoError(device->addr, operation.index, in CpReadAllPresetsOperation()
523 if (!device->SupportsPresets()) { in CpReadAllPresetsOperation()
524 callbacks_->OnPresetInfoError(device->addr, operation.index, in CpReadAllPresetsOperation()
531 device->has_journal_.Append(HasJournalRecord(operation, context)); in CpReadAllPresetsOperation()
536 device->conn_id, device->cp_handle, operation.ToCharacteristicValue(), GATT_WRITE, in CpReadAllPresetsOperation()
562 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(addr)); in isPresetAvailable() local
563 if (device == devices_.end()) { in isPresetAvailable()
567 isBinaural = !(device->GetFeatures() & 0x03); in isPresetAvailable()
568 isIndependedPreset = device->GetFeatures() & bluetooth::has::kFeatureBitIndependentPresets; in isPresetAvailable()
570 for (auto const& preset : device->has_presets) { in isPresetAvailable()
588 auto device = in isPresetAvailable() local
591 if (device == devices_.end()) { in isPresetAvailable()
594 auto preset_info = device->GetPresetInfo(operation.index); in isPresetAvailable()
596 log::info("Preset info index {} not found on device {}", operation.index, device->addr); in isPresetAvailable()
603 ErrorCode CpPresetIndexOperationWriteReq(HasDevice& device, HasCtpOp& operation) { in CpPresetIndexOperationWriteReq() argument
606 if (!device.IsConnected()) { in CpPresetIndexOperationWriteReq()
610 if (!device.SupportsPresets()) { in CpPresetIndexOperationWriteReq()
614 if (!device.SupportsOperation(operation.opcode)) { in CpPresetIndexOperationWriteReq()
619 if (!device.IsValidPreset(operation.index)) { in CpPresetIndexOperationWriteReq()
631 device.has_journal_.Append(HasJournalRecord(operation, context)); in CpPresetIndexOperationWriteReq()
636 device.conn_id, device.cp_handle, operation.ToCharacteristicValue(), GATT_WRITE, in CpPresetIndexOperationWriteReq()
650 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(addr)); in AreAllDevicesAvailable() local
651 if (device == devices_.end() || !device->IsConnected()) { in AreAllDevicesAvailable()
660 std::function<ErrorCode(HasDevice& device, HasCtpOp& operation)> write_cb) { in CpPresetOperationCaller() argument
693 auto device = in CpPresetOperationCaller() local
695 if (device != devices_.end()) { in CpPresetOperationCaller()
696 status = write_cb(*device, operation); in CpPresetOperationCaller()
711 auto device = in CpPresetOperationCaller() local
713 if (device != devices_.end()) { in CpPresetOperationCaller()
714 status = write_cb(*device, operation); in CpPresetOperationCaller()
730 auto device = in CpPresetOperationCaller() local
734 if (device != devices_.end()) { in CpPresetOperationCaller()
735 status = write_cb(*device, operation); in CpPresetOperationCaller()
746 operation, [](HasDevice& device, HasCtpOp operation) -> ErrorCode { in CpPresetIndexOperation() argument
748 return instance->CpPresetIndexOperationWriteReq(device, operation); in CpPresetIndexOperation()
772 ErrorCode CpPresetsCycleOperationWriteReq(HasDevice& device, HasCtpOp& operation) { in CpPresetsCycleOperationWriteReq() argument
773 log::debug("addr: {} operation: {}", device.addr, operation); in CpPresetsCycleOperationWriteReq()
775 if (!device.IsConnected()) { in CpPresetsCycleOperationWriteReq()
779 if (!device.SupportsPresets()) { in CpPresetsCycleOperationWriteReq()
783 if (!device.SupportsOperation(operation.opcode)) { in CpPresetsCycleOperationWriteReq()
791 device.has_journal_.Append(HasJournalRecord(operation, context)); in CpPresetsCycleOperationWriteReq()
796 device.conn_id, device.cp_handle, operation.ToCharacteristicValue(), GATT_WRITE, in CpPresetsCycleOperationWriteReq()
811 operation, [](HasDevice& device, HasCtpOp operation) -> ErrorCode { in CpPresetsCycleOperation() argument
813 return instance->CpPresetsCycleOperationWriteReq(device, operation); in CpPresetsCycleOperation()
823 ErrorCode CpWritePresetNameOperationWriteReq(HasDevice& device, HasCtpOp operation) { in CpWritePresetNameOperationWriteReq() argument
824 log::debug("addr: {} operation: {}", device.addr, operation); in CpWritePresetNameOperationWriteReq()
826 if (!device.IsConnected()) { in CpWritePresetNameOperationWriteReq()
830 if (!device.SupportsPresets()) { in CpWritePresetNameOperationWriteReq()
834 if (!device.IsValidPreset(operation.index, true)) { in CpWritePresetNameOperationWriteReq()
835 return device.IsValidPreset(operation.index) ? ErrorCode::SET_NAME_NOT_ALLOWED in CpWritePresetNameOperationWriteReq()
839 if (!device.SupportsOperation(operation.opcode)) { in CpWritePresetNameOperationWriteReq()
851 device.has_journal_.Append(HasJournalRecord(operation, context)); in CpWritePresetNameOperationWriteReq()
856 device.conn_id, device.cp_handle, operation.ToCharacteristicValue(), GATT_WRITE, in CpWritePresetNameOperationWriteReq()
896 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(addr)); in CpWritePresetNameOperation() local
897 if (device != devices_.end()) { in CpWritePresetNameOperation()
898 status = CpWritePresetNameOperationWriteReq(*device, operation); in CpWritePresetNameOperation()
936 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(addr)); in shouldRequestSyncedOp() local
937 if (device != devices_.end()) { in shouldRequestSyncedOp()
938 if (device->SupportsOperation(opcode)) { in shouldRequestSyncedOp()
979 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(address)); in GetPresetInfo() local
980 if (device == devices_.end()) { in GetPresetInfo()
992 auto* preset = device->GetPreset(preset_index); in GetPresetInfo()
1019 for (auto& device : devices_) { in CleanUp() local
1020 if (device.conn_id != GATT_INVALID_CONN_ID) { in CleanUp()
1021 BTA_GATTC_Close(device.conn_id); in CleanUp()
1023 DoDisconnectCleanUp(device); in CleanUp()
1035 for (const auto& device : devices_) { in Dump() local
1037 device.Dump(stream); in Dump()
1058 void WriteAllNeededCcc(const HasDevice& device) { in WriteAllNeededCcc() argument
1059 if (device.conn_id == GATT_INVALID_CONN_ID) { in WriteAllNeededCcc()
1060 log::error("Device {} is not connected", device.addr); in WriteAllNeededCcc()
1066 if (device.SupportsFeaturesNotification()) { in WriteAllNeededCcc()
1067 SubscribeForNotifications(device.conn_id, device.addr, device.features_handle, in WriteAllNeededCcc()
1068 device.features_ccc_handle); in WriteAllNeededCcc()
1071 if (device.SupportsPresets()) { in WriteAllNeededCcc()
1072 SubscribeForNotifications(device.conn_id, device.addr, device.cp_handle, device.cp_ccc_handle, in WriteAllNeededCcc()
1073 device.cp_ccc_val); in WriteAllNeededCcc()
1074 SubscribeForNotifications(device.conn_id, device.addr, device.active_preset_handle, in WriteAllNeededCcc()
1075 device.active_preset_ccc_handle); in WriteAllNeededCcc()
1079 CpReadAllPresetsOperation(HasCtpOp(device.addr, PresetCtpOpcode::READ_PRESETS, in WriteAllNeededCcc()
1085 void OnEncrypted(HasDevice& device) { in OnEncrypted() argument
1086 log::debug("{}", device.addr); in OnEncrypted()
1088 if (device.isGattServiceValid()) { in OnEncrypted()
1089 device.is_connecting_actively = false; in OnEncrypted()
1090 NotifyHasDeviceValid(device); in OnEncrypted()
1091 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::ALL_PRESET_INFO, in OnEncrypted()
1092 device.GetAllPresetInfo()); in OnEncrypted()
1093 callbacks_->OnActivePresetSelected(device.addr, device.currently_active_preset); in OnEncrypted()
1094 WriteAllNeededCcc(device); in OnEncrypted()
1096 BTA_GATTC_ServiceSearchRequest(device.conn_id, kUuidHearingAccessService); in OnEncrypted()
1100 void NotifyHasDeviceValid(const HasDevice& device) { in NotifyHasDeviceValid() argument
1101 log::debug("addr:{}", device.addr); in NotifyHasDeviceValid()
1104 preset_indices.reserve(device.has_presets.size()); in NotifyHasDeviceValid()
1105 for (auto const& preset : device.has_presets) { in NotifyHasDeviceValid()
1110 callbacks_->OnConnectionState(ConnectionState::CONNECTED, device.addr); in NotifyHasDeviceValid()
1113 void MarkDeviceValidIfInInitialDiscovery(HasDevice& device) { in MarkDeviceValidIfInInitialDiscovery() argument
1114 if (device.isGattServiceValid()) { in MarkDeviceValidIfInInitialDiscovery()
1118 --device.gatt_svc_validation_steps; in MarkDeviceValidIfInInitialDiscovery()
1120 if (device.isGattServiceValid()) { in MarkDeviceValidIfInInitialDiscovery()
1121 device.is_connecting_actively = false; in MarkDeviceValidIfInInitialDiscovery()
1124 if (device.SerializePresets(presets_bin)) { in MarkDeviceValidIfInInitialDiscovery()
1125 btif_storage_add_leaudio_has_device(device.addr, presets_bin, device.GetFeatures(), in MarkDeviceValidIfInInitialDiscovery()
1126 device.currently_active_preset); in MarkDeviceValidIfInInitialDiscovery()
1128 NotifyHasDeviceValid(device); in MarkDeviceValidIfInInitialDiscovery()
1135 auto device = GetDevice(conn_id); in OnGattWriteCcc() local
1136 if (!device) { in OnGattWriteCcc()
1143 log::info("Database out of sync for {}", device->addr); in OnGattWriteCcc()
1144 ClearDeviceInformationAndStartSearch(device); in OnGattWriteCcc()
1151 if (handle == device->features_ccc_handle) { in OnGattWriteCcc()
1153 device->features_notifications_enabled = enabling_ntf; in OnGattWriteCcc()
1156 } else if ((handle == device->active_preset_ccc_handle) || (handle == device->cp_ccc_handle)) { in OnGattWriteCcc()
1167 auto device = GetDevice(conn_id); in OnHasNotification() local
1168 if (!device) { in OnHasNotification()
1173 if (handle == device->features_handle) { in OnHasNotification()
1174 OnHasFeaturesValue(&(*device), GATT_SUCCESS, handle, len, value); in OnHasNotification()
1176 } else if (handle == device->cp_handle) { in OnHasNotification()
1177 OnHasCtpValueNotification(&(*device), len, value); in OnHasNotification()
1179 } else if (handle == device->active_preset_handle) { in OnHasNotification()
1180 OnHasActivePresetValue(&(*device), GATT_SUCCESS, handle, len, value); in OnHasNotification()
1186 HasDevice* device = nullptr; in GetDevice() local
1189 device = std::get<HasDevice*>(conn_id_device_variant); in GetDevice()
1194 device = &(*it); in GetDevice()
1198 return device; in GetDevice()
1206 auto device = GetDevice(conn_id_device_variant); in OnHasFeaturesValue() local
1207 if (!device) { in OnHasFeaturesValue()
1212 tCONN_ID conn_id = device->conn_id; in OnHasFeaturesValue()
1216 log::info("Database out of sync for {}", device->addr); in OnHasFeaturesValue()
1217 ClearDeviceInformationAndStartSearch(device); in OnHasFeaturesValue()
1234 device->UpdateFeatures(features); in OnHasFeaturesValue()
1236 if (device->isGattServiceValid()) { in OnHasFeaturesValue()
1237 btif_storage_set_leaudio_has_features(device->addr, features); in OnHasFeaturesValue()
1241 device->has_journal_.Append(HasJournalRecord(features, true)); in OnHasFeaturesValue()
1246 if (!device->isGattServiceValid()) { in OnHasFeaturesValue()
1247 callbacks_->OnDeviceAvailable(device->addr, device->GetFeatures()); in OnHasFeaturesValue()
1251 callbacks_->OnFeaturesUpdate(device->addr, device->GetFeatures()); in OnHasFeaturesValue()
1253 MarkDeviceValidIfInInitialDiscovery(*device); in OnHasFeaturesValue()
1283 void OnHasPresetReadResponseNotification(HasDevice& device) { in OnHasPresetReadResponseNotification() argument
1286 while (device.ctp_notifications_.size() != 0) { in OnHasPresetReadResponseNotification()
1287 auto ntf = device.ctp_notifications_.front(); in OnHasPresetReadResponseNotification()
1295 device.has_presets.erase(ntf.preset->GetIndex()); in OnHasPresetReadResponseNotification()
1296 device.has_presets.insert(ntf.preset.value()); in OnHasPresetReadResponseNotification()
1302 if (device.isGattServiceValid()) { in OnHasPresetReadResponseNotification()
1303 auto info = device.GetPresetInfo(ntf.preset.value().GetIndex()); in OnHasPresetReadResponseNotification()
1305 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::PRESET_INFO_REQUEST_RESPONSE, in OnHasPresetReadResponseNotification()
1311 device.has_journal_.Append(HasJournalRecord(ntf)); in OnHasPresetReadResponseNotification()
1312 device.ctp_notifications_.pop_front(); in OnHasPresetReadResponseNotification()
1315 auto in_svc_validation = !device.isGattServiceValid(); in OnHasPresetReadResponseNotification()
1316 MarkDeviceValidIfInInitialDiscovery(device); in OnHasPresetReadResponseNotification()
1322 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::ALL_PRESET_INFO, in OnHasPresetReadResponseNotification()
1323 device.GetAllPresetInfo()); in OnHasPresetReadResponseNotification()
1328 if (device.isGattServiceValid()) { in OnHasPresetReadResponseNotification()
1329 callbacks_->OnActivePresetSelected(device.addr, device.currently_active_preset); in OnHasPresetReadResponseNotification()
1334 void OnHasPresetGenericUpdate(HasDevice& device) { in OnHasPresetGenericUpdate() argument
1341 while (device.ctp_notifications_.size() != 0) { in OnHasPresetGenericUpdate()
1342 auto nt = device.ctp_notifications_.front(); in OnHasPresetGenericUpdate()
1354 auto it = device.has_presets.begin(); in OnHasPresetGenericUpdate()
1355 while (it != device.has_presets.end()) { in OnHasPresetGenericUpdate()
1357 auto info = device.GetPresetInfo(it->GetIndex()); in OnHasPresetGenericUpdate()
1362 it = device.has_presets.erase(it); in OnHasPresetGenericUpdate()
1369 auto info = device.GetPreset(nt.preset->GetIndex()); in OnHasPresetGenericUpdate()
1372 device.has_presets.erase(nt.preset->GetIndex()); in OnHasPresetGenericUpdate()
1373 device.has_presets.insert(*nt.preset); in OnHasPresetGenericUpdate()
1374 updated_infos.push_back(*device.GetPresetInfo(nt.preset->GetIndex())); in OnHasPresetGenericUpdate()
1377 device.has_presets.insert(*nt.preset); in OnHasPresetGenericUpdate()
1378 updated_infos.push_back(*device.GetPresetInfo(nt.preset->GetIndex())); in OnHasPresetGenericUpdate()
1383 device.has_journal_.Append(HasJournalRecord(nt)); in OnHasPresetGenericUpdate()
1384 device.ctp_notifications_.pop_front(); in OnHasPresetGenericUpdate()
1387 if (device.isGattServiceValid()) { in OnHasPresetGenericUpdate()
1390 if (device.SerializePresets(presets_bin)) { in OnHasPresetGenericUpdate()
1391 btif_storage_set_leaudio_has_presets(device.addr, presets_bin); in OnHasPresetGenericUpdate()
1415 if (group_op_coordinator.SetCompleted(device.addr)) { in OnHasPresetGenericUpdate()
1440 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::PRESET_INFO_UPDATE, updated_infos); in OnHasPresetGenericUpdate()
1444 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::PRESET_DELETED, deleted_infos); in OnHasPresetGenericUpdate()
1449 void OnHasPresetAvailabilityChanged(HasDevice& device) { in OnHasPresetAvailabilityChanged() argument
1454 while (device.ctp_notifications_.size() != 0) { in OnHasPresetAvailabilityChanged()
1455 auto nt = device.ctp_notifications_.front(); in OnHasPresetAvailabilityChanged()
1462 if (!device.has_presets.contains(nt.index)) { in OnHasPresetAvailabilityChanged()
1464 device.has_journal_.Append(HasJournalRecord(nt)); in OnHasPresetAvailabilityChanged()
1465 device.ctp_notifications_.pop_front(); in OnHasPresetAvailabilityChanged()
1468 auto preset = device.has_presets.extract(nt.index).value(); in OnHasPresetAvailabilityChanged()
1483 device.has_presets.insert(HasPreset(preset.GetIndex(), new_props, preset.GetName())); in OnHasPresetAvailabilityChanged()
1485 auto info = device.GetPresetInfo(nt.index); in OnHasPresetAvailabilityChanged()
1491 device.has_journal_.Append(HasJournalRecord(nt)); in OnHasPresetAvailabilityChanged()
1492 device.ctp_notifications_.pop_front(); in OnHasPresetAvailabilityChanged()
1496 if (device.isGattServiceValid()) { in OnHasPresetAvailabilityChanged()
1498 if (device.SerializePresets(presets_bin)) { in OnHasPresetAvailabilityChanged()
1499 btif_storage_set_leaudio_has_presets(device.addr, presets_bin); in OnHasPresetAvailabilityChanged()
1503 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::PRESET_AVAILABILITY_CHANGED, infos); in OnHasPresetAvailabilityChanged()
1506 void OnHasPresetDeleted(HasDevice& device) { in OnHasPresetDeleted() argument
1512 while (device.ctp_notifications_.size() != 0) { in OnHasPresetDeleted()
1513 auto nt = device.ctp_notifications_.front(); in OnHasPresetDeleted()
1525 auto info = device.GetPresetInfo(nt.index); in OnHasPresetDeleted()
1530 if (device.has_presets.count(nt.index)) { in OnHasPresetDeleted()
1532 device.has_presets.erase(nt.index); in OnHasPresetDeleted()
1536 device.has_journal_.Append(HasJournalRecord(nt)); in OnHasPresetDeleted()
1537 device.ctp_notifications_.pop_front(); in OnHasPresetDeleted()
1541 if (device.isGattServiceValid()) { in OnHasPresetDeleted()
1543 if (device.SerializePresets(presets_bin)) { in OnHasPresetDeleted()
1544 btif_storage_set_leaudio_has_presets(device.addr, presets_bin); in OnHasPresetDeleted()
1549 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::PRESET_DELETED, infos); in OnHasPresetDeleted()
1553 void ProcessCtpNotificationQueue(HasDevice& device) { in ProcessCtpNotificationQueue() argument
1556 while (device.ctp_notifications_.size() != 0) { in ProcessCtpNotificationQueue()
1557 auto ntf = device.ctp_notifications_.front(); in ProcessCtpNotificationQueue()
1563 OnHasPresetGenericUpdate(device); in ProcessCtpNotificationQueue()
1566 OnHasPresetAvailabilityChanged(device); in ProcessCtpNotificationQueue()
1569 OnHasPresetAvailabilityChanged(device); in ProcessCtpNotificationQueue()
1572 OnHasPresetDeleted(device); in ProcessCtpNotificationQueue()
1580 OnHasPresetReadResponseNotification(device); in ProcessCtpNotificationQueue()
1588 void OnHasCtpValueNotification(HasDevice* device, uint16_t len, const uint8_t* value) { in OnHasCtpValueNotification() argument
1590 tCONN_ID conn_id = device->conn_id; in OnHasCtpValueNotification()
1593 log::error("Unhandled notification for device: {}", *device); in OnHasCtpValueNotification()
1601 device->ctp_notifications_.push_back(ntf); in OnHasCtpValueNotification()
1603 ProcessCtpNotificationQueue(*device); in OnHasCtpValueNotification()
1612 auto device = GetDevice(conn_id_device_variant); in OnHasActivePresetValue() local
1613 if (!device) { in OnHasActivePresetValue()
1618 tCONN_ID conn_id = device->conn_id; in OnHasActivePresetValue()
1622 log::info("Database out of sync for {}", device->addr); in OnHasActivePresetValue()
1623 ClearDeviceInformationAndStartSearch(device); in OnHasActivePresetValue()
1641 if (active_preset_index != 0 && device->isGattServiceValid() && in OnHasActivePresetValue()
1642 !device->has_presets.contains(active_preset_index)) { in OnHasActivePresetValue()
1644 device->has_journal_.Append(HasJournalRecord(active_preset_index, false)); in OnHasActivePresetValue()
1647 device->currently_active_preset = active_preset_index; in OnHasActivePresetValue()
1649 if (device->isGattServiceValid()) { in OnHasActivePresetValue()
1650 btif_storage_set_leaudio_has_active_preset(device->addr, device->currently_active_preset); in OnHasActivePresetValue()
1654 device->has_journal_.Append(HasJournalRecord(device->currently_active_preset, false)); in OnHasActivePresetValue()
1657 MarkDeviceValidIfInInitialDiscovery(*device); in OnHasActivePresetValue()
1659 if (device->isGattServiceValid()) { in OnHasActivePresetValue()
1661 callbacks_->OnActivePresetSelected(device->addr, device->currently_active_preset); in OnHasActivePresetValue()
1680 if (group_op_coordinator.SetCompleted(device->addr)) { in OnHasActivePresetValue()
1691 device->currently_active_preset); in OnHasActivePresetValue()
1702 void DeregisterNotifications(HasDevice& device) { in DeregisterNotifications() argument
1704 if (device.features_ccc_handle != GAP_INVALID_HANDLE) { in DeregisterNotifications()
1705 BTA_GATTC_DeregisterForNotifications(gatt_if_, device.addr, device.features_handle); in DeregisterNotifications()
1709 if (device.active_preset_ccc_handle != GAP_INVALID_HANDLE) { in DeregisterNotifications()
1710 BTA_GATTC_DeregisterForNotifications(gatt_if_, device.addr, device.active_preset_handle); in DeregisterNotifications()
1714 if (device.cp_ccc_handle != GAP_INVALID_HANDLE) { in DeregisterNotifications()
1715 BTA_GATTC_DeregisterForNotifications(gatt_if_, device.addr, device.cp_handle); in DeregisterNotifications()
1720 void DoDisconnectCleanUp(HasDevice& device, bool invalidate_gatt_service = true) { in DoDisconnectCleanUp() argument
1721 log::debug(": device={}", device.addr); in DoDisconnectCleanUp()
1723 DeregisterNotifications(device); in DoDisconnectCleanUp()
1725 if (device.conn_id != GATT_INVALID_CONN_ID) { in DoDisconnectCleanUp()
1726 BtaGattQueue::Clean(device.conn_id); in DoDisconnectCleanUp()
1728 device.gatt_svc_validation_steps = 0xFE; in DoDisconnectCleanUp()
1733 auto addr = device.addr; in DoDisconnectCleanUp()
1744 device.ConnectionCleanUp(); in DoDisconnectCleanUp()
1758 bool CacheAttributeHandles(const gatt::Service& service, HasDevice* device) { in CacheAttributeHandles() argument
1759 log::debug("device={}", device->addr); in CacheAttributeHandles()
1764 uint16_t ccc_handle = FindCccHandle(device->conn_id, charac.value_handle); in CacheAttributeHandles()
1769 device->active_preset_ccc_handle = ccc_handle; in CacheAttributeHandles()
1770 device->active_preset_handle = charac.value_handle; in CacheAttributeHandles()
1774 uint16_t ccc_handle = FindCccHandle(device->conn_id, charac.value_handle); in CacheAttributeHandles()
1793 device->cp_ccc_handle = ccc_handle; in CacheAttributeHandles()
1794 device->cp_handle = charac.value_handle; in CacheAttributeHandles()
1795 device->cp_ccc_val = ccc_val; in CacheAttributeHandles()
1798 uint16_t ccc_handle = FindCccHandle(device->conn_id, charac.value_handle); in CacheAttributeHandles()
1799 device->features_ccc_handle = ccc_handle; in CacheAttributeHandles()
1800 device->features_handle = charac.value_handle; in CacheAttributeHandles()
1806 bool LoadHasDetailsFromStorage(HasDevice* device) { in LoadHasDetailsFromStorage() argument
1807 log::debug("device={}", device->addr); in LoadHasDetailsFromStorage()
1812 if (!btif_storage_get_leaudio_has_presets(device->addr, presets_bin, active_preset)) { in LoadHasDetailsFromStorage()
1816 if (!HasDevice::DeserializePresets(presets_bin.data(), presets_bin.size(), *device)) { in LoadHasDetailsFromStorage()
1822 device->currently_active_preset = active_preset; in LoadHasDetailsFromStorage()
1826 if (btif_storage_get_leaudio_has_features(device->addr, val)) { in LoadHasDetailsFromStorage()
1827 device->UpdateFeatures(val); in LoadHasDetailsFromStorage()
1831 device->gatt_svc_validation_steps = 0; in LoadHasDetailsFromStorage()
1832 device->is_connecting_actively = false; in LoadHasDetailsFromStorage()
1834 NotifyHasDeviceValid(*device); in LoadHasDetailsFromStorage()
1835 callbacks_->OnPresetInfo(device->addr, PresetInfoReason::ALL_PRESET_INFO, in LoadHasDetailsFromStorage()
1836 device->GetAllPresetInfo()); in LoadHasDetailsFromStorage()
1837 callbacks_->OnActivePresetSelected(device->addr, device->currently_active_preset); in LoadHasDetailsFromStorage()
1838 if (device->conn_id == GATT_INVALID_CONN_ID) { in LoadHasDetailsFromStorage()
1844 WriteAllNeededCcc(*device); in LoadHasDetailsFromStorage()
1850 HasDevice* device) { in StartInitialHasDetailsReadAndValidation() argument
1852 if (device->features_handle == GAP_INVALID_HANDLE) { in StartInitialHasDetailsReadAndValidation()
1858 if (device->cp_handle != GAP_INVALID_HANDLE) { in StartInitialHasDetailsReadAndValidation()
1859 if (device->active_preset_handle == GAP_INVALID_HANDLE) { in StartInitialHasDetailsReadAndValidation()
1862 if (device->active_preset_ccc_handle == GAP_INVALID_HANDLE) { in StartInitialHasDetailsReadAndValidation()
1868 device->gatt_svc_validation_steps = 1 + (device->SupportsPresets() ? 2 : 0); in StartInitialHasDetailsReadAndValidation()
1872 device->conn_id, device->features_handle, in StartInitialHasDetailsReadAndValidation()
1882 if (device->SupportsFeaturesNotification()) { in StartInitialHasDetailsReadAndValidation()
1883 SubscribeForNotifications(device->conn_id, device->addr, device->features_handle, in StartInitialHasDetailsReadAndValidation()
1884 device->features_ccc_handle); in StartInitialHasDetailsReadAndValidation()
1892 if (device->SupportsPresets()) { in StartInitialHasDetailsReadAndValidation()
1894 SubscribeForNotifications(device->conn_id, device->addr, device->active_preset_handle, in StartInitialHasDetailsReadAndValidation()
1895 device->active_preset_ccc_handle); in StartInitialHasDetailsReadAndValidation()
1897 SubscribeForNotifications(device->conn_id, device->addr, device->cp_handle, in StartInitialHasDetailsReadAndValidation()
1898 device->cp_ccc_handle, device->cp_ccc_val); in StartInitialHasDetailsReadAndValidation()
1901 CpReadAllPresetsOperation(HasCtpOp(device->addr, PresetCtpOpcode::READ_PRESETS, in StartInitialHasDetailsReadAndValidation()
1907 device->conn_id, device->active_preset_handle, in StartInitialHasDetailsReadAndValidation()
1925 auto* device = static_cast<HasDevice*>(context); in OnHasServiceFound() local
1928 if (!CacheAttributeHandles(service, device)) { in OnHasServiceFound()
1933 if (LoadHasDetailsFromStorage(device)) { in OnHasServiceFound()
1938 return StartInitialHasDetailsReadAndValidation(service, device); in OnHasServiceFound()
1994 auto device = in OnGattConnected() local
1996 if (device == devices_.end()) { in OnGattConnected()
2003 if (!device->is_connecting_actively) { in OnGattConnected()
2009 devices_.erase(device); in OnGattConnected()
2014 device->conn_id = evt.conn_id; in OnGattConnected()
2018 if (BTM_SecIsLeSecurityPending(device->addr)) { in OnGattConnected()
2026 if (BTM_IsEncrypted(device->addr, BT_TRANSPORT_LE)) { in OnGattConnected()
2028 OnEncrypted(*device); in OnGattConnected()
2033 BTM_SetEncryption(device->addr, BT_TRANSPORT_LE, nullptr, nullptr, BTM_BLE_SEC_ENCRYPT); in OnGattConnected()
2035 log::info("Encryption required for {}. Request result: 0x{:02x}", device->addr, result); in OnGattConnected()
2038 log::error("Link key unknown for {}, disconnect profile", device->addr); in OnGattConnected()
2039 BTA_GATTC_Close(device->conn_id); in OnGattConnected()
2044 auto device = in OnGattDisconnected() local
2046 if (device == devices_.end()) { in OnGattDisconnected()
2050 log::debug("device={}: reason=0x{:x}", device->addr, static_cast<int>(evt.reason)); in OnGattDisconnected()
2053 if (device->is_connecting_actively || device->isGattServiceValid()) { in OnGattDisconnected()
2059 DoDisconnectCleanUp(*device, peer_disconnected ? false : true); in OnGattDisconnected()
2063 BTA_GATTC_Open(gatt_if_, device->addr, BTM_BLE_BKG_CONNECT_ALLOW_LIST, false); in OnGattDisconnected()
2068 auto device = GetDevice(evt.conn_id); in OnGattServiceSearchComplete() local
2069 if (!device) { in OnGattServiceSearchComplete()
2077 if (!BTM_IsEncrypted(device->addr, BT_TRANSPORT_LE)) { in OnGattServiceSearchComplete()
2085 if (!device->isGattServiceValid()) { in OnGattServiceSearchComplete()
2088 BTA_GATTC_Close(device->conn_id); in OnGattServiceSearchComplete()
2092 const std::list<gatt::Service>* all_services = BTA_GATTC_GetServices(device->conn_id); in OnGattServiceSearchComplete()
2099 BTA_GATTC_Close(device->conn_id); in OnGattServiceSearchComplete()
2104 if (!instance->OnHasServiceFound(*service, &(*device))) { in OnGattServiceSearchComplete()
2106 BTA_GATTC_Close(device->conn_id); in OnGattServiceSearchComplete()
2128 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(address)); in OnLeEncryptionComplete() local
2129 if (device == devices_.end()) { in OnLeEncryptionComplete()
2137 BTA_GATTC_Close(device->conn_id); in OnLeEncryptionComplete()
2141 if (device->isGattServiceValid()) { in OnLeEncryptionComplete()
2142 instance->OnEncrypted(*device); in OnLeEncryptionComplete()
2144 BTA_GATTC_ServiceSearchRequest(device->conn_id, kUuidHearingAccessService); in OnLeEncryptionComplete()
2148 void ClearDeviceInformationAndStartSearch(HasDevice* device) { in ClearDeviceInformationAndStartSearch() argument
2149 if (!device) { in ClearDeviceInformationAndStartSearch()
2154 log::info("{}", device->addr); in ClearDeviceInformationAndStartSearch()
2156 if (!device->isGattServiceValid()) { in ClearDeviceInformationAndStartSearch()
2162 DeregisterNotifications(*device); in ClearDeviceInformationAndStartSearch()
2163 BtaGattQueue::Clean(device->conn_id); in ClearDeviceInformationAndStartSearch()
2164 device->ClearSvcData(); in ClearDeviceInformationAndStartSearch()
2165 btif_storage_remove_leaudio_has(device->addr); in ClearDeviceInformationAndStartSearch()
2166 BTA_GATTC_ServiceSearchRequest(device->conn_id, kUuidHearingAccessService); in ClearDeviceInformationAndStartSearch()
2170 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(address)); in OnGattServiceChangeEvent() local
2171 if (device == devices_.end()) { in OnGattServiceChangeEvent()
2176 ClearDeviceInformationAndStartSearch(&(*device)); in OnGattServiceChangeEvent()
2180 auto device = std::find_if(devices_.begin(), devices_.end(), HasDevice::MatchAddress(address)); in OnGattServiceDiscoveryDoneEvent() local
2181 if (device == devices_.end()) { in OnGattServiceDiscoveryDoneEvent()
2188 if (!device->isGattServiceValid()) { in OnGattServiceDiscoveryDoneEvent()
2189 BTA_GATTC_ServiceSearchRequest(device->conn_id, kUuidHearingAccessService); in OnGattServiceDiscoveryDoneEvent()