数据结构
sdp_record_t 服务记录(service record)
typedef struct {
uint32_t handle;
/* Search pattern: a sequence of all UUIDs seen in this record */
sdp_list_t *pattern;
sdp_list_t *attrlist; // 属性列表
/* Main service class for Extended Inquiry Response */
uuid_t svclass;
} sdp_record_t;
uint32_t 服务记录句柄(service record handle)
sdp_data_t 服务属性(service attribute)
typedef struct sdp_data_struct sdp_data_t;
struct sdp_data_struct {
uint8_t dtd;
uint16_t attrId;
union {
int8_t int8;
int16_t int16;
int32_t int32;
int64_t int64;
uint128_t int128;
uint8_t uint8;
uint16_t uint16;
uint32_t uint32;
uint64_t uint64;
uint128_t uint128;
uuid_t uuid;
char *str;
sdp_data_t *dataseq;
} val;
sdp_data_t *next;
int unitSize;
};
uint16_t 属性ID( attribute ID)
sdp_pdu_hdr_t PDU头部
/*
* SDP PDU
*/
typedef struct {
uint8_t pdu_id;
uint16_t tid;
uint16_t plen;
} __attribute__ ((packed)) sdp_pdu_hdr_t;
sdp_buf_t
typedef struct {
uint8_t *data;
uint32_t data_size;
uint32_t buf_size;
} sdp_buf_t;
API
服务记录
sdp_record_alloc
sdp_record_free
sdp_record_find
sdp_record_add
sdp_record_remove
服务属性
sdp_attr_add
sdp_attr_add_new
服务记录增加服务属性
int sdp_attr_add_new(sdp_record_t *rec, uint16_t attr, uint8_t dtd,
const void *value)
{
sdp_data_t *d = sdp_data_alloc(dtd, value);
if (d) {
sdp_attr_replace(rec, attr, d);
return 0;
}
return -1;
}
sdp_attr_replace
替换记录中属性ID为attr的sdp_data_t.
void sdp_attr_replace(sdp_record_t *rec, uint16_t attr, sdp_data_t *d)
{
sdp_data_t *p;
if (!rec)
return;
p = sdp_data_get(rec, attr);
if (p) {
rec->attrlist = sdp_list_remove(rec->attrlist, p);
sdp_data_free(p);
}
d->attrId = attr;
rec->attrlist = sdp_list_insert_sorted(rec->attrlist, d, sdp_attrid_comp_func);
if (attr == SDP_ATTR_SVCLASS_ID_LIST)
extract_svclass_uuid(d, &rec->svclass);
}
sdp_attr_remove
删除记录中属性ID为attr的sdp_data_t.
void sdp_attr_remove(sdp_record_t *rec, uint16_t attr)
{
sdp_data_t *d = sdp_data_get(rec, attr);
if (d)
rec->attrlist = sdp_list_remove(rec->attrlist, d);
if (attr == SDP_ATTR_SVCLASS_ID_LIST)
memset(&rec->svclass, 0, sizeof(rec->svclass));
}
sdp_attr_pdu
sdp_attr_size
属性值
sdp_data_alloc
sdp_data_t *sdp_data_alloc(uint8_t dtd, const void *value)
{
uint32_t length;
switch (dtd) {
case SDP_URL_STR8:
case SDP_URL_STR16:
case SDP_TEXT_STR8:
case SDP_TEXT_STR16:
if (!value)
return NULL;
length = strlen((char *) value);
break;
default:
length = 0;
break;
}
return sdp_data_alloc_with_length(dtd, value, length);
}
sdp_data_free
void sdp_data_free(sdp_data_t *d)
{
switch (d->dtd) {
case SDP_SEQ8:
case SDP_SEQ16:
case SDP_SEQ32:
data_seq_free(d);
break;
case SDP_URL_STR8:
case SDP_URL_STR16:
case SDP_URL_STR32:
case SDP_TEXT_STR8:
case SDP_TEXT_STR16:
case SDP_TEXT_STR32:
free(d->val.str);
break;
}
free(d);
}
sdp_data_value
static void *sdp_data_value(sdp_data_t *data, uint32_t *len)
{
void *val = NULL;
switch (data->dtd) {
case SDP_DATA_NIL:
break;
case SDP_UINT8:
val = &data->val.uint8;
break;
case SDP_INT8:
case SDP_BOOL:
val = &data->val.int8;
break;
case SDP_UINT16:
val = &data->val.uint16;
break;
case SDP_INT16:
val = &data->val.int16;
break;
case SDP_UINT32:
val = &data->val.uint32;
break;
case SDP_INT32:
val = &data->val.int32;
break;
case SDP_INT64:
val = &data->val.int64;
break;
case SDP_UINT64:
val = &data->val.uint64;
break;
case SDP_UINT128:
val = &data->val.uint128;
break;
case SDP_INT128:
val = &data->val.int128;
break;
case SDP_UUID16:
val = &data->val.uuid.value.uuid16;
break;
case SDP_UUID32:
val = &data->val.uuid.value.uuid32;
break;
case SDP_UUID128:
val = &data->val.uuid.value.uuid128;
break;
case SDP_URL_STR8:
case SDP_URL_STR16:
case SDP_TEXT_STR8:
case SDP_TEXT_STR16:
case SDP_URL_STR32:
case SDP_TEXT_STR32:
val = data->val.str;
if (len)
*len = data->unitSize - 1;
break;
case SDP_ALT8:
case SDP_ALT16:
case SDP_ALT32:
case SDP_SEQ8:
case SDP_SEQ16:
case SDP_SEQ32:
val = sdp_copy_seq(data->val.dataseq);
break;
}
return val;
}
sdp_data_get
获取sdp记录中属性ID为attrId的sdp_data_t.
sdp_data_t *sdp_data_get(const sdp_record_t *rec, uint16_t attrId)
{
if (rec && rec->attrlist) {
sdp_data_t sdpTemplate;
sdp_list_t *p;
sdpTemplate.attrId = attrId;
p = sdp_list_find(rec->attrlist, &sdpTemplate, sdp_attrid_comp_func);
if (p)
return p->data;
}
return NULL;
}
sdp_get_service_id
获取服务ID
int sdp_get_service_id(const sdp_record_t *rec, uuid_t *uuid)
{
get_basic_attr(SDP_ATTR_SERVICE_ID, uuid, uuid);
}
sdp_get_group_id
获取组ID
int sdp_get_group_id(const sdp_record_t *rec, uuid_t *uuid)
{
get_basic_attr(SDP_ATTR_GROUP_ID, uuid, uuid);
}