#ifndef CONTEXT_BTE_H
#define CONTEXT_BTE_H

#include "stdint.h"

/* Contains the context of the BTE library that the WPAD library needs to
 * compile.
 *
 * This is not the full context; the other half of the context is in
 * "context_rvl.h".
 *
 * Most of this code is copyright (C) 2003-2012 Broadcom Corporation under the
 * Apache 2.0 License <http://www.apache.org/licenses/LICENSE-2.0>. The original
 * source can be found at
 * <https://android.googlesource.com/platform/external/bluetooth/bluedroid>;
 * specifically, I used the earliest commit available (late 2012, commit hash
 * 5738f83aeb59361a0a2eda2460113f6dc9194271).
 */

/* License redistribution conditions
 *
 * a. You may obtain a copy of the License at
 *    <http://www.apache.org/licenses/LICENSE-2.0>.
 * b. Some of the code is modified. Comments will be marked with my name
 *    (muff1n) to show what I modified and where.
 * c. See the following comment block, which is copied verbatim from bluedroid
 *    source.
 * d. No NOTICE file is present in the commit that I used.
 */

/******************************************************************************
 *
 *  Copyright (C) 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.
 *
 ******************************************************************************/

// from bluedroid source

typedef uint8_t UINT8;
typedef uint16_t UINT16;
typedef uint32_t UINT32;

typedef int8_t INT8;

typedef unsigned char BOOLEAN;

#define BD_ADDR_LEN 6               /* Device address length */
typedef UINT8 BD_ADDR[BD_ADDR_LEN]; /* Device address */
typedef UINT8 *BD_ADDR_PTR;         /* Pointer to Device Address */

#define LINK_KEY_LEN 16
typedef UINT8 LINK_KEY[LINK_KEY_LEN]; /* Link Key */

#define DEV_CLASS_LEN 3
typedef UINT8 DEV_CLASS[DEV_CLASS_LEN]; /* Device class */
typedef UINT8 *DEV_CLASS_PTR;           /* Pointer to Device class */

/* muff1n: TODO: bta_dm_pin_cback looks mostly the same except that BD_NAME_LEN
 * is 33 (or it was 32 and BD_NAME_LEN was not decreased by 1 in BCM_STRNCPY_S
 * calls)?
 * confirm this
 *
 * UPDATE: there is a case where it is 248
 */
#define BD_NAME_LEN 248
typedef UINT8 BD_NAME[BD_NAME_LEN]; /* Device name */
typedef UINT8 *BD_NAME_PTR;         /* Pointer to Device name */

#define BD_FEATURES_LEN 8
typedef UINT8 BD_FEATURES[BD_FEATURES_LEN]; /* LMP features supported by device */

#define BT_DEVICE_TYPE_BREDR 0x01
#define BT_DEVICE_TYPE_BLE 0x02
#define BT_DEVICE_TYPE_DUMO 0x03
typedef UINT8 tBT_DEVICE_TYPE;

/* Maximum UUID size - 16 bytes, and structure to hold any type of UUID. */
#define MAX_UUID_SIZE 16
typedef struct {
#define LEN_UUID_16 2
#define LEN_UUID_32 4
#define LEN_UUID_128 16

    UINT16 len;

    union {
        UINT16 uuid16;
        UINT32 uuid32;
        UINT8 uuid128[MAX_UUID_SIZE];
    } uu;

} tBT_UUID;

/* Status Return Value */
#define BTA_SUCCESS 0 /* Successful operation. */
#define BTA_FAILURE 1 /* Generic failure. */
#define BTA_PENDING 2 /* API cannot be completed right now */
#define BTA_BUSY 3
#define BTA_NO_RESOURCES 4
#define BTA_WRONG_MODE 5

typedef UINT8 tBTA_STATUS;

/*
 * Service ID
 *
 * NOTES: When you add a new Service ID for BTA AND require to change the value of BTA_MAX_SERVICE_ID,
 *        make sure that the correct security ID of the new service from Security service definitions (btm_api.h)
 *        should be added to bta_service_id_to_btm_srv_id_lkup_tbl table in bta_dm_act.c.
 */

#define BTA_RES_SERVICE_ID 0         /* Reserved */
#define BTA_SPP_SERVICE_ID 1         /* Serial port profile. */
#define BTA_DUN_SERVICE_ID 2         /* Dial-up networking profile. */
#define BTA_A2DP_SOURCE_SERVICE_ID 3 /* A2DP Source profile. */
#define BTA_LAP_SERVICE_ID 4         /* LAN access profile. */
#define BTA_HSP_SERVICE_ID 5         /* Headset profile. */
#define BTA_HFP_SERVICE_ID 6         /* Hands-free profile. */
#define BTA_OPP_SERVICE_ID 7         /* Object push  */
#define BTA_FTP_SERVICE_ID 8         /* File transfer */
#define BTA_CTP_SERVICE_ID 9         /* Cordless Terminal */
#define BTA_ICP_SERVICE_ID 10        /* Intercom Terminal */
#define BTA_SYNC_SERVICE_ID 11       /* Synchronization */
#define BTA_BPP_SERVICE_ID 12        /* Basic printing profile */
#define BTA_BIP_SERVICE_ID 13        /* Basic Imaging profile */
#define BTA_PANU_SERVICE_ID 14       /* PAN User */
#define BTA_NAP_SERVICE_ID 15        /* PAN Network access point */
#define BTA_GN_SERVICE_ID 16         /* PAN Group Ad-hoc networks */
#define BTA_SAP_SERVICE_ID 17        /* SIM Access profile */
#define BTA_A2DP_SERVICE_ID 18       /* A2DP Sink */
#define BTA_AVRCP_SERVICE_ID 19      /* A/V remote control */
#define BTA_HID_SERVICE_ID 20        /* HID */
#define BTA_VDP_SERVICE_ID 21        /* Video distribution */
#define BTA_PBAP_SERVICE_ID 22       /* PhoneBook Access Server*/
#define BTA_HSP_HS_SERVICE_ID 23     /* HFP HS role */
#define BTA_HFP_HS_SERVICE_ID 24     /* HSP HS role */
#define BTA_MAP_SERVICE_ID 25        /* Message Access Profile */
#define BTA_MN_SERVICE_ID 26         /* Message Notification Service */
#define BTA_HDP_SERVICE_ID 27        /* Health Device Profile */
#define BTA_PCE_SERVICE_ID 28        /* PhoneBook Access Client*/

#define BTA_USER_SERVICE_ID 29 /* User requested UUID */
#define BTA_MAX_SERVICE_ID 30

