Hi Jose', On Fri, Nov 13, 2009 at 10:43 AM, José Antonio Santos Cadenas <jcaden@xxxxxxxxxxxx> wrote: > This patch tries to simplify the way the SDP records for HDP are created. The > created functions allow adding supported features easily to an sdp record. The > are similar to sdp_set_profile_descs and sdp_get_profile_descs. I've also added > some macros to define new UUID's for HDP. > > > diff --git a/lib/sdp.c b/lib/sdp.c > index 822ec1a..93490e7 100644 > --- a/lib/sdp.c > +++ b/lib/sdp.c > @@ -4621,3 +4621,82 @@ uint16_t sdp_gen_tid(sdp_session_t *session) > { > return session->tid++; > } > + > +/* > +* Set the supported features > +*/ > +void sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf) > +{ > + const sdp_list_t *p, *r; > + sdp_data_t *feat = NULL, *seq_feat = NULL; Avoid declaration and initialization. > + > + int seqlen = sdp_list_len(sf); > + void **seqDTDs = (void **)malloc (seqlen * sizeof(void *)); > + void **seqVals = (void **)malloc (seqlen * sizeof(void *)); > + int i = 0; > + > + for (p = sf; p; p = p->next) { > + int plen = sdp_list_len(p->data); > + void **dtds = (void **)malloc (plen * sizeof(void *)); > + void **vals = (void **)malloc (plen * sizeof(void *)); > + int j = 0; > + for (r=p->data; r; r = r->next) { coding style: missing space "r=p->data" > + sdp_data_t *data = (sdp_data_t*)r->data; > + dtds[j] = &data->dtd; > + vals[j] = &data->val; > + j++; > + } > + feat = sdp_seq_alloc(dtds, vals, plen); > + free(dtds); > + free(vals); > + > + seqDTDs[i] = &feat->dtd; > + seqVals[i] = feat; > + i++; > + } > + seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen); > + > + sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat); Check if seqDTDs and seqVals need to be freed. > +} > + > +/* > + * Get the supported features > + * If an error occurred -1 is returned and errno is set > + */ > +int sdp_get_supp_feat (const sdp_record_t *rec, sdp_list_t **seqp) > +{ > + > + *seqp = NULL; > + sdp_data_t * sdpdata = NULL; Compiler warning: ISO C90 forbids mixed declarations and code. Remove extra space and "sdpdata" initialization. Avoid nested if/else/for: > + > + sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST); > + if (sdpdata && sdpdata->dtd >= SDP_SEQ8 && sdpdata->dtd <= SDP_SEQ32) { > + sdp_data_t *d; > + for (d = sdpdata->val.dataseq; d; d = d->next) { > + if ( d->dtd >= SDP_SEQ8 && d->dtd <= SDP_SEQ32 ) { > + sdp_data_t *dd; > + sdp_list_t *subseq = NULL; > + for (dd = d->val.dataseq; dd; dd = dd->next) { > + sdp_data_t *data; > + if ( dd->dtd != SDP_UINT8 && > + dd->dtd != SDP_UINT16 && > + dd->dtd != SDP_TEXT_STR8) > + goto fail; > + data = sdp_data_alloc(dd->dtd, &dd->val); > + subseq = sdp_list_append(subseq, data); > + } > + *seqp = sdp_list_append (*seqp, subseq); > + } else > + goto fail; If you invert the logic you don't need this "goto" > + } > + return 0; > + } > + Remove extra line. Do you have an application or sdptool's patch to test these functions? Br, Claudio. > + return sdp_get_uuidseq_attr(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp); > + > +fail: > + sdp_list_free(*seqp, free); > + errno = EINVAL; > + return -1; > +} > diff --git a/lib/sdp.h b/lib/sdp.h > index 375261e..1bb351a 100644 > --- a/lib/sdp.h > +++ b/lib/sdp.h > @@ -244,13 +244,16 @@ extern "C" { > #define SDP_ATTR_GROUP_ID 0x0200 > #define SDP_ATTR_IP_SUBNET 0x0200 > #define SDP_ATTR_VERSION_NUM_LIST 0x0200 > +#define SDP_ATTR_SUPPORTED_FEATURES_LIST 0x0200 > #define SDP_ATTR_SVCDB_STATE 0x0201 > > #define SDP_ATTR_SERVICE_VERSION 0x0300 > #define SDP_ATTR_EXTERNAL_NETWORK 0x0301 > #define SDP_ATTR_SUPPORTED_DATA_STORES_LIST 0x0301 > +#define SDP_ATTR_DATA_EXCHANGE_SPEC 0x0301 > #define SDP_ATTR_FAX_CLASS1_SUPPORT 0x0302 > #define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302 > +#define SDP_ATTR_MCAP_SUPPORTED_PROCEDURES 0x0302 > #define SDP_ATTR_FAX_CLASS20_SUPPORT 0x0303 > #define SDP_ATTR_SUPPORTED_FORMATS_LIST 0x0303 > #define SDP_ATTR_FAX_CLASS2_SUPPORT 0x0304 > diff --git a/lib/sdp_lib.h b/lib/sdp_lib.h > index ee39df8..41d5786 100644 > --- a/lib/sdp_lib.h > +++ b/lib/sdp_lib.h > @@ -585,6 +585,19 @@ static inline int sdp_get_icon_url(const sdp_record_t > *rec, char *str, int len) > return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len); > } > > +/* > + * Set the supported features > + * sf should be a list of list with each feature data > + */ > +void sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf); > + > +/* > + * Get the supported features > + * seqp is set to a list of list with each feature data > + * If an error occurred -1 is returned and errno is set > + */ > +int sdp_get_supp_feat (const sdp_record_t *rec, sdp_list_t **seqp); > + > sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int bufsize, int > *scanned); > sdp_record_t *sdp_copy_record(sdp_record_t *rec); > > > ��.n��������+%������w��{.n�����{����^n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�m