#include "osi/include/fixed_queue.h"
#include "bta_sys.h"
#include "bta_gatt_api.h"
-#include "bta_gattc_ci.h"
-#include "bta_gattc_co.h"
#include "bt_common.h"
BTA_GATTC_OP_CMPL_EVT,
BTA_GATTC_INT_DISCONN_EVT,
- /* for cache loading/saving */
- BTA_GATTC_START_CACHE_EVT,
- BTA_GATTC_CI_CACHE_OPEN_EVT,
- BTA_GATTC_CI_CACHE_LOAD_EVT,
- BTA_GATTC_CI_CACHE_SAVE_EVT,
-
BTA_GATTC_INT_START_IF_EVT,
BTA_GATTC_API_REG_EVT,
BTA_GATTC_API_DEREG_EVT,
};
typedef UINT16 tBTA_GATTC_INT_EVT;
+#define BTA_GATTC_SERVICE_CHANGED_LEN 4
+
/* max client application GATTC can support */
#ifndef BTA_GATTC_CL_MAX
#define BTA_GATTC_CL_MAX 32
/* max known devices GATTC can support */
#ifndef BTA_GATTC_KNOWN_SR_MAX
+#ifndef MAX_ACL_CONNECTIONS
#define BTA_GATTC_KNOWN_SR_MAX 10
+#else
+#define BTA_GATTC_KNOWN_SR_MAX MAX_ACL_CONNECTIONS
+#endif
#endif
#define BTA_GATTC_CONN_MAX GATT_MAX_PHY_CHANNEL
{
BT_HDR hdr;
tBTA_GATT_AUTH_REQ auth_req;
- tBTA_GATT_SRVC_ID srvc_id;
- tBTA_GATT_ID char_id;
- tBTA_GATT_ID *p_descr_type;
+ UINT16 handle;
+ tBTA_GATTC_EVT cmpl_evt;
} tBTA_GATTC_API_READ;
typedef struct
{
BT_HDR hdr;
tBTA_GATT_AUTH_REQ auth_req;
- tBTA_GATT_SRVC_ID srvc_id;
- tBTA_GATT_ID char_id;
- tBTA_GATT_ID *p_descr_type;
+ UINT16 handle;
+ tBTA_GATTC_EVT cmpl_evt;
tBTA_GATTC_WRITE_TYPE write_type;
UINT16 offset;
UINT16 len;
typedef struct
{
BT_HDR hdr;
- tBTA_GATT_SRVC_ID srvc_id;
- tBTA_GATT_ID char_id;
+ UINT16 handle;
} tBTA_GATTC_API_CONFIRM;
typedef tGATT_CL_COMPLETE tBTA_GATTC_CMPL;
BT_HDR hdr;
tBTA_GATT_AUTH_REQ auth_req;
UINT8 num_attr;
- tBTA_GATTC_ATTR_ID *p_id_list;
+ UINT16 handles[GATT_MAX_READ_MULTI_HANDLES];
}tBTA_GATTC_API_READ_MULTI;
typedef struct
tBTA_GATTC_API_READ_MULTI api_read_multi;
tBTA_GATTC_API_CFG_MTU api_mtu;
tBTA_GATTC_OP_CMPL op_cmpl;
- tBTA_GATTC_CI_EVT ci_open;
- tBTA_GATTC_CI_EVT ci_save;
- tBTA_GATTC_CI_LOAD ci_load;
tBTA_GATTC_INT_CONN int_conn;
tBTA_GATTC_ENC_CMPL enc_cmpl;
/* GATT server cache on the client */
-typedef union
-{
- UINT8 uuid128[LEN_UUID_128];
- UINT16 uuid16;
-}tBTA_GATTC_UUID;
-
-typedef struct gattc_attr_cache
-{
- tBTA_GATTC_UUID *p_uuid;
- struct gattc_attr_cache *p_next;
- UINT16 uuid_len;
- UINT16 attr_handle;
- UINT8 inst_id;
- tBTA_GATT_CHAR_PROP property; /* if characteristic, it is char property;
- if included service, flag primary,
- if descriptor, not used */
- tBTA_GATTC_ATTR_TYPE attr_type;
-// btla-specific ++
-} __attribute__((packed)) tBTA_GATTC_CACHE_ATTR;
-// btla-specific --
-
-typedef struct gattc_svc_cache
-{
- tBTA_GATT_SRVC_ID service_uuid;
- tBTA_GATTC_CACHE_ATTR *p_attr;
- tBTA_GATTC_CACHE_ATTR *p_last_attr;
- UINT16 s_handle;
- UINT16 e_handle;
- struct gattc_svc_cache *p_next;
- tBTA_GATTC_CACHE_ATTR *p_cur_char;
-// btla-specific ++
-} __attribute__((packed)) tBTA_GATTC_CACHE;
-// btla-specific --
typedef struct
{
tBT_UUID uuid;
UINT16 s_handle;
UINT16 e_handle;
+ // this field is set only for characteristic
+ UINT16 char_decl_handle;
BOOLEAN is_primary;
- UINT8 srvc_inst_id;
tBTA_GATT_CHAR_PROP property;
}tBTA_GATTC_ATTR_REC;
UINT8 state;
- tBTA_GATTC_CACHE *p_srvc_cache;
- tBTA_GATTC_CACHE *p_cur_srvc;
- fixed_queue_t *cache_buffer; /* buffer queue used for storing the cache data */
- UINT8 *p_free; /* starting point to next available byte */
- UINT16 free_byte; /* number of available bytes in server cache buffer */
+ list_t *p_srvc_cache; /* list of tBTA_GATTC_SERVICE */
UINT8 update_count; /* indication received */
UINT8 num_clcb; /* number of associated CLCB */
} tBTA_GATTC_SERV;
#ifndef BTA_GATTC_NOTIF_REG_MAX
+#ifndef MAX_ACL_CONNECTIONS
#define BTA_GATTC_NOTIF_REG_MAX 15
+#else
+#define BTA_GATTC_NOTIF_REG_MAX MAX_ACL_CONNECTIONS*3
+#endif
#endif
typedef struct
{
BOOLEAN in_use;
BD_ADDR remote_bda;
- tBTA_GATTC_CHAR_ID char_id;
+ UINT16 handle;
}tBTA_GATTC_NOTIF_REG;
typedef struct
extern void bta_gattc_execute(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
extern void bta_gattc_read_multi(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
extern void bta_gattc_ci_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
-extern void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
extern void bta_gattc_ci_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
-extern void bta_gattc_ci_save(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
-extern void bta_gattc_cache_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
extern void bta_gattc_ignore_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
extern void bta_gattc_restart_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA * p_msg);
extern void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg);
extern BOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
-extern UINT16 bta_gattc_id2handle(tBTA_GATTC_SERV *p_srcb, tBTA_GATT_SRVC_ID *p_service_id, tBTA_GATT_ID *p_char_id, tBTA_GATT_ID *p_descr_uuid);
-extern BOOLEAN bta_gattc_handle2id(tBTA_GATTC_SERV *p_srcb, UINT16 handle, tBTA_GATT_SRVC_ID *service_id, tBTA_GATT_ID *char_id, tBTA_GATT_ID *p_type);
-extern BOOLEAN bta_gattc_uuid_compare (tBT_UUID *p_src, tBT_UUID *p_tar, BOOLEAN is_precise);
-extern void bta_gattc_pack_attr_uuid(tBTA_GATTC_CACHE_ATTR *p_attr, tBT_UUID *p_uuid);
+extern BOOLEAN bta_gattc_uuid_compare (const tBT_UUID *p_src, const tBT_UUID *p_tar, BOOLEAN is_precise);
extern BOOLEAN bta_gattc_check_notif_registry(tBTA_GATTC_RCB *p_clreg, tBTA_GATTC_SERV *p_srcb, tBTA_GATTC_NOTIFY *p_notify);
-extern tBTA_GATT_STATUS bta_gattc_pack_read_cb_data(tBTA_GATTC_SERV *p_srcb, tBT_UUID *p_descr_uuid, tGATT_VALUE *p_attr, tBTA_GATT_READ_VAL *p_value);
extern BOOLEAN bta_gattc_mark_bg_conn (tBTA_GATTC_IF client_if, BD_ADDR_PTR remote_bda, BOOLEAN add, BOOLEAN is_listen);
extern BOOLEAN bta_gattc_check_bg_conn (tBTA_GATTC_IF client_if, BD_ADDR remote_bda, UINT8 role);
extern UINT8 bta_gattc_num_reg_app(void);
-extern void bta_gattc_clear_notif_registration(UINT16 conn_id);
+extern void bta_gattc_clear_notif_registration(tBTA_GATTC_SERV *p_srcb, UINT16 conn_id, UINT16 start_handle, UINT16 end_handle);
extern tBTA_GATTC_SERV * bta_gattc_find_srvr_cache(BD_ADDR bda);
-extern BOOLEAN bta_gattc_charid_compare(tBTA_GATTC_CHAR_ID *p_src, tBTA_GATTC_CHAR_ID *p_tar);
-extern BOOLEAN bta_gattc_srvcid_compare(tBTA_GATT_SRVC_ID *p_src, tBTA_GATT_SRVC_ID *p_tar);
-extern void bta_gattc_cpygattid(tBTA_GATT_ID *p_des, tBTA_GATT_ID *p_src);
/* discovery functions */
extern void bta_gattc_disc_res_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_DISC_RES *p_data);
extern tBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, UINT8 disc_type);
extern tBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, UINT8 disc_type);
extern void bta_gattc_search_service(tBTA_GATTC_CLCB *p_clcb, tBT_UUID *p_uuid);
-extern tBTA_GATT_STATUS bta_gattc_query_cache(UINT16 conn_id, UINT8 query_type, tBTA_GATT_SRVC_ID *p_srvc_id,
- tBTA_GATT_ID *p_start_rec,tBT_UUID *p_uuid_cond,
- tBTA_GATT_ID *p_output, void *p_param);
+extern const list_t* bta_gattc_get_services(UINT16 conn_id);
+extern const tBTA_GATTC_SERVICE* bta_gattc_get_service_for_handle(UINT16 conn_id, UINT16 handle);
+tBTA_GATTC_CHARACTERISTIC* bta_gattc_get_characteristic_srcb(tBTA_GATTC_SERV *p_srcb, UINT16 handle);
+extern tBTA_GATTC_CHARACTERISTIC* bta_gattc_get_characteristic(UINT16 conn_id, UINT16 handle);
+extern tBTA_GATTC_DESCRIPTOR* bta_gattc_get_descriptor(UINT16 conn_id, UINT16 handle);
+extern void bta_gattc_get_gatt_db(UINT16 conn_id, UINT16 start_handle, UINT16 end_handle, btgatt_db_element_t **db, int *count);
extern tBTA_GATT_STATUS bta_gattc_init_cache(tBTA_GATTC_SERV *p_srvc_cb);
-extern void bta_gattc_rebuild_cache(tBTA_GATTC_SERV *p_srcv, UINT16 num_attr, tBTA_GATTC_NV_ATTR *p_attr, UINT16 attr_index);
-extern BOOLEAN bta_gattc_cache_save(tBTA_GATTC_SERV *p_srvc_cb, UINT16 conn_id);
-
+extern void bta_gattc_rebuild_cache(tBTA_GATTC_SERV *p_srcv, UINT16 num_attr, tBTA_GATTC_NV_ATTR *attr);
+extern void bta_gattc_cache_save(tBTA_GATTC_SERV *p_srvc_cb, UINT16 conn_id);
+extern void bta_gattc_reset_discover_st(tBTA_GATTC_SERV *p_srcb, tBTA_GATT_STATUS status);
extern tBTA_GATTC_CONN * bta_gattc_conn_alloc(BD_ADDR remote_bda);
extern tBTA_GATTC_CONN * bta_gattc_conn_find(BD_ADDR remote_bda);
extern tBTA_GATTC_CONN * bta_gattc_conn_find_alloc(BD_ADDR remote_bda);
extern BOOLEAN bta_gattc_conn_dealloc(BD_ADDR remote_bda);
+extern bool bta_gattc_cache_load(tBTA_GATTC_CLCB *p_clcb);
+extern void bta_gattc_cache_reset(BD_ADDR server_bda);
+
#endif /* BTA_GATTC_INT_H */