/* service IDs (BTM_SEC_SERVICE_FIRST_EMPTY + 1) to (BTM_SEC_MAX_SERVICES - 1)
 * are used by BTA JV */
#define BTA_FIRST_JV_SERVICE_ID (BTM_SEC_SERVICE_FIRST_EMPTY + 1)
#define BTA_LAST_JV_SERVICE_ID (BTM_SEC_MAX_SERVICES - 1)

typedef UINT8 tBTA_SERVICE_ID;

/* Service ID Mask */
#define BTA_RES_SERVICE_MASK 0x00000001    /* Reserved */
#define BTA_SPP_SERVICE_MASK 0x00000002    /* Serial port profile. */
#define BTA_DUN_SERVICE_MASK 0x00000004    /* Dial-up networking profile. */
#define BTA_FAX_SERVICE_MASK 0x00000008    /* Fax profile. */
#define BTA_LAP_SERVICE_MASK 0x00000010    /* LAN access profile. */
#define BTA_HSP_SERVICE_MASK 0x00000020    /* HSP AG role. */
#define BTA_HFP_SERVICE_MASK 0x00000040    /* HFP AG role */
#define BTA_OPP_SERVICE_MASK 0x00000080    /* Object push  */
#define BTA_FTP_SERVICE_MASK 0x00000100    /* File transfer */
#define BTA_CTP_SERVICE_MASK 0x00000200    /* Cordless Terminal */
#define BTA_ICP_SERVICE_MASK 0x00000400    /* Intercom Terminal */
#define BTA_SYNC_SERVICE_MASK 0x00000800   /* Synchronization */
#define BTA_BPP_SERVICE_MASK 0x00001000    /* Print server */
#define BTA_BIP_SERVICE_MASK 0x00002000    /* Basic Imaging */
#define BTA_PANU_SERVICE_MASK 0x00004000   /* PAN User */
#define BTA_NAP_SERVICE_MASK 0x00008000    /* PAN Network access point */
#define BTA_GN_SERVICE_MASK 0x00010000     /* PAN Group Ad-hoc networks */
#define BTA_SAP_SERVICE_MASK 0x00020000    /* PAN Group Ad-hoc networks */
#define BTA_A2DP_SERVICE_MASK 0x00040000   /* Advanced audio distribution */
#define BTA_AVRCP_SERVICE_MASK 0x00080000  /* A/V remote control */
#define BTA_HID_SERVICE_MASK 0x00100000    /* HID */
#define BTA_VDP_SERVICE_MASK 0x00200000    /* Video distribution */
#define BTA_PBAP_SERVICE_MASK 0x00400000   /* Phone Book Server */
#define BTA_HSP_HS_SERVICE_MASK 0x00800000 /* HFP HS role */
#define BTA_HFP_HS_SERVICE_MASK 0x01000000 /* HSP HS role */
#define BTA_MAS_SERVICE_MASK 0x02000000    /* Message Access Profile */
#define BTA_MN_SERVICE_MASK 0x04000000     /* Message Notification Profile */
#define BTA_HL_SERVICE_MASK 0x08000000     /* Health Device Profile */
#define BTA_PCE_SERVICE_MASK 0x10000000    /* Phone Book Client */

// btla-specific ++
#define BTA_USER_SERVICE_MASK 0x20000000 /* Message Notification Profile */
// btla-specific --

#define BTA_ALL_SERVICE_MASK 0x1FFFFFFF /* All services supported by BTA. */

typedef UINT32 tBTA_SERVICE_MASK;

/* SW sub-systems */
#define BTA_ID_SYS 0 /* system manager */
/* BLUETOOTH PART - from 0 to BTA_ID_BLUETOOTH_MAX */
#define BTA_ID_DM 1             /* device manager */
#define BTA_ID_DM_SEARCH 2      /* device manager search */
#define BTA_ID_DM_SEC 3         /* device manager security */
#define BTA_ID_DG 4             /* data gateway */
#define BTA_ID_AG 5             /* audio gateway */
#define BTA_ID_OPC 6            /* object push client */
#define BTA_ID_OPS 7            /* object push server */
#define BTA_ID_FTS 8            /* file transfer server */
#define BTA_ID_CT 9             /* cordless telephony terminal */
#define BTA_ID_FTC 10           /* file transfer client */
#define BTA_ID_SS 11            /* synchronization server */
#define BTA_ID_PR 12            /* Printer client */
#define BTA_ID_BIC 13           /* Basic Imaging Client */
#define BTA_ID_PAN 14           /* Personal Area Networking */
#define BTA_ID_BIS 15           /* Basic Imaging Server */
#define BTA_ID_ACC 16           /* Advanced Camera Client */
#define BTA_ID_SC 17            /* SIM Card Access server */
#define BTA_ID_AV 18            /* Advanced audio/video */
#define BTA_ID_AVK 19           /* Audio/video sink */
#define BTA_ID_HD 20            /* HID Device */
#define BTA_ID_CG 21            /* Cordless Gateway */
#define BTA_ID_BP 22            /* Basic Printing Client */
#define BTA_ID_HH 23            /* Human Interface Device Host */
#define BTA_ID_PBS 24           /* Phone Book Access Server */
#define BTA_ID_PBC 25           /* Phone Book Access Client */
#define BTA_ID_JV 26            /* Java */
#define BTA_ID_HS 27            /* Headset */
#define BTA_ID_MSE 28           /* Message Server Equipment */
#define BTA_ID_MCE 29           /* Message Client Equipment */
#define BTA_ID_HL 30            /* Health Device Profile*/
#define BTA_ID_GATTC 31         /* GATT Client */
#define BTA_ID_GATTS 32         /* GATT Client */
#define BTA_ID_BLUETOOTH_MAX 33 /* last BT profile */

/* FM */
#define BTA_ID_FM 34   /* FM  */
#define BTA_ID_FMTX 35 /* FM TX */

/* SENSOR */
#define BTA_ID_SSR 36 /* Sensor  */

/* GPS */
#define BTA_ID_GPS 37 /* GPS  */

/* GENERIC */
#define BTA_ID_PRM 38
#define BTA_ID_SYSTEM 39 /* platform-specific */
#define BTA_ID_SWRAP 40  /* Insight script wrapper */
#define BTA_ID_MIP 41    /* Multicase Individual Polling */
#define BTA_ID_RT 42     /* Audio Routing module: This module is always on. */

/* JV */
#define BTA_ID_JV1 43 /* JV1 */
#define BTA_ID_JV2 44 /* JV2 */

