blob: a26fdb695e42875c4b96e6558f49ade7215720d2 [file] [log] [blame]
/******************************************************************************
*
* Copyright 2003-2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
/******************************************************************************
*
* This is the private file for the BTA GATT server.
*
******************************************************************************/
#ifndef BTA_GATTS_INT_H
#define BTA_GATTS_INT_H
#include <cstdint>
#include "bta/include/bta_gatt_api.h"
#include "bta/sys/bta_sys.h"
#include "hardware/bt_gatt_types.h"
#include "internal_include/bt_target.h"
#include "stack/include/bt_hdr.h"
#include "stack/include/btm_ble_api_types.h"
#include "stack/include/gatt_api.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
/*****************************************************************************
* Constants and data types
****************************************************************************/
enum {
BTA_GATTS_API_REG_EVT = BTA_SYS_EVT_START(BTA_ID_GATTS),
BTA_GATTS_INT_START_IF_EVT,
BTA_GATTS_API_DEREG_EVT,
BTA_GATTS_API_INDICATION_EVT,
BTA_GATTS_API_DEL_SRVC_EVT,
BTA_GATTS_API_STOP_SRVC_EVT,
BTA_GATTS_API_RSP_EVT,
BTA_GATTS_API_OPEN_EVT,
BTA_GATTS_API_CANCEL_OPEN_EVT,
BTA_GATTS_API_CLOSE_EVT,
BTA_GATTS_API_DISABLE_EVT,
BTA_GATTS_API_INIT_BONDED_EVT,
};
typedef uint16_t tBTA_GATTS_INT_EVT;
/* max number of application allowed on device */
#define BTA_GATTS_MAX_APP_NUM GATT_MAX_SR_PROFILES
/* max number of services allowed in the device */
#define BTA_GATTS_MAX_SRVC_NUM GATT_MAX_SR_PROFILES
/* internal strucutre for GATTC register API */
typedef struct {
BT_HDR_RIGID hdr;
bluetooth::Uuid app_uuid;
tBTA_GATTS_CBACK* p_cback;
bool eatt_support;
} tBTA_GATTS_API_REG;
typedef struct {
BT_HDR_RIGID hdr;
tGATT_IF server_if;
} tBTA_GATTS_INT_START_IF;
typedef tBTA_GATTS_INT_START_IF tBTA_GATTS_API_DEREG;
typedef struct {
BT_HDR_RIGID hdr;
tGATT_IF server_if;
btgatt_db_element_t* service;
uint16_t count;
} tBTA_GATTS_API_ADD_SERVICE;
typedef struct {
BT_HDR_RIGID hdr;
uint16_t attr_id;
uint16_t len;
bool need_confirm;
uint8_t value[GATT_MAX_ATTR_LEN];
} tBTA_GATTS_API_INDICATION;
typedef struct {
BT_HDR_RIGID hdr;
uint32_t trans_id;
tGATT_STATUS status;
tGATTS_RSP* p_rsp;
} tBTA_GATTS_API_RSP;
typedef struct {
BT_HDR_RIGID hdr;
tBT_TRANSPORT transport;
} tBTA_GATTS_API_START;
typedef struct {
BT_HDR_RIGID hdr;
RawAddress remote_bda;
tGATT_IF server_if;
tBTM_BLE_CONN_TYPE connection_type;
tBT_TRANSPORT transport;
} tBTA_GATTS_API_OPEN;
typedef struct {
BT_HDR_RIGID hdr;
RawAddress remote_bda;
tGATT_IF server_if;
bool is_direct;
tBT_TRANSPORT transport;
} tBTA_GATTS_API_CANCEL_OPEN;
typedef union {
BT_HDR_RIGID hdr;
tBTA_GATTS_API_REG api_reg;
tBTA_GATTS_API_DEREG api_dereg;
tBTA_GATTS_API_ADD_SERVICE api_add_service;
tBTA_GATTS_API_INDICATION api_indicate;
tBTA_GATTS_API_RSP api_rsp;
tBTA_GATTS_API_OPEN api_open;
tBTA_GATTS_API_CANCEL_OPEN api_cancel_open;
tBTA_GATTS_INT_START_IF int_start_if;
} tBTA_GATTS_DATA;
/* application registration control block */
typedef struct {
bool in_use;
bluetooth::Uuid app_uuid;
tBTA_GATTS_CBACK* p_cback;
tGATT_IF gatt_if;
} tBTA_GATTS_RCB;
/* service registration control block */
typedef struct {
bluetooth::Uuid service_uuid; /* service UUID */
uint16_t service_id; /* service start handle */
uint8_t rcb_idx;
uint8_t idx; /* self index of serviec CB */
bool in_use;
} tBTA_GATTS_SRVC_CB;
/* GATT server control block */
typedef struct {
bool enabled;
tBTA_GATTS_RCB rcb[BTA_GATTS_MAX_APP_NUM];
tBTA_GATTS_SRVC_CB srvc_cb[BTA_GATTS_MAX_SRVC_NUM];
} tBTA_GATTS_CB;
/*****************************************************************************
* Global data
****************************************************************************/
/* GATTC control block */
extern tBTA_GATTS_CB bta_gatts_cb;
/*****************************************************************************
* Function prototypes
****************************************************************************/
bool bta_gatts_hdl_event(const BT_HDR_RIGID* p_msg);
void bta_gatts_api_disable(tBTA_GATTS_CB* p_cb);
void bta_gatts_api_enable(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_data);
void bta_gatts_register(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg);
void bta_gatts_start_if(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg);
void bta_gatts_deregister(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg);
void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB* p_srvc_cb,
tBTA_GATTS_DATA* p_msg);
void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB* p_srvc_cb,
tBTA_GATTS_DATA* p_msg);
void bta_gatts_send_rsp(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg);
void bta_gatts_indicate_handle(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg);
void bta_gatts_open(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg);
void bta_gatts_cancel_open(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg);
void bta_gatts_close(tBTA_GATTS_CB* p_cb, tBTA_GATTS_DATA* p_msg);
tBTA_GATTS_RCB* bta_gatts_find_app_rcb_by_app_if(tGATT_IF server_if);
uint8_t bta_gatts_find_app_rcb_idx_by_app_if(tBTA_GATTS_CB* p_cb,
tGATT_IF server_if);
uint8_t bta_gatts_alloc_srvc_cb(tBTA_GATTS_CB* p_cb, uint8_t rcb_idx);
tBTA_GATTS_SRVC_CB* bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB* p_cb,
uint16_t service_id);
tBTA_GATTS_SRVC_CB* bta_gatts_find_srvc_cb_by_attr_id(tBTA_GATTS_CB* p_cb,
uint16_t attr_id);
#endif /* BTA_GATTS_INT_H */