sdp_lib.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:21k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  *  BlueZ - Bluetooth protocol stack for Linux
  4.  *
  5.  *  Copyright (C) 2001-2002  Nokia Corporation
  6.  *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com>
  7.  *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@holtmann.org>
  8.  *  Copyright (C) 2002-2003  Stephen Crane <steve.crane@rococosoft.com>
  9.  *
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  24.  *
  25.  */
  26. #ifndef __SDP_LIB_H
  27. #define __SDP_LIB_H
  28. #include <sys/socket.h>
  29. #include <bluetooth/bluetooth.h>
  30. #include <bluetooth/hci.h>
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34. /*
  35.  * SDP lists
  36.  */
  37. typedef void(*sdp_list_func_t)(void *, void *);
  38. typedef void(*sdp_free_func_t)(void *);
  39. typedef int (*sdp_comp_func_t)(const void *, const void *);
  40. sdp_list_t *sdp_list_append(sdp_list_t *list, void *d);
  41. sdp_list_t *sdp_list_remove(sdp_list_t *list, void *d);
  42. sdp_list_t *sdp_list_insert_sorted(sdp_list_t *list, void *data, sdp_comp_func_t f);
  43. void        sdp_list_free(sdp_list_t *list, sdp_free_func_t f);
  44. static inline int sdp_list_len(const sdp_list_t *list) 
  45. {
  46. int n = 0;
  47. for (; list; list = list->next)
  48. n++;
  49. return n;
  50. }
  51. static inline sdp_list_t *sdp_list_find(sdp_list_t *list, void *u, sdp_comp_func_t f)
  52. {
  53. for (; list; list = list->next)
  54. if (f(list->data, u) == 0)
  55. return list;
  56. return NULL;
  57. }
  58. static inline void sdp_list_foreach(sdp_list_t *list, sdp_list_func_t f, void *u)
  59. {
  60. for (; list; list = list->next)
  61. f(list->data, u);
  62. }
  63. /*
  64.  * Values of the flags parameter to sdp_record_register
  65.  */
  66. #define SDP_RECORD_PERSIST 0x01
  67. #define SDP_DEVICE_RECORD 0x02
  68. /*
  69.  * Values of the flags parameter to sdp_connect
  70.  */
  71. #define SDP_RETRY_IF_BUSY 0x01
  72. #define SDP_WAIT_ON_CLOSE 0x02
  73. #define SDP_NON_BLOCKING 0x04
  74. /*
  75.  * a session with an SDP server
  76.  */
  77. typedef struct {
  78. int sock;
  79. int state;
  80. int local;
  81. int flags;
  82. uint16_t tid; // Current transaction ID
  83. void *priv;
  84. } sdp_session_t;
  85. typedef enum {
  86. /*
  87.  *  Attributes are specified as individual elements
  88.  */
  89. SDP_ATTR_REQ_INDIVIDUAL = 1,
  90. /*
  91.  *  Attributes are specified as a range
  92.  */
  93. SDP_ATTR_REQ_RANGE
  94. } sdp_attrreq_type_t;
  95. /*
  96.  *  When the pdu_id(type) is a sdp error response, check the status value
  97.  *  to figure out the error reason. For status values 0x0001-0x0006 check
  98.  *  Bluetooth SPEC. If the status is 0xffff, call sdp_get_error function
  99.  *  to get the real reason:
  100.  *      - wrong transaction ID(EPROTO)
  101.  *      - wrong PDU id or(EPROTO)
  102.  *      - I/O error
  103.  */
  104. typedef void sdp_callback_t(uint8_t type, uint16_t status, uint8_t *rsp, size_t size, void *udata);
  105. /*
  106.  * create an L2CAP connection to a Bluetooth device
  107.  * 
  108.  * INPUT:
  109.  *  
  110.  *  bdaddr_t *src:
  111.  * Address of the local device to use to make the connection
  112.  * (or BDADDR_ANY)
  113.  *
  114.  *  bdaddr_t *dst:
  115.  *    Address of the SDP server device
  116.  */
  117. sdp_session_t *sdp_connect(const bdaddr_t *src, const bdaddr_t *dst, uint32_t flags);
  118. int sdp_close(sdp_session_t *session);
  119. int sdp_get_socket(const sdp_session_t *session);
  120. /*
  121.  * SDP transaction: functions for asynchronous search.
  122.  */
  123. sdp_session_t *sdp_create(int sk, uint32_t flags);
  124. int sdp_get_error(sdp_session_t *session);
  125. int sdp_process(sdp_session_t *session);
  126. int sdp_set_notify(sdp_session_t *session, sdp_callback_t *func, void *udata);
  127. int sdp_service_search_async(sdp_session_t *session, const sdp_list_t *search, uint16_t max_rec_num);
  128. int sdp_service_attr_async(sdp_session_t *session, uint32_t handle, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list);
  129. int sdp_service_search_attr_async(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list);
  130. uint16_t sdp_gen_tid(sdp_session_t *session);
  131. /*
  132.  * find all devices in the piconet
  133.  */
  134. int sdp_general_inquiry(inquiry_info *ii, int dev_num, int duration, uint8_t *found);
  135. /* flexible extraction of basic attributes - Jean II */
  136. int sdp_get_int_attr(const sdp_record_t *rec, uint16_t attr, int *value);
  137. int sdp_get_string_attr(const sdp_record_t *rec, uint16_t attr, char *value, int valuelen);
  138. /*
  139.  * Basic sdp data functions
  140.  */
  141. sdp_data_t *sdp_data_alloc(uint8_t dtd, const void *value);
  142. sdp_data_t *sdp_data_alloc_with_length(uint8_t dtd, const void *value, uint32_t length);
  143. void sdp_data_free(sdp_data_t *data);
  144. sdp_data_t *sdp_data_get(const sdp_record_t *rec, uint16_t attr_id);
  145. sdp_data_t *sdp_seq_alloc(void **dtds, void **values, int len);
  146. sdp_data_t *sdp_seq_alloc_with_length(void **dtds, void **values, int *length, int len);
  147. sdp_data_t *sdp_seq_append(sdp_data_t *seq, sdp_data_t *data);
  148. int sdp_attr_add(sdp_record_t *rec, uint16_t attr, sdp_data_t *data);
  149. void sdp_attr_remove(sdp_record_t *rec, uint16_t attr);
  150. void sdp_attr_replace(sdp_record_t *rec, uint16_t attr, sdp_data_t *data);
  151. int sdp_set_uuidseq_attr(sdp_record_t *rec, uint16_t attr, sdp_list_t *seq);
  152. int sdp_get_uuidseq_attr(const sdp_record_t *rec, uint16_t attr, sdp_list_t **seqp);
  153. /*
  154.  * NOTE that none of the functions below will update the SDP server, 
  155.  * unless the {register, update}sdp_record_t() function is invoked.
  156.  * All functions which return an integer value, return 0 on success 
  157.  * or -1 on failure.
  158.  */
  159. /*
  160.  * Create an attribute and add it to the service record's attribute list.
  161.  * This consists of the data type descriptor of the attribute, 
  162.  * the value of the attribute and the attribute identifier.
  163.  */
  164. int sdp_attr_add_new(sdp_record_t *rec, uint16_t attr, uint8_t dtd, const void *p);
  165. /*
  166.  * Set the information attributes of the service record.
  167.  * The set of attributes comprises service name, description 
  168.  * and provider name
  169.  */
  170. void sdp_set_info_attr(sdp_record_t *rec, const char *name, const char *prov, const char *desc);
  171. /*
  172.  * Set the ServiceClassID attribute to the sequence specified by seq.
  173.  * Note that the identifiers need to be in sorted order from the most 
  174.  * specific to the most generic service class that this service
  175.  * conforms to.
  176.  */
  177. static inline int sdp_set_service_classes(sdp_record_t *rec, sdp_list_t *seq)
  178. {
  179. return sdp_set_uuidseq_attr(rec, SDP_ATTR_SVCLASS_ID_LIST, seq);
  180. }
  181. /*
  182.  * Get the service classes to which the service conforms.
  183.  * 
  184.  * When set, the list contains elements of ServiceClassIdentifer(uint16_t) 
  185.  * ordered from most specific to most generic
  186.  */
  187. static inline int sdp_get_service_classes(const sdp_record_t *rec, sdp_list_t **seqp)
  188. {
  189. return sdp_get_uuidseq_attr(rec, SDP_ATTR_SVCLASS_ID_LIST, seqp);
  190. }
  191. /*
  192.  * Set the BrowseGroupList attribute to the list specified by seq.
  193.  * 
  194.  * A service can belong to one or more service groups 
  195.  * and the list comprises such group identifiers (UUIDs)
  196.  */
  197. static inline int sdp_set_browse_groups(sdp_record_t *rec, sdp_list_t *seq)
  198. {
  199. return sdp_set_uuidseq_attr(rec, SDP_ATTR_BROWSE_GRP_LIST, seq);
  200. }
  201. /*
  202.  * Set the access protocols of the record to those specified in proto
  203.  */
  204. int sdp_set_access_protos(sdp_record_t *rec, const sdp_list_t *proto);
  205. /*
  206.  * Set the additional access protocols of the record to those specified in proto
  207.  */
  208. int sdp_set_add_access_protos(sdp_record_t *rec, const sdp_list_t *proto);
  209. /*
  210.  * Get protocol port (i.e. PSM for L2CAP, Channel for RFCOMM) 
  211.  */
  212. int sdp_get_proto_port(const sdp_list_t *list, int proto);
  213. /*
  214.  * Get protocol descriptor. 
  215.  */
  216. sdp_data_t *sdp_get_proto_desc(sdp_list_t *list, int proto);
  217. /*
  218.  * Set the LanguageBase attributes to the values specified in list 
  219.  * (a linked list of sdp_lang_attr_t objects, one for each language in 
  220.  * which user-visible attributes are present).
  221.  */
  222. int sdp_set_lang_attr(sdp_record_t *rec, const sdp_list_t *list);
  223. /*
  224.  * Set the ServiceInfoTimeToLive attribute of the service.  
  225.  * This is the number of seconds that this record is guaranteed
  226.  * not to change after being obtained by a client.
  227.  */
  228. static inline int sdp_set_service_ttl(sdp_record_t *rec, uint32_t ttl)
  229. {
  230. return sdp_attr_add_new(rec, SDP_ATTR_SVCINFO_TTL, SDP_UINT32, &ttl);
  231. }
  232. /*
  233.  * Set the ServiceRecordState attribute of a service. This is
  234.  * guaranteed to change if there is any kind of modification to 
  235.  * the record. 
  236.  */
  237. static inline int sdp_set_record_state(sdp_record_t *rec, uint32_t state)
  238. {
  239. return sdp_attr_add_new(rec, SDP_ATTR_RECORD_STATE, SDP_UINT32, &state);
  240. }
  241. /*
  242.  * Set the ServiceID attribute of a service. 
  243.  */
  244. void sdp_set_service_id(sdp_record_t *rec, uuid_t uuid);
  245. /*
  246.  * Set the GroupID attribute of a service
  247.  */
  248. void sdp_set_group_id(sdp_record_t *rec, uuid_t grouuuid);
  249. /*
  250.  * Set the ServiceAvailability attribute of a service.
  251.  * 
  252.  * Note that this represents the relative availability
  253.  * of the service: 0x00 means completely unavailable;
  254.  * 0xFF means maximum availability.
  255.  */
  256. static inline int sdp_set_service_avail(sdp_record_t *rec, uint8_t avail)
  257. {
  258. return sdp_attr_add_new(rec, SDP_ATTR_SERVICE_AVAILABILITY, SDP_UINT8, &avail);
  259. }
  260. /*
  261.  * Set the profile descriptor list attribute of a record.
  262.  * 
  263.  * Each element in the list is an object of type
  264.  * sdp_profile_desc_t which is a definition of the
  265.  * Bluetooth profile that this service conforms to.
  266.  */
  267. int sdp_set_profile_descs(sdp_record_t *rec, const sdp_list_t *desc);
  268. /*
  269.  * Set URL attributes of a record.
  270.  * 
  271.  * ClientExecutableURL: a URL to a client's platform specific (WinCE, 
  272.  * PalmOS) executable code that can be used to access this service.
  273.  * 
  274.  * DocumentationURL: a URL pointing to service documentation
  275.  * 
  276.  * IconURL: a URL to an icon that can be used to represent this service.
  277.  * 
  278.  * Note: pass NULL for any URLs that you don't want to set or remove
  279.  */
  280. void sdp_set_url_attr(sdp_record_t *rec, const char *clientExecURL, const char *docURL, const char *iconURL);
  281. /*
  282.  * a service search request. 
  283.  * 
  284.  *  INPUT :
  285.  * 
  286.  *    sdp_list_t *search
  287.  *      list containing elements of the search
  288.  *      pattern. Each entry in the list is a UUID
  289.  *      of the service to be searched
  290.  * 
  291.  *    uint16_t max_rec_num
  292.  *       An integer specifying the maximum number of
  293.  *       entries that the client can handle in the response.
  294.  * 
  295.  *  OUTPUT :
  296.  * 
  297.  *    int return value
  298.  *      0 
  299.  *        The request completed successfully. This does not
  300.  *        mean the requested services were found
  301.  *      -1
  302.  *        The request completed unsuccessfully
  303.  * 
  304.  *    sdp_list_t *rsp_list
  305.  *      This variable is set on a successful return if there are
  306.  *      non-zero service handles. It is a singly linked list of
  307.  *      service record handles (uint16_t)
  308.  */
  309. int sdp_service_search_req(sdp_session_t *session, const sdp_list_t *search, uint16_t max_rec_num, sdp_list_t **rsp_list);
  310. /*
  311.  *  a service attribute request. 
  312.  * 
  313.  *  INPUT :
  314.  * 
  315.  *    uint32_t handle
  316.  *      The handle of the service for which the attribute(s) are
  317.  *      requested
  318.  * 
  319.  *    sdp_attrreq_type_t reqtype
  320.  *      Attribute identifiers are 16 bit unsigned integers specified
  321.  *      in one of 2 ways described below :
  322.  *      SDP_ATTR_REQ_INDIVIDUAL - 16bit individual identifiers
  323.  *         They are the actual attribute identifiers in ascending order
  324.  * 
  325.  *      SDP_ATTR_REQ_RANGE - 32bit identifier range
  326.  *         The high-order 16bits is the start of range
  327.  *         the low-order 16bits are the end of range
  328.  *         0x0000 to 0xFFFF gets all attributes
  329.  * 
  330.  *    sdp_list_t *attrid_list
  331.  *      Singly linked list containing attribute identifiers desired.
  332.  *      Every element is either a uint16_t(attrSpec = SDP_ATTR_REQ_INDIVIDUAL)  
  333.  *      or a uint32_t(attrSpec=SDP_ATTR_REQ_RANGE)
  334.  * 
  335.  *  OUTPUT :
  336.  *    int return value
  337.  *      0 
  338.  *        The request completed successfully. This does not
  339.  *        mean the requested services were found
  340.  *      -1
  341.  *        The request completed unsuccessfully due to a timeout
  342.  */
  343. sdp_record_t *sdp_service_attr_req(sdp_session_t *session, uint32_t handle, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list);
  344. /*
  345.  *  This is a service search request combined with the service
  346.  *  attribute request. First a service class match is done and
  347.  *  for matching service, requested attributes are extracted
  348.  * 
  349.  *  INPUT :
  350.  * 
  351.  *    sdp_list_t *search
  352.  *      Singly linked list containing elements of the search
  353.  *      pattern. Each entry in the list is a UUID(DataTypeSDP_UUID16)
  354.  *      of the service to be searched
  355.  * 
  356.  *    AttributeSpecification attrSpec
  357.  *      Attribute identifiers are 16 bit unsigned integers specified
  358.  *      in one of 2 ways described below :
  359.  *      SDP_ATTR_REQ_INDIVIDUAL - 16bit individual identifiers
  360.  *         They are the actual attribute identifiers in ascending order
  361.  * 
  362.  *      SDP_ATTR_REQ_RANGE - 32bit identifier range
  363.  *         The high-order 16bits is the start of range
  364.  *         the low-order 16bits are the end of range
  365.  *         0x0000 to 0xFFFF gets all attributes
  366.  * 
  367.  *    sdp_list_t *attrid_list
  368.  *      Singly linked list containing attribute identifiers desired.
  369.  *      Every element is either a uint16_t(attrSpec = SDP_ATTR_REQ_INDIVIDUAL)  
  370.  *      or a uint32_t(attrSpec=SDP_ATTR_REQ_RANGE)
  371.  * 
  372.  *  OUTPUT :
  373.  *    int return value
  374.  *      0 
  375.  *        The request completed successfully. This does not
  376.  *        mean the requested services were found
  377.  *      -1
  378.  *        The request completed unsuccessfully due to a timeout
  379.  * 
  380.  *    sdp_list_t *rsp_list
  381.  *      This variable is set on a successful return to point to
  382.  *      service(s) found. Each element of this list is of type
  383.  *      sdp_record_t *.
  384.  */
  385. int sdp_service_search_attr_req(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list, sdp_list_t **rsp_list);
  386. /*
  387.  * Allocate/free a service record and its attributes
  388.  */
  389. sdp_record_t *sdp_record_alloc(void);
  390. void sdp_record_free(sdp_record_t *rec);
  391. /*
  392.  * Register a service record. 
  393.  * 
  394.  * Note: It is the responsbility of the Service Provider to create the 
  395.  * record first and set its attributes using setXXX() methods.
  396.  * 
  397.  * The service provider must then call sdp_record_register() to make 
  398.  * the service record visible to SDP clients.  This function returns 0
  399.  * on success or -1 on failure (and sets errno).
  400.  */
  401. int sdp_device_record_register_binary(sdp_session_t *session, bdaddr_t *device, uint8_t *data, uint32_t size, uint8_t flags, uint32_t *handle);
  402. int sdp_device_record_register(sdp_session_t *session, bdaddr_t *device, sdp_record_t *rec, uint8_t flags);
  403. int sdp_record_register(sdp_session_t *session, sdp_record_t *rec, uint8_t flags);
  404. /*
  405.  * Unregister a service record.
  406.  */
  407. int sdp_device_record_unregister_binary(sdp_session_t *session, bdaddr_t *device, uint32_t handle);
  408. int sdp_device_record_unregister(sdp_session_t *session, bdaddr_t *device, sdp_record_t *rec);
  409. int sdp_record_unregister(sdp_session_t *session, sdp_record_t *rec);
  410. /*
  411.  * Update an existing service record.  (Calling this function
  412.  * before a previous call to sdp_record_register() will result
  413.  * in an error.)
  414.  */
  415. int sdp_device_record_update_binary(sdp_session_t *session, bdaddr_t *device, uint32_t handle, uint8_t *data, uint32_t size);
  416. int sdp_device_record_update(sdp_session_t *session, bdaddr_t *device, const sdp_record_t *rec);
  417. int sdp_record_update(sdp_session_t *sess, const sdp_record_t *rec);
  418. void sdp_record_print(const sdp_record_t *rec);
  419. /*
  420.  * UUID functions
  421.  */
  422. uuid_t *sdp_uuid16_create(uuid_t *uuid, uint16_t data);
  423. uuid_t *sdp_uuid32_create(uuid_t *uuid, uint32_t data);
  424. uuid_t *sdp_uuid128_create(uuid_t *uuid, const void *data);
  425. int sdp_uuid16_cmp(const void *p1, const void *p2);
  426. int sdp_uuid128_cmp(const void *p1, const void *p2);
  427. uuid_t *sdp_uuid_to_uuid128(uuid_t *uuid);
  428. void sdp_uuid16_to_uuid128(uuid_t *uuid128, uuid_t *uuid16);
  429. void sdp_uuid32_to_uuid128(uuid_t *uuid128, uuid_t *uuid32);
  430. int sdp_uuid128_to_uuid(uuid_t *uuid);
  431. int sdp_uuid_to_proto(uuid_t *uuid);
  432. int sdp_uuid_extract(const uint8_t *buffer, uuid_t *uuid, int *scanned);
  433. int sdp_uuid_extract_safe(const uint8_t *buffer, int bufsize, uuid_t *uuid, int *scanned);
  434. void sdp_uuid_print(const uuid_t *uuid);
  435. #define MAX_LEN_UUID_STR 37
  436. #define MAX_LEN_PROTOCOL_UUID_STR 8
  437. #define MAX_LEN_SERVICECLASS_UUID_STR 28
  438. #define MAX_LEN_PROFILEDESCRIPTOR_UUID_STR 28
  439. int sdp_uuid2strn(const uuid_t *uuid, char *str, size_t n);
  440. int sdp_proto_uuid2strn(const uuid_t *uuid, char *str, size_t n);
  441. int sdp_svclass_uuid2strn(const uuid_t *uuid, char *str, size_t n);
  442. int sdp_profile_uuid2strn(const uuid_t *uuid, char *str, size_t n);
  443. /*
  444.  * In all the sdp_get_XXX(handle, XXX *xxx) functions below, 
  445.  * the XXX * is set to point to the value, should it exist
  446.  * and 0 is returned. If the value does not exist, -1 is
  447.  * returned and errno set to ENODATA.
  448.  *
  449.  * In all the methods below, the memory management rules are
  450.  * simple. Don't free anything! The pointer returned, in the
  451.  * case of constructed types, is a pointer to the contents 
  452.  * of the sdp_record_t.
  453.  */
  454. /*
  455.  * Get the access protocols from the service record
  456.  */
  457. int sdp_get_access_protos(const sdp_record_t *rec, sdp_list_t **protos);
  458. /*
  459.  * Get the additional access protocols from the service record
  460.  */
  461. int sdp_get_add_access_protos(const sdp_record_t *rec, sdp_list_t **protos);
  462. /*
  463.  * Extract the list of browse groups to which the service belongs.
  464.  * When set, seqp contains elements of GroupID (uint16_t) 
  465.  */
  466. static inline int sdp_get_browse_groups(const sdp_record_t *rec, sdp_list_t **seqp)
  467. {
  468. return sdp_get_uuidseq_attr(rec, SDP_ATTR_BROWSE_GRP_LIST, seqp);
  469. }
  470. /*
  471.  * Extract language attribute meta-data of the service record. 
  472.  * For each language in the service record, LangSeq has a struct of type
  473.  * sdp_lang_attr_t. 
  474.  */
  475. int sdp_get_lang_attr(const sdp_record_t *rec, sdp_list_t **langSeq);
  476. /*
  477.  * Extract the Bluetooth profile descriptor sequence from a record.
  478.  * Each element in the list is of type sdp_profile_desc_t
  479.  * which contains the UUID of the profile and its version number
  480.  * (encoded as major and minor in the high-order 8bits
  481.  * and low-order 8bits respectively of the uint16_t)
  482.  */
  483. int sdp_get_profile_descs(const sdp_record_t *rec, sdp_list_t **profDesc);
  484. /*
  485.  * Extract SDP server version numbers 
  486.  * 
  487.  * Note: that this is an attribute of the SDP server only and
  488.  * contains a list of uint16_t each of which represent the
  489.  * major and minor SDP version numbers supported by this server
  490.  */
  491. int sdp_get_server_ver(const sdp_record_t *rec, sdp_list_t **pVnumList);
  492. int sdp_get_service_id(const sdp_record_t *rec, uuid_t *uuid);
  493. int sdp_get_group_id(const sdp_record_t *rec, uuid_t *uuid);
  494. int sdp_get_record_state(const sdp_record_t *rec, uint32_t *svcRecState);
  495. int sdp_get_service_avail(const sdp_record_t *rec, uint8_t *svcAvail);
  496. int sdp_get_service_ttl(const sdp_record_t *rec, uint32_t *svcTTLInfo);
  497. int sdp_get_database_state(const sdp_record_t *rec, uint32_t *svcDBState);
  498. static inline int sdp_get_service_name(const sdp_record_t *rec, char *str, int len)
  499. {
  500. return sdp_get_string_attr(rec, SDP_ATTR_SVCNAME_PRIMARY, str, len);
  501. }
  502. static inline int sdp_get_service_desc(const sdp_record_t *rec, char *str, int len)
  503. {
  504. return sdp_get_string_attr(rec, SDP_ATTR_SVCDESC_PRIMARY, str, len);
  505. }
  506. static inline int sdp_get_provider_name(const sdp_record_t *rec, char *str, int len)
  507. {
  508. return sdp_get_string_attr(rec, SDP_ATTR_PROVNAME_PRIMARY, str, len);
  509. }
  510. static inline int sdp_get_doc_url(const sdp_record_t *rec, char *str, int len)
  511. {
  512. return sdp_get_string_attr(rec, SDP_ATTR_DOC_URL, str, len);
  513. }
  514. static inline int sdp_get_clnt_exec_url(const sdp_record_t *rec, char *str, int len)
  515. {
  516. return sdp_get_string_attr(rec, SDP_ATTR_CLNT_EXEC_URL, str, len);
  517. }
  518. static inline int sdp_get_icon_url(const sdp_record_t *rec, char *str, int len)
  519. {
  520. return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len);
  521. }
  522. sdp_record_t *sdp_extract_pdu(const uint8_t *pdata, int *scanned);
  523. sdp_record_t *sdp_extract_pdu_safe(const uint8_t *pdata, int bufsize, int *scanned);
  524. void sdp_data_print(sdp_data_t *data);
  525. void sdp_print_service_attr(sdp_list_t *alist);
  526. int sdp_attrid_comp_func(const void *key1, const void *key2);
  527. void sdp_set_seq_len(uint8_t *ptr, uint32_t length);
  528. void sdp_set_attrid(sdp_buf_t *pdu, uint16_t id);
  529. void sdp_append_to_pdu(sdp_buf_t *dst, sdp_data_t *d);
  530. void sdp_append_to_buf(sdp_buf_t *dst, uint8_t *data, uint32_t len);
  531. int sdp_gen_pdu(sdp_buf_t *pdu, sdp_data_t *data);
  532. int sdp_gen_record_pdu(const sdp_record_t *rec, sdp_buf_t *pdu);
  533. int sdp_extract_seqtype(const uint8_t *buf, uint8_t *dtdp, int *seqlen);
  534. int sdp_extract_seqtype_safe(const uint8_t *buf, int bufsize, uint8_t *dtdp, int *size);
  535. sdp_data_t *sdp_extract_attr(const uint8_t *pdata, int *extractedLength, sdp_record_t *rec);
  536. sdp_data_t *sdp_extract_attr_safe(const uint8_t *pdata, int bufsize, int *extractedLength, sdp_record_t *rec);
  537. void sdp_pattern_add_uuid(sdp_record_t *rec, uuid_t *uuid);
  538. void sdp_pattern_add_uuidseq(sdp_record_t *rec, sdp_list_t *seq);
  539. int sdp_send_req_w4_rsp(sdp_session_t *session, uint8_t *req, uint8_t *rsp, uint32_t reqsize, uint32_t *rspsize);
  540. #ifdef __cplusplus
  541. }
  542. #endif
  543. #endif /* __SDP_LIB_H */