#define BTA_ID_MAX (43 + BTA_DM_NUM_JV_ID)

typedef UINT8 tBTA_SYS_ID;

enum {
    BTM_SUCCESS = 0,         /* 0  Command succeeded                 */
    BTM_CMD_STARTED,         /* 1  Command started OK.               */
    BTM_BUSY,                /* 2  Device busy with another command  */
    BTM_NO_RESOURCES,        /* 3  No resources to issue command     */
    BTM_MODE_UNSUPPORTED,    /* 4  Request for 1 or more unsupported modes */
    BTM_ILLEGAL_VALUE,       /* 5  Illegal parameter value           */
    BTM_WRONG_MODE,          /* 6  Device in wrong mode for request  */
    BTM_UNKNOWN_ADDR,        /* 7  Unknown remote BD address         */
    BTM_DEVICE_TIMEOUT,      /* 8  Device timeout                    */
    BTM_BAD_VALUE_RET,       /* 9  A bad value was received from HCI */
    BTM_ERR_PROCESSING,      /* 10 Generic error                     */
    BTM_NOT_AUTHORIZED,      /* 11 Authorization failed              */
    BTM_DEV_RESET,           /* 12 Device has been reset             */
    BTM_CMD_STORED,          /* 13 request is stored in control block */
    BTM_ILLEGAL_ACTION,      /* 14 state machine gets illegal command */
    BTM_DELAY_CHECK,         /* 15 delay the check on encryption */
    BTM_SCO_BAD_LENGTH,      /* 16 Bad SCO over HCI data length */
    BTM_SUCCESS_NO_SECURITY, /* 17 security passed, no security set  */
    BTM_FAILED_ON_SECURITY,  /* 18 security failed                   */
    BTM_REPEATED_ATTEMPTS    /* 19 repeated attempts for LE security requests */
};
typedef UINT8 tBTM_STATUS;

typedef struct {
    UINT16 event;
    UINT16 len;
    UINT16 offset;
    UINT16 layer_specific;
} BT_HDR;

#define BT_HDR_SIZE (sizeof(BT_HDR))

/* Security Service Levels [bit mask] (BTM_SetSecurityLevel)
** Encryption should not be used without authentication
*/
#define BTM_SEC_NONE 0x0000             /* Nothing required */
#define BTM_SEC_IN_AUTHORIZE 0x0001     /* Inbound call requires authorization */
#define BTM_SEC_IN_AUTHENTICATE 0x0002  /* Inbound call requires authentication */
#define BTM_SEC_IN_ENCRYPT 0x0004       /* Inbound call requires encryption */
#define BTM_SEC_OUT_AUTHORIZE 0x0008    /* Outbound call requires authorization */
#define BTM_SEC_OUT_AUTHENTICATE 0x0010 /* Outbound call requires authentication */
#define BTM_SEC_OUT_ENCRYPT 0x0020      /* Outbound call requires encryption */
#define BTM_SEC_BOND 0x0040             /* Bonding */
#define BTM_SEC_BOND_CONN 0x0080        /* bond_created_connection */
#define BTM_SEC_FORCE_MASTER 0x0100     /* Need to switch connection to be master */
#define BTM_SEC_ATTEMPT_MASTER 0x0200   /* Try to switch connection to be master */
#define BTM_SEC_FORCE_SLAVE 0x0400      /* Need to switch connection to be master */
#define BTM_SEC_ATTEMPT_SLAVE 0x0800    /* Try to switch connection to be slave */
#define BTM_SEC_IN_MITM 0x1000          /* inbound Do man in the middle protection */
#define BTM_SEC_OUT_MITM 0x2000         /* outbound Do man in the middle protection */

/* Security Setting Mask */
#define BTA_SEC_NONE BTM_SEC_NONE                /* No security. */
#define BTA_SEC_AUTHORIZE (BTM_SEC_IN_AUTHORIZE) /* Authorization required (only needed for out going connection )*/
#define BTA_SEC_AUTHENTICATE (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_OUT_AUTHENTICATE) /* Authentication required. */
#define BTA_SEC_ENCRYPT (BTM_SEC_IN_ENCRYPT | BTM_SEC_OUT_ENCRYPT)                /* Encryption required. */

typedef UINT8 tBTA_SEC;

/* Pairable Modes */
#define BTA_DM_PAIRABLE 1
#define BTA_DM_NON_PAIRABLE 0

/* Connectable Paired Only Mode */
#define BTA_DM_CONN_ALL 0
#define BTA_DM_CONN_PAIRED 1

/* Inquiry modes
 * Note: These modes are associated with the inquiry active values (BTM_*ACTIVE) */
#define BTM_GENERAL_INQUIRY 0
#define BTM_LIMITED_INQUIRY 1
#define BTM_BR_INQUIRY_MASK 0x0f
/* high byte of inquiry mode for BLE inquiry mode */
#define BTM_BLE_INQUIRY_NONE 0x00
#define BTM_BLE_GENERAL_INQUIRY 0x10
#define BTM_BLE_LIMITED_INQUIRY 0x20
#define BTM_BLE_INQUIRY_MASK (BTM_BLE_GENERAL_INQUIRY | BTM_BLE_LIMITED_INQUIRY)

#define BTA_BLE_INQUIRY_NONE BTM_BLE_INQUIRY_NONE
#define BTA_BLE_GENERAL_INQUIRY BTM_BLE_GENERAL_INQUIRY /* Perform LE general inquiry. */
#define BTA_BLE_LIMITED_INQUIRY BTM_BLE_LIMITED_INQUIRY /* Perform LE limited inquiry. */
typedef UINT8 tBTA_DM_INQ_MODE;

/* Inquiry Filter Type */
#define BTA_DM_INQ_CLR BTM_CLR_INQUIRY_FILTER             /* Clear inquiry filter. */
#define BTA_DM_INQ_DEV_CLASS BTM_FILTER_COND_DEVICE_CLASS /* Filter on device class. */
#define BTA_DM_INQ_BD_ADDR BTM_FILTER_COND_BD_ADDR        /* Filter on a specific  BD address. */

typedef UINT8 tBTA_DM_INQ_FILT;

/* Inquiry filter device class condition */
typedef struct {
    DEV_CLASS dev_class;      /* device class of interest */
    DEV_CLASS dev_class_mask; /* mask to determine the bits of device class of interest */
} tBTA_DM_COD_COND;

/* Inquiry Filter Condition */
typedef union {
    BD_ADDR bd_addr;                 /* BD address of  device to filter. */
    tBTA_DM_COD_COND dev_class_cond; /* Device class filter condition */
} tBTA_DM_INQ_COND;

