Loading system/stack/sdp/sdp_api.cc +48 −18 Original line number Diff line number Diff line Loading @@ -22,13 +22,18 @@ * ******************************************************************************/ #ifndef LOG_TAG #define LOG_TAG "sdp_api" #endif #include "stack/include/sdp_api.h" #include <string.h> #include <cstdint> #include "bt_target.h" #include "osi/include/log.h" #include "osi/include/osi.h" // PTR_TO_UINT #include "stack/include/bt_types.h" #include "stack/sdp/sdpint.h" Loading Loading @@ -783,9 +788,17 @@ uint8_t SDP_GetNumDiRecords(const tSDP_DISCOVERY_DB* p_db) { * ******************************************************************************/ static void SDP_AttrStringCopy(char* dst, const tSDP_DISC_ATTR* p_attr, uint16_t dst_size) { if (dst == NULL) return; uint16_t dst_size, uint8_t expected_type) { if (dst == NULL) return; dst[0] = '\0'; if (p_attr) { uint8_t type = SDP_DISC_ATTR_TYPE(p_attr->attr_len_type); if (type == expected_type) { uint16_t len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); if (len > dst_size - 1) { len = dst_size - 1; Loading @@ -793,7 +806,11 @@ static void SDP_AttrStringCopy(char* dst, const tSDP_DISC_ATTR* p_attr, memcpy(dst, (const void*)p_attr->attr_value.v.array, len); dst[len] = '\0'; } else { dst[0] = '\0'; LOG_ERROR("unexpected attr type=%d, expected=%d", type, expected_type); } } else { LOG_ERROR("p_attr is NULL"); } } Loading Loading @@ -834,55 +851,68 @@ uint16_t SDP_GetDiRecord(uint8_t get_record_index, /* ClientExecutableURL is optional */ p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_CLIENT_EXE_URL); SDP_AttrStringCopy(p_device_info->rec.client_executable_url, p_curr_attr, SDP_MAX_ATTR_LEN); SDP_MAX_ATTR_LEN, URL_DESC_TYPE); /* Service Description is optional */ /* 5.1.16 ServiceDescription attribute */ p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_SERVICE_DESCRIPTION); SDP_AttrStringCopy(p_device_info->rec.service_description, p_curr_attr, SDP_MAX_ATTR_LEN); SDP_MAX_ATTR_LEN, TEXT_STR_DESC_TYPE); /* DocumentationURL is optional */ p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_DOCUMENTATION_URL); SDP_AttrStringCopy(p_device_info->rec.documentation_url, p_curr_attr, SDP_MAX_ATTR_LEN); SDP_MAX_ATTR_LEN, URL_DESC_TYPE); p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_SPECIFICATION_ID); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->spec_id = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_VENDOR_ID); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->rec.vendor = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_VENDOR_ID_SOURCE); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->rec.vendor_id_source = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_PRODUCT_ID); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->rec.product = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_PRODUCT_VERSION); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->rec.version = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_PRIMARY_RECORD); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == BOOLEAN_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 1) p_device_info->rec.primary_record = (bool)p_curr_attr->attr_value.v.u8; else result = SDP_ERR_ATTR_NOT_PRESENT; Loading system/stack/sdp/sdp_utils.cc +9 −3 Original line number Diff line number Diff line Loading @@ -231,7 +231,9 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, case UUID_SERVCLASS_AUDIO_SINK: { tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr == nullptr) { if (p_attr == nullptr || SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE || SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 2) { break; } uint16_t supported_features = p_attr->attr_value.v.u16; Loading @@ -244,7 +246,9 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, case UUID_SERVCLASS_MESSAGE_ACCESS: { tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES); if (p_attr == nullptr) { if (p_attr == nullptr || SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE || SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 4) { break; } uint32_t map_supported_features = p_attr->attr_value.v.u32; Loading @@ -257,7 +261,9 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, case UUID_SERVCLASS_PBAP_PSE: { tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES); if (p_attr == nullptr) { if (p_attr == nullptr || SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE || SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 4) { break; } uint32_t pbap_supported_features = p_attr->attr_value.v.u32; Loading Loading
system/stack/sdp/sdp_api.cc +48 −18 Original line number Diff line number Diff line Loading @@ -22,13 +22,18 @@ * ******************************************************************************/ #ifndef LOG_TAG #define LOG_TAG "sdp_api" #endif #include "stack/include/sdp_api.h" #include <string.h> #include <cstdint> #include "bt_target.h" #include "osi/include/log.h" #include "osi/include/osi.h" // PTR_TO_UINT #include "stack/include/bt_types.h" #include "stack/sdp/sdpint.h" Loading Loading @@ -783,9 +788,17 @@ uint8_t SDP_GetNumDiRecords(const tSDP_DISCOVERY_DB* p_db) { * ******************************************************************************/ static void SDP_AttrStringCopy(char* dst, const tSDP_DISC_ATTR* p_attr, uint16_t dst_size) { if (dst == NULL) return; uint16_t dst_size, uint8_t expected_type) { if (dst == NULL) return; dst[0] = '\0'; if (p_attr) { uint8_t type = SDP_DISC_ATTR_TYPE(p_attr->attr_len_type); if (type == expected_type) { uint16_t len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); if (len > dst_size - 1) { len = dst_size - 1; Loading @@ -793,7 +806,11 @@ static void SDP_AttrStringCopy(char* dst, const tSDP_DISC_ATTR* p_attr, memcpy(dst, (const void*)p_attr->attr_value.v.array, len); dst[len] = '\0'; } else { dst[0] = '\0'; LOG_ERROR("unexpected attr type=%d, expected=%d", type, expected_type); } } else { LOG_ERROR("p_attr is NULL"); } } Loading Loading @@ -834,55 +851,68 @@ uint16_t SDP_GetDiRecord(uint8_t get_record_index, /* ClientExecutableURL is optional */ p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_CLIENT_EXE_URL); SDP_AttrStringCopy(p_device_info->rec.client_executable_url, p_curr_attr, SDP_MAX_ATTR_LEN); SDP_MAX_ATTR_LEN, URL_DESC_TYPE); /* Service Description is optional */ /* 5.1.16 ServiceDescription attribute */ p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_SERVICE_DESCRIPTION); SDP_AttrStringCopy(p_device_info->rec.service_description, p_curr_attr, SDP_MAX_ATTR_LEN); SDP_MAX_ATTR_LEN, TEXT_STR_DESC_TYPE); /* DocumentationURL is optional */ p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_DOCUMENTATION_URL); SDP_AttrStringCopy(p_device_info->rec.documentation_url, p_curr_attr, SDP_MAX_ATTR_LEN); SDP_MAX_ATTR_LEN, URL_DESC_TYPE); p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_SPECIFICATION_ID); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->spec_id = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_VENDOR_ID); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->rec.vendor = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_VENDOR_ID_SOURCE); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->rec.vendor_id_source = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_PRODUCT_ID); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->rec.product = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_PRODUCT_VERSION); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == UINT_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 2) p_device_info->rec.version = p_curr_attr->attr_value.v.u16; else result = SDP_ERR_ATTR_NOT_PRESENT; p_curr_attr = SDP_FindAttributeInRec(p_curr_record, ATTR_ID_PRIMARY_RECORD); if (p_curr_attr) if (p_curr_attr && SDP_DISC_ATTR_TYPE(p_curr_attr->attr_len_type) == BOOLEAN_DESC_TYPE && SDP_DISC_ATTR_LEN(p_curr_attr->attr_len_type) >= 1) p_device_info->rec.primary_record = (bool)p_curr_attr->attr_value.v.u8; else result = SDP_ERR_ATTR_NOT_PRESENT; Loading
system/stack/sdp/sdp_utils.cc +9 −3 Original line number Diff line number Diff line Loading @@ -231,7 +231,9 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, case UUID_SERVCLASS_AUDIO_SINK: { tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES); if (p_attr == nullptr) { if (p_attr == nullptr || SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE || SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 2) { break; } uint16_t supported_features = p_attr->attr_value.v.u16; Loading @@ -244,7 +246,9 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, case UUID_SERVCLASS_MESSAGE_ACCESS: { tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES); if (p_attr == nullptr) { if (p_attr == nullptr || SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE || SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 4) { break; } uint32_t map_supported_features = p_attr->attr_value.v.u32; Loading @@ -257,7 +261,9 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, case UUID_SERVCLASS_PBAP_PSE: { tSDP_DISC_ATTR* p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES); if (p_attr == nullptr) { if (p_attr == nullptr || SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE || SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 4) { break; } uint32_t pbap_supported_features = p_attr->attr_value.v.u32; Loading