

/******************************************************************************
 *
 *  Copyright (C) 2014 The Android Open Source Project
 *  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.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This is the private interface file for the BTA SDP I/F
 *
 ******************************************************************************/
#ifndef BTA_SDP_INT_H
#define BTA_SDP_INT_H

#include "bta_sys.h"
#include "bta_api.h"
#include "bta_sdp_api.h"

/*****************************************************************************
**  Constants
*****************************************************************************/

enum
{
    /* these events are handled by the state machine */
    BTA_SDP_API_ENABLE_EVT = BTA_SYS_EVT_START(BTA_ID_SDP),
    BTA_SDP_API_SEARCH_EVT,
    BTA_SDP_API_CREATE_RECORD_USER_EVT,
    BTA_SDP_API_REMOVE_RECORD_USER_EVT,
    BTA_SDP_MAX_INT_EVT
};

enum
{
    BTA_SDP_ACTIVE_NONE = 0,
    BTA_SDP_ACTIVE_YES       /* waiting for SDP result */
};



/* data type for BTA_SDP_API_ENABLE_EVT */
typedef struct
{
    BT_HDR             hdr;
    tBTA_SDP_DM_CBACK  *p_cback;
} tBTA_SDP_API_ENABLE;

/* data type for BTA_SDP_API_SEARCH_EVT */
typedef struct
{
    BT_HDR          hdr;
    BD_ADDR         bd_addr;
    tSDP_UUID       uuid;
} tBTA_SDP_API_SEARCH;

/* data type for BTA_SDP_API_SEARCH_EVT */
typedef struct
{
    BT_HDR          hdr;
    void*           user_data;
} tBTA_SDP_API_RECORD_USER;

/* union of all data types */
typedef union
{
    /* GKI event buffer header */
    BT_HDR                                 hdr;
    tBTA_SDP_API_ENABLE                    enable;
    tBTA_SDP_API_SEARCH                    get_search;
    tBTA_SDP_API_RECORD_USER               record;
} tBTA_SDP_MSG;

/* SDP control block */
typedef struct
{
    UINT8              sdp_active;  /* see BTA_SDP_SDP_ACT_* */
    BD_ADDR            remote_addr;
    tBTA_SDP_DM_CBACK  *p_dm_cback;
} tBTA_SDP_CB;


/* SDP control block */
#if BTA_DYNAMIC_MEMORY == FALSE
extern tBTA_SDP_CB bta_sdp_cb;
#else
extern tBTA_SDP_CB *bta_sdp_cb_ptr;
#define bta_sdp_cb (*bta_sdp_cb_ptr)
#endif

/* config struct */
extern tBTA_SDP_CFG *p_bta_sdp_cfg;

extern BOOLEAN bta_sdp_sm_execute(BT_HDR *p_msg);

extern void bta_sdp_enable (tBTA_SDP_MSG *p_data);
extern void bta_sdp_search (tBTA_SDP_MSG *p_data);
extern void bta_sdp_create_record(tBTA_SDP_MSG *p_data);
extern void bta_sdp_remove_record(tBTA_SDP_MSG *p_data);

#endif /* BTA_SDP_INT_H */