/* Inquiry Parameters */
typedef struct {
    tBTA_DM_INQ_MODE mode;        /* Inquiry mode, limited or general. */
    UINT8 duration;               /* Inquiry duration in 1.28 sec units. */
    UINT8 max_resps;              /* Maximum inquiry responses.  Set to zero for unlimited responses. */
    BOOLEAN report_dup;           /* report duplicated inquiry response with higher RSSI value */
    tBTA_DM_INQ_FILT filter_type; /* Filter condition type. */
    tBTA_DM_INQ_COND filter_cond; /* Filter condition data. */
} tBTA_DM_INQ;

/* Security Callback Events */
#define BTA_DM_ENABLE_EVT 0             /* Enable Event */
#define BTA_DM_DISABLE_EVT 1            /* Disable Event */
#define BTA_DM_PIN_REQ_EVT 2            /* PIN request. */
#define BTA_DM_AUTH_CMPL_EVT 3          /* Authentication complete indication. */
#define BTA_DM_AUTHORIZE_EVT 4          /* Authorization request. */
#define BTA_DM_LINK_UP_EVT 5            /* Connection UP event */
#define BTA_DM_LINK_DOWN_EVT 6          /* Connection DOWN event */
#define BTA_DM_SIG_STRENGTH_EVT 7       /* Signal strength for bluetooth connection */
#define BTA_DM_BUSY_LEVEL_EVT 8         /* System busy level */
#define BTA_DM_BOND_CANCEL_CMPL_EVT 9   /* Bond cancel complete indication */
#define BTA_DM_SP_CFM_REQ_EVT 10        /* Simple Pairing User Confirmation request. */
#define BTA_DM_SP_KEY_NOTIF_EVT 11      /* Simple Pairing Passkey Notification */
#define BTA_DM_SP_RMT_OOB_EVT 12        /* Simple Pairing Remote OOB Data request. */
#define BTA_DM_SP_KEYPRESS_EVT 13       /* Key press notification event. */
#define BTA_DM_ROLE_CHG_EVT 14          /* Role Change event. */
#define BTA_DM_BLE_KEY_EVT 15           /* BLE SMP key event for peer device keys */
#define BTA_DM_BLE_SEC_REQ_EVT 16       /* BLE SMP security request */
#define BTA_DM_BLE_PASSKEY_NOTIF_EVT 17 /* SMP passkey notification event */
#define BTA_DM_BLE_PASSKEY_REQ_EVT 18   /* SMP passkey request event */
#define BTA_DM_BLE_OOB_REQ_EVT 19       /* SMP OOB request event */
#define BTA_DM_BLE_LOCAL_IR_EVT 20      /* BLE local IR event */
#define BTA_DM_BLE_LOCAL_ER_EVT 21      /* BLE local ER event */
// btla-specific ++
#define BTA_DM_BLE_AUTH_CMPL_EVT 22 /* BLE Auth complete */
// btla-specific --
#define BTA_DM_DEV_UNPAIRED_EVT 23
#define BTA_DM_HW_ERROR_EVT 24 /* BT Chip H/W error */
typedef UINT8 tBTA_DM_SEC_EVT;

/* Structure associated with BTA_DM_ENABLE_EVT */
typedef struct {
    BD_ADDR bd_addr; /* BD address of local device. */
    tBTA_STATUS status;
} tBTA_DM_ENABLE;

/* Structure associated with BTA_DM_PIN_REQ_EVT */
typedef struct {
    BD_ADDR bd_addr;     /* BD address peer device. */
    BD_NAME bd_name;     /* Name of peer device. */
    DEV_CLASS dev_class; /* Class of Device */
} tBTA_DM_PIN_REQ;

/* Link Key Notification Event (Key Type) definitions */
#define HCI_LKEY_TYPE_COMBINATION 0x00
#define HCI_LKEY_TYPE_LOCAL_UNIT 0x01
#define HCI_LKEY_TYPE_REMOTE_UNIT 0x02
#define HCI_LKEY_TYPE_DEBUG_COMB 0x03
#define HCI_LKEY_TYPE_UNAUTH_COMB 0x04
#define HCI_LKEY_TYPE_AUTH_COMB 0x05
#define HCI_LKEY_TYPE_CHANGED_COMB 0x06

/* Structure associated with BTA_DM_AUTH_CMPL_EVT */
typedef struct {
    BD_ADDR bd_addr;     /* BD address peer device. */
    BD_NAME bd_name;     /* Name of peer device. */
    BOOLEAN key_present; /* Valid link key value in key element */
    LINK_KEY key;        /* Link key associated with peer device. */
    UINT8 key_type;      /* The type of Link Key */
    BOOLEAN success;     /* TRUE of authentication succeeded, FALSE if failed. */
    UINT8 fail_reason;   /* The HCI reason/error code for when success=FALSE */
} tBTA_DM_AUTH_CMPL;

/* Structure associated with BTA_DM_AUTHORIZE_EVT */
typedef struct {
    BD_ADDR bd_addr;         /* BD address peer device. */
    BD_NAME bd_name;         /* Name of peer device. */
    tBTA_SERVICE_ID service; /* Service ID to authorize. */
                             // btla-specific ++
    DEV_CLASS dev_class;
    // btla-specific --
} tBTA_DM_AUTHORIZE;

/* Structure associated with BTA_DM_LINK_UP_EVT */
typedef struct {
    BD_ADDR bd_addr; /* BD address peer device. */
} tBTA_DM_LINK_UP;

