diff options
| -rw-r--r-- | include/sdp_lib.h | 1 | ||||
| -rw-r--r-- | lib/sdp.c | 124 | 
2 files changed, 125 insertions, 0 deletions
| diff --git a/include/sdp_lib.h b/include/sdp_lib.h index f1f74f98..959864fe 100644 --- a/include/sdp_lib.h +++ b/include/sdp_lib.h @@ -585,6 +585,7 @@ static inline int sdp_get_icon_url(const sdp_record_t *rec, char *str, int len)  }  sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int bufsize, int *scanned); +sdp_record_t *sdp_copy_record(sdp_record_t *rec);  void sdp_data_print(sdp_data_t *data);  void sdp_print_service_attr(sdp_list_t *alist); @@ -96,6 +96,8 @@ static uint128_t bluetooth_base_uuid = {  #define SDP_MAX_ATTR_LEN 65535 +static sdp_data_t *sdp_copy_seq(sdp_data_t *data); +  /* Message structure. */  struct tupla {  	int index; @@ -1365,6 +1367,128 @@ sdp_record_t *sdp_extract_pdu(const uint8_t *buf, int bufsize, int *scanned)  	return rec;  } +static void sdp_copy_pattern(void *value, void *udata) +{ +	uuid_t *uuid = value; +	sdp_record_t *rec = udata; + +	sdp_pattern_add_uuid(rec, uuid); +} + +static void *sdp_data_value(sdp_data_t *data) +{ +	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: +	case SDP_UUID32: +	case SDP_UUID128: +		val = &data->val.uuid; +		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; +		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; +} + +static sdp_data_t *sdp_copy_seq(sdp_data_t *data) +{ +	sdp_data_t *tmp, *seq = NULL, *cur = NULL; + +	for (tmp = data; tmp; tmp = tmp->next) { +		sdp_data_t *datatmp; +		void *value; + +		value = sdp_data_value(tmp); +		datatmp = sdp_data_alloc_with_length(tmp->dtd, value, +					tmp->unitSize); + +		if (cur) +			cur->next = datatmp; +		else +			seq = datatmp; + +		cur = datatmp; +	} + +	return seq; +} + +static void sdp_copy_attrlist(void *value, void *udata) +{ +	sdp_data_t *data = value; +	sdp_record_t *rec = udata; +	void *val; + +	val = sdp_data_value(data); + +	sdp_attr_add_new(rec, data->attrId, data->dtd, val); +} + +sdp_record_t *sdp_copy_record(sdp_record_t *rec) +{ +	sdp_record_t *cpy; + +	cpy = sdp_record_alloc(); + +	cpy->handle = rec->handle; + +	sdp_list_foreach(rec->pattern, sdp_copy_pattern, cpy); +	sdp_list_foreach(rec->attrlist, sdp_copy_attrlist, cpy); + +	cpy->svclass = rec->svclass; + +	return cpy; +} +  #ifdef SDP_DEBUG  static void print_dataseq(sdp_data_t *p)  { | 
