use crate::bluetooth::bdaddr_t;
use crate::hci::inquiry_info;
use crate::sdp::{
sdp_buf_t, sdp_data_t, sdp_list_t, sdp_record_t, uuid_t, SDP_ATTR_BROWSE_GRP_LIST,
SDP_ATTR_CLNT_EXEC_URL, SDP_ATTR_DOC_URL, SDP_ATTR_ICON_URL, SDP_ATTR_PROVNAME_PRIMARY,
SDP_ATTR_RECORD_STATE, SDP_ATTR_SERVICE_AVAILABILITY, SDP_ATTR_SVCDESC_PRIMARY,
SDP_ATTR_SVCINFO_TTL, SDP_ATTR_SVCLASS_ID_LIST, SDP_ATTR_SVCNAME_PRIMARY, SDP_UINT32,
SDP_UINT8,
};
use libc::{c_char, c_int, c_void, size_t};
use std::ptr;
STRUCT! {struct sdp_session_t {
sock: c_int,
state: c_int,
local: c_int,
flags: c_int,
tid: u16,
priv_: *mut c_void,
}}
ENUM! {enum sdp_attrreq_type_t {
SDP_ATTR_REQ_INDIVIDUAL = 1,
SDP_ATTR_REQ_RANGE,
}}
pub const SDP_RECORD_PERSIST: i32 = 0x01;
pub const SDP_DEVICE_RECORD: i32 = 0x02;
pub const SDP_RETRY_IF_BUSY: i32 = 0x01;
pub const SDP_WAIT_ON_CLOSE: i32 = 0x02;
pub const SDP_NON_BLOCKING: i32 = 0x04;
pub const SDP_LARGE_MTU: i32 = 0x08;
pub const MAX_LEN_UUID_STR: i32 = 37;
pub const MAX_LEN_PROTOCOL_UUID_STR: i32 = 8;
pub const MAX_LEN_SERVICECLASS_UUID_STR: i32 = 28;
pub const MAX_LEN_PROFILEDESCRIPTOR_UUID_STR: i32 = 28;
pub type sdp_list_func_t = extern "C" fn(*mut c_void, *mut c_void);
pub type sdp_free_func_t = extern "C" fn(*mut c_void);
pub type sdp_comp_func_t = extern "C" fn(*const c_void, *const c_void) -> c_int;
pub type sdp_callback_t =
extern "C" fn(type_: u8, status: u16, rsp: *mut u8, size: size_t, udata: *mut c_void);
#[link(name = "bluetooth")]
extern "C" {
pub fn sdp_list_append(list: *mut sdp_list_t, d: *mut c_void) -> *mut sdp_list_t;
pub fn sdp_list_remove(list: *mut sdp_list_t, d: *mut c_void) -> *mut sdp_list_t;
pub fn sdp_list_insert_sorted(
list: *mut sdp_list_t,
data: *mut c_void,
f: sdp_comp_func_t,
) -> *mut sdp_list_t;
pub fn sdp_list_free(list: *mut sdp_list_t, f: sdp_free_func_t);
pub fn sdp_connect(
src: *const bdaddr_t,
dst: *const bdaddr_t,
flags: u32,
) -> *mut sdp_session_t;
pub fn sdp_close(session: *mut sdp_session_t) -> c_int;
pub fn sdp_get_socket(session: *const sdp_session_t) -> c_int;
pub fn sdp_create(sk: c_int, flags: u32) -> *mut sdp_session_t;
pub fn sdp_get_error(session: *mut sdp_session_t) -> c_int;
pub fn sdp_process(session: *mut sdp_session_t) -> c_int;
pub fn sdp_set_notify(
session: *mut sdp_session_t,
func: *mut sdp_callback_t,
udata: *mut c_void,
) -> c_int;
pub fn sdp_service_search_async(
session: *mut sdp_session_t,
search: *const sdp_list_t,
max_rec_num: u16,
) -> c_int;
pub fn sdp_service_attr_async(
session: *mut sdp_session_t,
handle: u32,
reqtype: sdp_attrreq_type_t,
attrid_list: *const sdp_list_t,
) -> c_int;
pub fn sdp_service_search_attr_async(
session: *mut sdp_session_t,
search: *const sdp_list_t,
reqtype: sdp_attrreq_type_t,
attrid_list: *const sdp_list_t,
) -> c_int;
pub fn sdp_gen_tid(session: *mut sdp_session_t) -> u16;
pub fn sdp_general_inquiry(
ii: *mut inquiry_info,
dev_num: c_int,
duration: c_int,
found: *mut u8,
) -> c_int;
pub fn sdp_get_int_attr(rec: *const sdp_record_t, attr: u16, value: *mut c_int) -> c_int;
pub fn sdp_get_string_attr(
rec: *const sdp_record_t,
attr: u16,
value: *mut c_char,
valuelen: c_int,
) -> c_int;
pub fn sdp_data_alloc(dtd: u8, value: *const c_void) -> *mut sdp_data_t;
pub fn sdp_data_alloc_with_length(
dtd: u8,
value: *const c_void,
length: u32,
) -> *mut sdp_data_t;
pub fn sdp_data_free(data: *mut sdp_data_t);
pub fn sdp_data_get(rec: *const sdp_record_t, attr_id: u16) -> *mut sdp_data_t;
pub fn sdp_seq_alloc(
dtds: *mut *mut c_void,
values: *mut *mut c_void,
len: c_int,
) -> *mut sdp_data_t;
pub fn sdp_seq_alloc_with_length(
dtds: *mut *mut c_void,
values: *mut *mut c_void,
length: *mut c_int,
len: c_int,
) -> *mut sdp_data_t;
pub fn sdp_seq_append(seq: *mut sdp_data_t, data: *mut sdp_data_t) -> *mut sdp_data_t;
pub fn sdp_attr_add(rec: *mut sdp_record_t, attr: u16, data: *mut sdp_data_t) -> c_int;
pub fn sdp_attr_remove(rec: *mut sdp_record_t, attr: u16);
pub fn sdp_attr_replace(rec: *mut sdp_record_t, attr: u16, data: *mut sdp_data_t);
pub fn sdp_set_uuidseq_attr(rec: *mut sdp_record_t, attr: u16, seq: *mut sdp_list_t) -> c_int;
pub fn sdp_get_uuidseq_attr(
rec: *const sdp_record_t,
attr: u16,
seqp: *mut *mut sdp_list_t,
) -> c_int;
pub fn sdp_attr_add_new(rec: *mut sdp_record_t, attr: u16, dtd: u8, p: *const c_void) -> c_int;
pub fn sdp_set_info_attr(
rec: *mut sdp_record_t,
name: *const c_char,
prov: *const c_char,
desc: *const c_char,
);
pub fn sdp_set_access_protos(rec: *mut sdp_record_t, proto: *const sdp_list_t) -> c_int;
pub fn sdp_set_add_access_protos(rec: *mut sdp_record_t, proto: *const sdp_list_t) -> c_int;
pub fn sdp_get_proto_port(list: *const sdp_list_t, proto: c_int) -> c_int;
pub fn sdp_get_proto_desc(list: *mut sdp_list_t, proto: c_int) -> *mut sdp_data_t;
pub fn sdp_set_lang_attr(rec: *mut sdp_record_t, list: *const sdp_list_t) -> c_int;
pub fn sdp_set_service_id(rec: *mut sdp_record_t, uuid: uuid_t);
pub fn sdp_set_group_id(rec: *mut sdp_record_t, grouuuid: uuid_t);
pub fn sdp_set_profile_descs(rec: *mut sdp_record_t, desc: *const sdp_list_t) -> c_int;
pub fn sdp_set_url_attr(
rec: *mut sdp_record_t,
clientExecURL: *const c_char,
docURL: *const c_char,
iconURL: *const c_char,
);
pub fn sdp_service_search_req(
session: *mut sdp_session_t,
search: *const sdp_list_t,
max_rec_num: u16,
rsp_list: *mut *mut sdp_list_t,
) -> c_int;
pub fn sdp_service_attr_req(
session: *mut sdp_session_t,
handle: u32,
reqtype: sdp_attrreq_type_t,
attrid_list: *const sdp_list_t,
) -> *mut sdp_record_t;
pub fn sdp_service_search_attr_req(
session: *mut sdp_session_t,
search: *const sdp_list_t,
reqtype: sdp_attrreq_type_t,
attrid_list: *const sdp_list_t,
rsp_list: *mut *mut sdp_list_t,
) -> c_int;
pub fn sdp_record_alloc() -> *mut sdp_record_t;
pub fn sdp_record_free(rec: *mut sdp_record_t);
pub fn sdp_device_record_register_binary(
session: *mut sdp_session_t,
device: *mut bdaddr_t,
data: *mut u8,
size: u32,
flags: u8,
handle: *mut u32,
) -> c_int;
pub fn sdp_device_record_register(
session: *mut sdp_session_t,
device: *mut bdaddr_t,
rec: *mut sdp_record_t,
flags: u8,
) -> c_int;
pub fn sdp_record_register(
session: *mut sdp_session_t,
rec: *mut sdp_record_t,
flags: u8,
) -> c_int;
pub fn sdp_device_record_unregister_binary(
session: *mut sdp_session_t,
device: *mut bdaddr_t,
handle: u32,
) -> c_int;
pub fn sdp_device_record_unregister(
session: *mut sdp_session_t,
device: *mut bdaddr_t,
rec: *mut sdp_record_t,
) -> c_int;
pub fn sdp_record_unregister(session: *mut sdp_session_t, rec: *mut sdp_record_t) -> c_int;
pub fn sdp_device_record_update_binary(
session: *mut sdp_session_t,
device: *mut bdaddr_t,
handle: u32,
data: *mut u8,
size: u32,
) -> c_int;
pub fn sdp_device_record_update(
session: *mut sdp_session_t,
device: *mut bdaddr_t,
rec: *const sdp_record_t,
) -> c_int;
pub fn sdp_record_update(sess: *mut sdp_session_t, rec: *const sdp_record_t) -> c_int;
pub fn sdp_record_print(rec: *const sdp_record_t);
pub fn sdp_uuid16_create(uuid: *mut uuid_t, data: u16) -> *mut uuid_t;
pub fn sdp_uuid32_create(uuid: *mut uuid_t, data: u32) -> *mut uuid_t;
pub fn sdp_uuid128_create(uuid: *mut uuid_t, data: *const c_void) -> *mut uuid_t;
pub fn sdp_uuid16_cmp(p1: *const c_void, p2: *const c_void) -> c_int;
pub fn sdp_uuid128_cmp(p1: *const c_void, p2: *const c_void) -> c_int;
pub fn sdp_uuid_cmp(p1: *const c_void, p2: *const c_void) -> c_int;
pub fn sdp_uuid_to_uuid128(uuid: *const uuid_t) -> *mut uuid_t;
pub fn sdp_uuid16_to_uuid128(uuid128: *mut uuid_t, uuid16: *const uuid_t);
pub fn sdp_uuid32_to_uuid128(uuid128: *mut uuid_t, uuid32: *const uuid_t);
pub fn sdp_uuid128_to_uuid(uuid: *mut uuid_t) -> c_int;
pub fn sdp_uuid_to_proto(uuid: *mut uuid_t) -> c_int;
pub fn sdp_uuid_extract(
buffer: *const u8,
bufsize: c_int,
uuid: *mut uuid_t,
scanned: *mut c_int,
) -> c_int;
pub fn sdp_uuid_print(uuid: *const uuid_t);
pub fn sdp_uuid2strn(uuid: *const uuid_t, str: *mut c_char, n: size_t) -> c_int;
pub fn sdp_proto_uuid2strn(uuid: *const uuid_t, str: *mut c_char, n: size_t) -> c_int;
pub fn sdp_svclass_uuid2strn(uuid: *const uuid_t, str: *mut c_char, n: size_t) -> c_int;
pub fn sdp_profile_uuid2strn(uuid: *const uuid_t, str: *mut c_char, n: size_t) -> c_int;
pub fn sdp_get_access_protos(rec: *const sdp_record_t, protos: *mut *mut sdp_list_t) -> c_int;
pub fn sdp_get_add_access_protos(
rec: *const sdp_record_t,
protos: *mut *mut sdp_list_t,
) -> c_int;
pub fn sdp_get_lang_attr(rec: *const sdp_record_t, langSeq: *mut *mut sdp_list_t) -> c_int;
pub fn sdp_get_profile_descs(rec: *const sdp_record_t, profDesc: *mut *mut sdp_list_t)
-> c_int;
pub fn sdp_get_server_ver(rec: *const sdp_record_t, pVnumList: *mut *mut sdp_list_t) -> c_int;
pub fn sdp_get_service_id(rec: *const sdp_record_t, uuid: *mut uuid_t) -> c_int;
pub fn sdp_get_group_id(rec: *const sdp_record_t, uuid: *mut uuid_t) -> c_int;
pub fn sdp_get_record_state(rec: *const sdp_record_t, svcRecState: *mut u32) -> c_int;
pub fn sdp_get_service_avail(rec: *const sdp_record_t, svcAvail: *mut u8) -> c_int;
pub fn sdp_get_service_ttl(rec: *const sdp_record_t, svcTTLInfo: *mut u32) -> c_int;
pub fn sdp_get_database_state(rec: *const sdp_record_t, svcDBState: *mut u32) -> c_int;
pub fn sdp_set_supp_feat(rec: *mut sdp_record_t, sf: *const sdp_list_t) -> c_int;
pub fn sdp_get_supp_feat(rec: *const sdp_record_t, seqp: *mut *mut sdp_list_t) -> c_int;
pub fn sdp_extract_pdu(
pdata: *const u8,
bufsize: c_int,
scanned: *mut c_int,
) -> *mut sdp_record_t;
pub fn sdp_copy_record(rec: *mut sdp_record_t) -> *mut sdp_record_t;
pub fn sdp_data_print(data: *mut sdp_data_t);
pub fn sdp_print_service_attr(alist: *mut sdp_list_t);
pub fn sdp_attrid_comp_func(key1: *const c_void, key2: *const c_void) -> c_int;
pub fn sdp_set_seq_len(ptr: *mut u8, length: u32);
pub fn sdp_set_attrid(pdu: *mut sdp_buf_t, id: u16);
pub fn sdp_append_to_pdu(dst: *mut sdp_buf_t, d: *mut sdp_data_t);
pub fn sdp_append_to_buf(dst: *mut sdp_buf_t, data: *mut u8, len: u32);
pub fn sdp_gen_pdu(pdu: *mut sdp_buf_t, data: *mut sdp_data_t) -> c_int;
pub fn sdp_gen_record_pdu(rec: *const sdp_record_t, pdu: *mut sdp_buf_t) -> c_int;
pub fn sdp_extract_seqtype(
buf: *const u8,
bufsize: c_int,
dtdp: *mut u8,
size: *mut c_int,
) -> c_int;
pub fn sdp_extract_attr(
pdata: *const u8,
bufsize: c_int,
extractedLength: *mut c_int,
rec: *mut sdp_record_t,
) -> *mut sdp_data_t;
pub fn sdp_pattern_add_uuid(rec: *mut sdp_record_t, uuid: *mut uuid_t);
pub fn sdp_pattern_add_uuidseq(rec: *mut sdp_record_t, seq: *mut sdp_list_t);
pub fn sdp_send_req_w4_rsp(
session: *mut sdp_session_t,
req: *mut u8,
rsp: *mut u8,
reqsize: u32,
rspsize: *mut u32,
) -> c_int;
pub fn sdp_add_lang_attr(rec: *mut sdp_record_t);
}
#[inline]
pub fn sdp_list_len(list: *const sdp_list_t) -> c_int {
let mut list = list;
let mut n: c_int = 0;
while list != ptr::null_mut() {
n += 1;
list = unsafe { *list }.next;
}
return n;
}
#[inline]
pub fn sdp_list_find(list: *mut sdp_list_t, u: *mut c_void, f: sdp_comp_func_t) -> *mut sdp_list_t {
let mut list = list;
while list != ptr::null_mut() {
if f(unsafe { *list }.data, u) == 0 {
return list;
}
list = unsafe { *list }.next;
}
return ptr::null_mut();
}
#[inline]
pub fn sdp_list_foreach(list: *mut sdp_list_t, f: sdp_list_func_t, u: *mut c_void) {
let mut list = list;
while list != ptr::null_mut() {
f(unsafe { *list }.data, u);
list = unsafe { *list }.next;
}
}
#[inline]
pub fn sdp_set_service_classes(rec: *mut sdp_record_t, seq: *mut sdp_list_t) -> c_int {
unsafe { sdp_set_uuidseq_attr(rec, SDP_ATTR_SVCLASS_ID_LIST, seq) }
}
#[inline]
pub fn sdp_get_service_classes(rec: *const sdp_record_t, seqp: *mut *mut sdp_list_t) -> c_int {
unsafe { sdp_get_uuidseq_attr(rec, SDP_ATTR_SVCLASS_ID_LIST, seqp) }
}
#[inline]
pub fn sdp_set_browse_groups(rec: *mut sdp_record_t, seq: *mut sdp_list_t) -> c_int {
unsafe { sdp_set_uuidseq_attr(rec, SDP_ATTR_BROWSE_GRP_LIST, seq) }
}
#[inline]
pub fn sdp_set_service_ttl(rec: *mut sdp_record_t, ttl: u32) -> c_int {
unsafe {
sdp_attr_add_new(
rec,
SDP_ATTR_SVCINFO_TTL,
SDP_UINT32,
&ttl as *const _ as *const _,
)
}
}
#[inline]
pub fn sdp_set_record_state(rec: *mut sdp_record_t, state: u32) -> c_int {
unsafe {
sdp_attr_add_new(
rec,
SDP_ATTR_RECORD_STATE,
SDP_UINT32,
&state as *const _ as *const _,
)
}
}
#[inline]
pub fn sdp_set_service_avail(rec: *mut sdp_record_t, avail: u8) -> c_int {
unsafe {
sdp_attr_add_new(
rec,
SDP_ATTR_SERVICE_AVAILABILITY,
SDP_UINT8,
&avail as *const _ as *const _,
)
}
}
#[inline]
pub fn sdp_get_browse_groups(rec: *const sdp_record_t, seqp: *mut *mut sdp_list_t) -> c_int {
unsafe { sdp_get_uuidseq_attr(rec, SDP_ATTR_BROWSE_GRP_LIST, seqp) }
}
#[inline]
pub fn sdp_get_service_name(rec: *const sdp_record_t, str: *mut c_char, len: c_int) -> c_int {
unsafe { sdp_get_string_attr(rec, SDP_ATTR_SVCNAME_PRIMARY, str, len) }
}
#[inline]
pub fn sdp_get_service_desc(rec: *const sdp_record_t, str: *mut c_char, len: c_int) -> c_int {
unsafe { sdp_get_string_attr(rec, SDP_ATTR_SVCDESC_PRIMARY, str, len) }
}
#[inline]
pub fn sdp_get_provider_name(rec: *const sdp_record_t, str: *mut c_char, len: c_int) -> c_int {
unsafe { sdp_get_string_attr(rec, SDP_ATTR_PROVNAME_PRIMARY, str, len) }
}
#[inline]
pub fn sdp_get_doc_url(rec: *const sdp_record_t, str: *mut c_char, len: c_int) -> c_int {
unsafe { sdp_get_string_attr(rec, SDP_ATTR_DOC_URL, str, len) }
}
#[inline]
pub fn sdp_get_clnt_exec_url(rec: *const sdp_record_t, str: *mut c_char, len: c_int) -> c_int {
unsafe { sdp_get_string_attr(rec, SDP_ATTR_CLNT_EXEC_URL, str, len) }
}
#[inline]
pub fn sdp_get_icon_url(rec: *const sdp_record_t, str: *mut c_char, len: c_int) -> c_int {
unsafe { sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len) }
}