/*
**  Defentions for HCI Error Codes that are past in the events
*/
#define HCI_SUCCESS 0x00
#define HCI_PENDING 0x00
#define HCI_ERR_ILLEGAL_COMMAND 0x01
#define HCI_ERR_NO_CONNECTION 0x02
#define HCI_ERR_HW_FAILURE 0x03
#define HCI_ERR_PAGE_TIMEOUT 0x04
#define HCI_ERR_AUTH_FAILURE 0x05
#define HCI_ERR_KEY_MISSING 0x06
#define HCI_ERR_MEMORY_FULL 0x07
#define HCI_ERR_CONNECTION_TOUT 0x08
#define HCI_ERR_MAX_NUM_OF_CONNECTIONS 0x09
#define HCI_ERR_MAX_NUM_OF_SCOS 0x0A
#define HCI_ERR_CONNECTION_EXISTS 0x0B
#define HCI_ERR_COMMAND_DISALLOWED 0x0C
#define HCI_ERR_HOST_REJECT_RESOURCES 0x0D
#define HCI_ERR_HOST_REJECT_SECURITY 0x0E
#define HCI_ERR_HOST_REJECT_DEVICE 0x0F
#define HCI_ERR_HOST_TIMEOUT 0x10
#define HCI_ERR_UNSUPPORTED_VALUE 0x11
#define HCI_ERR_ILLEGAL_PARAMETER_FMT 0x12
#define HCI_ERR_PEER_USER 0x13
#define HCI_ERR_PEER_LOW_RESOURCES 0x14
#define HCI_ERR_PEER_POWER_OFF 0x15
#define HCI_ERR_CONN_CAUSE_LOCAL_HOST 0x16
#define HCI_ERR_REPEATED_ATTEMPTS 0x17
#define HCI_ERR_PAIRING_NOT_ALLOWED 0x18
#define HCI_ERR_UNKNOWN_LMP_PDU 0x19
#define HCI_ERR_UNSUPPORTED_REM_FEATURE 0x1A
#define HCI_ERR_SCO_OFFSET_REJECTED 0x1B
#define HCI_ERR_SCO_INTERVAL_REJECTED 0x1C
#define HCI_ERR_SCO_AIR_MODE 0x1D
#define HCI_ERR_INVALID_LMP_PARAM 0x1E
#define HCI_ERR_UNSPECIFIED 0x1F
#define HCI_ERR_UNSUPPORTED_LMP_FEATURE 0x20
#define HCI_ERR_ROLE_CHANGE_NOT_ALLOWED 0x21
#define HCI_ERR_LMP_RESPONSE_TIMEOUT 0x22
#define HCI_ERR_LMP_ERR_TRANS_COLLISION 0x23
#define HCI_ERR_LMP_PDU_NOT_ALLOWED 0x24
#define HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE 0x25
#define HCI_ERR_UNIT_KEY_USED 0x26
#define HCI_ERR_QOS_NOT_SUPPORTED 0x27
#define HCI_ERR_INSTANT_PASSED 0x28
#define HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29
#define HCI_ERR_DIFF_TRANSACTION_COLLISION 0x2A
#define HCI_ERR_UNDEFINED_0x2B 0x2B
#define HCI_ERR_QOS_UNACCEPTABLE_PARAM 0x2C
#define HCI_ERR_QOS_REJECTED 0x2D
#define HCI_ERR_CHAN_CLASSIF_NOT_SUPPORTED 0x2E
#define HCI_ERR_INSUFFCIENT_SECURITY 0x2F
#define HCI_ERR_PARAM_OUT_OF_RANGE 0x30
#define HCI_ERR_UNDEFINED_0x31 0x31
#define HCI_ERR_ROLE_SWITCH_PENDING 0x32
#define HCI_ERR_UNDEFINED_0x33 0x33
#define HCI_ERR_RESERVED_SLOT_VIOLATION 0x34
#define HCI_ERR_ROLE_SWITCH_FAILED 0x35
#define HCI_ERR_INQ_RSP_DATA_TOO_LARGE 0x36
#define HCI_ERR_SIMPLE_PAIRING_NOT_SUPPORTED 0x37
#define HCI_ERR_HOST_BUSY_PAIRING 0x38
#define HCI_ERR_REJ_NO_SUITABLE_CHANNEL 0x39
#define HCI_ERR_CONTROLLER_BUSY 0x3A
#define HCI_ERR_UNACCEPT_CONN_INTERVAL 0x3B
#define HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT 0x3C
#define HCI_ERR_CONN_TOUT_DUE_TO_MIC_FAILURE 0x3D
#define HCI_ERR_CONN_FAILED_ESTABLISHMENT 0x3E
#define HCI_ERR_MAC_CONNECTION_FAILED 0x3F

#define HCI_ERR_MAX_ERR 0x40

#define HCI_HINT_TO_RECREATE_AMP_PHYS_LINK 0xFF

/* Structure associated with BTA_DM_LINK_DOWN_EVT */
typedef struct {
    BD_ADDR bd_addr; /* BD address peer device. */
    UINT8 status;    /* connection open/closed */
} tBTA_DM_LINK_DOWN;

typedef INT8 tBTA_DM_RSSI_VALUE;
typedef UINT8 tBTA_DM_LINK_QUALITY_VALUE;

/* signal strength mask */
#define BTA_SIG_STRENGTH_RSSI_MASK 1
#define BTA_SIG_STRENGTH_LINK_QUALITY_MASK 2

typedef UINT8 tBTA_SIG_STRENGTH_MASK;

/* Structure associated with BTA_DM_SIG_STRENGTH_EVT */
typedef struct {
    BD_ADDR bd_addr;             /* BD address peer device. */
    tBTA_SIG_STRENGTH_MASK mask; /* mask for the values that are valid */
    tBTA_DM_RSSI_VALUE rssi_value;
    tBTA_DM_LINK_QUALITY_VALUE link_quality_value;

} tBTA_DM_SIG_STRENGTH;

/* Structure associated with BTA_DM_BUSY_LEVEL_EVT */
typedef struct {
    UINT8 level; /* when paging or inquiring, level is 10.
                      Otherwise, the number of ACL links */
} tBTA_DM_BUSY_LEVEL;

// muff1n: only filled with used members
typedef union {
    tBTA_DM_ENABLE enable;             /* BTA enabled */
    tBTA_DM_PIN_REQ pin_req;           /* PIN request */
    tBTA_DM_AUTH_CMPL auth_cmpl;       /* Authentication complete indication */
    tBTA_DM_AUTHORIZE authorize;       /* Authorization request */
    tBTA_DM_LINK_UP link_up;           /* ACL connection up event */
    tBTA_DM_LINK_DOWN link_down;       /* ACL connection down event */
    tBTA_DM_SIG_STRENGTH sig_strength; /* rssi and link quality value */
    tBTA_DM_BUSY_LEVEL busy_level;     /* System busy level */
} tBTA_DM_SEC;

typedef void(tBTA_DM_SEC_CBACK)(tBTA_DM_SEC_EVT event, tBTA_DM_SEC *p_data);

/* Search callback events */
#define BTA_DM_INQ_RES_EVT 0            /* Inquiry result for a peer device. */
#define BTA_DM_INQ_CMPL_EVT 1           /* Inquiry complete. */
#define BTA_DM_DISC_RES_EVT 2           /* Discovery result for a peer device. */
#define BTA_DM_DISC_BLE_RES_EVT 3       /* Discovery result for BLE GATT based service on a peer device. */
#define BTA_DM_DISC_CMPL_EVT 4          /* Discovery complete. */
#define BTA_DM_DI_DISC_CMPL_EVT 5       /* Discovery complete. */
#define BTA_DM_SEARCH_CANCEL_CMPL_EVT 6 /* Search cancelled */

typedef UINT8 tBTA_DM_SEARCH_EVT;

#define BTA_DM_INQ_RES_IGNORE_RSSI BTM_INQ_RES_IGNORE_RSSI /* 0x7f RSSI value not supplied (ignore it) */

// muff1n: commented some fields out
/* Structure associated with BTA_DM_INQ_RES_EVT */
typedef struct {
    BD_ADDR bd_addr;     /* BD address peer device. */
    DEV_CLASS dev_class; /* Device class of peer device. */
    // BOOLEAN         remt_name_not_required; /* Application sets this flag if it already knows the name of the device
    // */
    /* If the device name is known to application BTA skips the remote name request */
    // BOOLEAN         is_limited;             /* TRUE, if the limited inquiry bit is set in the CoD */
    INT8 rssi;    /* The rssi value */
    UINT8 *p_eir; /* received EIR */
} tBTA_DM_INQ_RES;

/* Structure associated with BTA_DM_INQ_CMPL_EVT */
typedef struct {
    UINT8 num_resps; /* Number of inquiry responses. */
} tBTA_DM_INQ_CMPL;

/* Structure associated with BTA_DM_DI_DISC_CMPL_EVT */
typedef struct {
    BD_ADDR bd_addr;  /* BD address peer device. */
    UINT8 num_record; /* Number of DI record */
    tBTA_STATUS result;
} tBTA_DM_DI_DISC_CMPL;

/* Structure associated with BTA_DM_DISC_RES_EVT */
typedef struct {
    BD_ADDR bd_addr;             /* BD address peer device. */
    BD_NAME bd_name;             /* Name of peer device. */
    tBTA_SERVICE_MASK services;  /* Services found on peer device. */
                                 // btla-specific ++
    UINT8 *p_raw_data;           /* Raw data for discovery DB */
    UINT32 raw_data_size;        /* size of raw data */
    tBT_DEVICE_TYPE device_type; /* device type in case it is BLE device */
    UINT32 num_uuids;
    UINT8 *p_uuid_list;
    // btla-specific --
    tBTA_STATUS result;
} tBTA_DM_DISC_RES;

/* Structure associated with tBTA_DM_DISC_BLE_RES */
typedef struct {
    BD_ADDR bd_addr;  /* BD address peer device. */
    BD_NAME bd_name;  /* Name of peer device. */
    tBT_UUID service; /* GATT based Services UUID found on peer device. */
} tBTA_DM_DISC_BLE_RES;

/* Union of all search callback structures */
typedef union {
    tBTA_DM_INQ_RES inq_res;           /* Inquiry result for a peer device. */
    tBTA_DM_INQ_CMPL inq_cmpl;         /* Inquiry complete. */
    tBTA_DM_DISC_RES disc_res;         /* Discovery result for a peer device. */
    tBTA_DM_DISC_BLE_RES disc_ble_res; /* discovery result for GATT based service */
    tBTA_DM_DI_DISC_CMPL di_disc;      /* DI discovery result for a peer device */
} tBTA_DM_SEARCH;

/* Search callback */
typedef void(tBTA_DM_SEARCH_CBACK)(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data);

/* type of protocol mode */
#define BTA_HH_PROTO_RPT_MODE (0x00)
#define BTA_HH_PROTO_BOOT_MODE (0x01)
#define BTA_HH_PROTO_UNKNOWN (0xff)
typedef UINT8 tBTA_HH_PROTO_MODE;

/* BTA HID Host callback events */
#define BTA_HH_ENABLE_EVT 0     /* HH enabled */
#define BTA_HH_DISABLE_EVT 1    /* HH disabled */
#define BTA_HH_OPEN_EVT 2       /* connection opened */
#define BTA_HH_CLOSE_EVT 3      /* connection closed */
#define BTA_HH_GET_RPT_EVT 4    /* BTA_HhGetReport callback */
#define BTA_HH_SET_RPT_EVT 5    /* BTA_HhSetReport callback */
#define BTA_HH_GET_PROTO_EVT 6  /* BTA_GetProtoMode callback */
#define BTA_HH_SET_PROTO_EVT 7  /* BTA_HhSetProtoMode callback */
#define BTA_HH_GET_IDLE_EVT 8   /* BTA_HhGetIdle comes callback */
#define BTA_HH_SET_IDLE_EVT 9   /* BTA_HhSetIdle finish callback */
#define BTA_HH_GET_DSCP_EVT 10  /* Get report descripotor */
#define BTA_HH_ADD_DEV_EVT 11   /* Add Device callback */
#define BTA_HH_RMV_DEV_EVT 12   /* remove device finished */
#define BTA_HH_VC_UNPLUG_EVT 13 /* virtually unplugged */
#define BTA_HH_UPDATE_UCD_EVT 14
#define BTA_HH_API_ERR_EVT 15 /* API error is caught */

typedef UINT16 tBTA_HH_EVT;

enum {
    BTA_HH_OK,
    BTA_HH_HS_HID_NOT_READY,  /* handshake error : device not ready */
    BTA_HH_HS_INVALID_RPT_ID, /* handshake error : invalid report ID */
    BTA_HH_HS_TRANS_NOT_SPT,  /* handshake error : transaction not spt */
    BTA_HH_HS_INVALID_PARAM,  /* handshake error : invalid paremter */
    BTA_HH_HS_ERROR,          /* handshake error : unspecified HS error */
    BTA_HH_ERR,               /* general BTA HH error */
    BTA_HH_ERR_SDP,           /* SDP error */
    BTA_HH_ERR_PROTO,         /* SET_Protocol error,
                                  only used in BTA_HH_OPEN_EVT callback */
    BTA_HH_ERR_DB_FULL,       /* device database full error, used in
                                 BTA_HH_OPEN_EVT/BTA_HH_ADD_DEV_EVT */
    BTA_HH_ERR_TOD_UNSPT,     /* type of device not supported */
    BTA_HH_ERR_NO_RES,        /* out of system resources */
    BTA_HH_ERR_AUTH_FAILED,   /* authentication fail */
    BTA_HH_ERR_HDL
};
typedef UINT8 tBTA_HH_STATUS;

/* callback event data for BTA_HH_OPEN_EVT */
typedef struct {
    BD_ADDR bda;           /* HID device bd address    */
    tBTA_HH_STATUS status; /* operation status         */
    UINT8 handle;          /* device handle            */
} tBTA_HH_CONN;

typedef tBTA_HH_CONN tBTA_HH_DEV_INFO;

/* callback event data */
typedef struct {
    tBTA_HH_STATUS status; /* operation status         */
    UINT8 handle;          /* device handle            */
} tBTA_HH_CBDATA;

// muff1n: only filled with used members
typedef union {
    tBTA_HH_DEV_INFO dev_info; /* BTA_HH_ADD_DEV_EVT, BTA_HH_RMV_DEV_EVT   */
    tBTA_HH_CONN conn;         /* BTA_HH_OPEN_EVT      */
    tBTA_HH_CBDATA dev_status; /* BTA_HH_CLOSE_EVT,
                                  BTA_HH_SET_PROTO_EVT
                                  BTA_HH_SET_RPT_EVT
                                  BTA_HH_SET_IDLE_EVT  */
} tBTA_HH;

/* BTA HH callback function */
typedef void(tBTA_HH_CBACK)(tBTA_HH_EVT event, tBTA_HH *p_data);

/* General callback function for notifying an application that a synchronous
** BTM function is complete. The pointer contains the address of any returned data.
*/
typedef void(tBTM_CMPL_CB)(void *p1);
/* Structure returned with local version information */

typedef struct {
    UINT8 hci_version;
    UINT16 hci_revision;
    UINT8 lmp_version;
    UINT16 manufacturer;
    UINT16 lmp_subversion;
} tBTM_VERSION_INFO;

/* Structure returned with Vendor Specific Command complete callback */
typedef struct {
    UINT16 opcode;
    UINT16 param_len;
    UINT8 *p_param_buf;
} tBTM_VSC_CMPL;

#define BTM_VSC_CMPL_DATA_SIZE (BTM_MAX_VENDOR_SPECIFIC_LEN + sizeof(tBTM_VSC_CMPL))
/* Callback function for when device status changes. Appl must poll for
** what the new state is (BTM_IsDeviceUp). The event occurs whenever the stack
** has detected that the controller status has changed. This asynchronous event
** is enabled/disabled by calling BTM_RegisterForDeviceStatusNotif().
*/
enum {
    BTM_DEV_STATUS_UP,
    BTM_DEV_STATUS_DOWN,
    BTM_DEV_STATUS_CMD_TOUT
};
typedef UINT8 tBTM_DEV_STATUS;

typedef void(tBTM_DEV_STATUS_CB)(tBTM_DEV_STATUS status);

/* Callback function for when a vendor specific event occurs. The length and
** array of returned parameter bytes are included. This asynchronous event
** is enabled/disabled by calling BTM_RegisterForVSEvents().
*/
typedef void(tBTM_VS_EVT_CB)(UINT8 len, UINT8 *p);

/* VSC callback function for notifying an application that a synchronous
** BTM function is complete. The pointer contains the address of any returned data.
*/
typedef void(tBTM_VSC_CMPL_CB)(tBTM_VSC_CMPL *p1);

/* Attributes mask values to be used in HID_HostAddDev API */
#define HID_VIRTUAL_CABLE 0x0001
#define HID_NORMALLY_CONNECTABLE 0x0002
#define HID_RECONN_INIT 0x0004
#define HID_SDP_DISABLE 0x0008
#define HID_BATTERY_POWER 0x0010
#define HID_REMOTE_WAKE 0x0020
#define HID_SUP_TOUT_AVLBL 0x0040
#define HID_SSR_MAX_LATENCY 0x0080
#define HID_SSR_MIN_TOUT 0x0100

#define HID_SEC_REQUIRED 0x8000

#define BTA_HH_VIRTUAL_CABLE HID_VIRTUAL_CABLE
#define BTA_HH_NORMALLY_CONNECTABLE HID_NORMALLY_CONNECTABLE
#define BTA_HH_RECONN_INIT HID_RECONN_INIT
#define BTA_HH_SDP_DISABLE HID_SDP_DISABLE
#define BTA_HH_BATTERY_POWER HID_BATTERY_POWER
#define BTA_HH_REMOTE_WAKE HID_REMOTE_WAKE
#define BTA_HH_SUP_TOUT_AVLBL HID_SUP_TOUT_AVLBL
#define BTA_HH_SEC_REQUIRED HID_SEC_REQUIRED
typedef UINT16 tBTA_HH_ATTR_MASK;

typedef struct desc_info {
    UINT16 dl_len;
    UINT8 *dsc_list;
} tHID_DEV_DSCP_INFO;

typedef tHID_DEV_DSCP_INFO tBTA_HH_DEV_DESCR;

/* Policy settings status */
#define HCI_DISABLE_ALL_LM_MODES 0x0000
#define HCI_ENABLE_MASTER_SLAVE_SWITCH 0x0001
#define HCI_ENABLE_HOLD_MODE 0x0002
#define HCI_ENABLE_SNIFF_MODE 0x0004
#define HCI_ENABLE_PARK_MODE 0x0008

/* HCI mode defenitions */
#define HCI_MODE_ACTIVE 0x00
#define HCI_MODE_HOLD 0x01
#define HCI_MODE_SNIFF 0x02
#define HCI_MODE_PARK 0x03

/* BTM Power manager status codes */
enum {
    BTM_PM_STS_ACTIVE = HCI_MODE_ACTIVE,
    BTM_PM_STS_HOLD = HCI_MODE_HOLD,
    BTM_PM_STS_SNIFF = HCI_MODE_SNIFF,
    BTM_PM_STS_PARK = HCI_MODE_PARK,
    BTM_PM_STS_SSR,     /* report the SSR parameters in HCI_SNIFF_SUB_RATE_EVT */
    BTM_PM_STS_PENDING, /* when waiting for status from controller */
    BTM_PM_STS_ERROR    /* when HCI command status returns error */
};
typedef UINT8 tBTM_PM_STATUS;

/* BTM Power manager modes */

enum {
    BTM_PM_MD_ACTIVE = BTM_PM_STS_ACTIVE,
    BTM_PM_MD_HOLD = BTM_PM_STS_HOLD,
    BTM_PM_MD_SNIFF = BTM_PM_STS_SNIFF,
    BTM_PM_MD_PARK = BTM_PM_STS_PARK,
    BTM_PM_MD_FORCE = 0x10 /* OR this to force ACL link to a certain mode */
};
typedef UINT8 tBTM_PM_MODE;

#define BTM_PM_SET_ONLY_ID 0x80

/* Operation codes */
#define BTM_PM_REG_SET 1   /* The module wants to set the desired power mode */
#define BTM_PM_REG_NOTIF 2 /* The module wants to receive mode change event */
#define BTM_PM_DEREG 4     /* The module does not want to involve with PM anymore */

typedef struct {
    UINT16 max;
    UINT16 min;
    UINT16 attempt;
    UINT16 timeout;
    tBTM_PM_MODE mode;
} tBTM_PM_PWR_MD;

/*************************************
**  Power Manager Callback Functions
**************************************/
typedef void(tBTM_PM_STATUS_CBACK)(BD_ADDR p_bda, tBTM_PM_STATUS status, UINT16 value, UINT8 hci_status);

/************************
**  Stored Linkkey Types
*************************/
#define BTM_CB_EVT_RETURN_LINK_KEYS 1
#define BTM_CB_EVT_READ_STORED_LINK_KEYS 2
#define BTM_CB_EVT_WRITE_STORED_LINK_KEYS 3
#define BTM_CB_EVT_DELETE_STORED_LINK_KEYS 4

typedef struct {
    UINT8 event;

} tBTM_STORED_LINK_KEYS_EVT;

typedef struct {
    UINT8 event;
    UINT8 num_keys;

} tBTM_RETURN_LINK_KEYS_EVT;

typedef struct {
    BD_ADDR bd_addr;
    LINK_KEY link_key;

} tBTM_BD_ADDR_LINK_KEY_PAIR;

typedef struct {
    UINT8 event;
    UINT8 status;
    UINT16 max_keys;
    UINT16 read_keys;

} tBTM_READ_STORED_LINK_KEY_COMPLETE;

typedef struct {
    UINT8 event;
    UINT8 status;
    UINT8 num_keys;

} tBTM_WRITE_STORED_LINK_KEY_COMPLETE;

typedef struct {
    UINT8 event;
    UINT8 status;
    UINT16 num_keys;

} tBTM_DELETE_STORED_LINK_KEY_COMPLETE;

// ---

tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback);
tBTA_STATUS BTA_DisableBluetooth(void);

// muff1n: most changed prototype so far
tBTA_STATUS BTA_DmAddDevice(BD_ADDR bd_addr, LINK_KEY link_key, tBTA_SERVICE_MASK trusted_mask, BOOLEAN is_trusted);
tBTA_STATUS BTA_DmRemoveDevice(BD_ADDR bd_addr);
void BTA_DmSearch(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK services, tBTA_DM_SEARCH_CBACK *p_cback);
void BTA_DmSearchCancel(void);
void BTA_DmPinReply(BD_ADDR bd_addr, BOOLEAN accept, UINT8 pin_len, UINT8 *p_pin);
BOOLEAN BTA_DmIsDeviceUp(void);
void BTA_DmSetDeviceName(char *p_name);

// muff1n: disc_mode and conn_mode might be the , based on usage
void BTA_DmSetVisibility(UINT8, UINT8);

// muff1n: ucd_enabled might be the missing parameter
void BTA_HhEnable(tBTA_SEC sec_mask, tBTA_HH_CBACK *p_cback);
// muff1n: possibly takes just a tBTA_HH_DEV_DESCR in this version? i wrote it like that
void BTA_HhAddDev(BD_ADDR bda, tBTA_HH_ATTR_MASK attr_mask, UINT8 sub_class, UINT8 app_id, tBTA_HH_DEV_DESCR descr);
void BTA_HhRemoveDev(UINT8 dev_handle);
void BTA_HhOpen(BD_ADDR dev_bda, tBTA_HH_PROTO_MODE mode, tBTA_SEC sec_mask);
void BTA_HhClose(UINT8 dev_handle);

// muff1n: dev_bda is likely the missing parameter, as it is not used
void BTA_HhSendData(UINT8 dev_handle, BT_HDR *p_data);

void bta_sys_set_trace_level(UINT8 level);

void BTM_DeviceReset(tBTM_CMPL_CB *p_cb);

tBTM_STATUS BTM_ReadStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb);
tBTM_STATUS BTM_WriteStoredLinkKey(UINT8 num_keys, BD_ADDR *bd_addr, LINK_KEY *link_key, tBTM_CMPL_CB *p_cb);
tBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb);

tBTM_STATUS BTM_SetPowerMode(UINT8 pm_id, BD_ADDR remote_bda, tBTM_PM_PWR_MD *p_mode);
tBTM_STATUS BTM_SetAfhChannels(UINT8 first, UINT8 last);

tBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, UINT8 param_len, UINT8 *p_param_buf, tBTM_VSC_CMPL_CB *p_cb);

tBTM_STATUS BTM_ReadLocalVersion(tBTM_VERSION_INFO *p_vers);
tBTM_STATUS BTM_SetDeviceClass(DEV_CLASS dev_class);

tBTM_STATUS btm_remove_acl(BD_ADDR bd_addr);

// muff1n: is_register is probably the missing parameter here
tBTM_STATUS BTM_RegisterForVSEvents(tBTM_VS_EVT_CB *p_cb);
tBTM_DEV_STATUS_CB *BTM_RegisterForDeviceStatusNotif(tBTM_DEV_STATUS_CB *p_cb);

tBTM_STATUS BTM_PmRegister(UINT8 mask, UINT8 *p_pm_id, tBTM_PM_STATUS_CBACK *p_cb);
tBTM_STATUS BTM_WritePageTimeout(UINT16 timeout);
void BTM_SetDefaultLinkPolicy(UINT16 settings);
void BTM_SetDefaultLinkSuperTout(UINT16 timeout);

BOOLEAN BTM_SecAddDevice(
    BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, BD_FEATURES features, UINT32 trusted_mask[],
    LINK_KEY link_key
);

void *GKI_getbuf(UINT16 size);

UINT8 L2CA_SetTraceLevel(UINT8 trace_level);

UINT8 SDP_SetTraceLevel(UINT8 new_level);

/* muff1n: not in bluedroid source; might be older removed API functions */
void BTA_DmSendHciReset(void);
void BTA_HhGetAclQueueInfo(void);
void BTA_Init(void);
void BTA_CleanUp(void (*p_cb)(tBTA_STATUS status)); // probably

// ---
/* muff1n: I wrote this definition myself
 * TODO: would this be part of BLE or WUD?
 */

struct small_dev_info {
    char devName[20]; // size 0x14? offset 0x00 // might be 0x13?
    char at_0x14[1];  // size 0x??, offset 0x14?
    char __pad0[0x20 - (0x14 + 0x01)];
    LINK_KEY linkKey; // size 0x10, offset 0x20
    char __pad1[0x10];
}; // size 0x40

#endif // CONTEXT_BTE_H
