/*
* Copyright 2023 The Android Open Source Project
*
* 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.
*/
#pragma once
#include
#include
#include
#include
#include "bta/include/bta_api.h"
#include "bta/sys/bta_sys.h"
#include "macros.h"
#include "stack/include/sdp_status.h"
#include "stack/sdp/sdp_discovery_db.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
#define BTA_SERVICE_ID_TO_SERVICE_MASK(id) (1 << (id))
typedef enum : uint16_t {
/* service discovery events */
BTA_DM_API_DISCOVER_EVT,
BTA_DM_SDP_RESULT_EVT,
BTA_DM_DISCOVERY_RESULT_EVT,
BTA_DM_DISC_CLOSE_TOUT_EVT,
} tBTA_DM_DISC_EVT;
inline std::string bta_dm_event_text(const tBTA_DM_DISC_EVT& event) {
switch (event) {
CASE_RETURN_TEXT(BTA_DM_API_DISCOVER_EVT);
CASE_RETURN_TEXT(BTA_DM_SDP_RESULT_EVT);
CASE_RETURN_TEXT(BTA_DM_DISCOVERY_RESULT_EVT);
CASE_RETURN_TEXT(BTA_DM_DISC_CLOSE_TOUT_EVT);
}
}
/* data type for BTA_DM_API_DISCOVER_EVT */
typedef struct {
RawAddress bd_addr;
service_discovery_callbacks cbacks;
tBT_TRANSPORT transport;
} tBTA_DM_API_DISCOVER;
typedef struct {
RawAddress bd_addr; /* BD address peer device. */
bool is_gatt_over_ble;
std::vector uuids;
std::vector gatt_uuids;
tBTA_STATUS result;
tHCI_STATUS hci_status;
} tBTA_DM_SVC_RES;
using tBTA_DM_MSG = std::variant;
typedef enum {
BTA_DM_DISCOVER_IDLE,
BTA_DM_DISCOVER_ACTIVE
} tBTA_DM_SERVICE_DISCOVERY_STATE;
inline std::string bta_dm_state_text(
const tBTA_DM_SERVICE_DISCOVERY_STATE& state) {
switch (state) {
CASE_RETURN_TEXT(BTA_DM_DISCOVER_IDLE);
CASE_RETURN_TEXT(BTA_DM_DISCOVER_ACTIVE);
}
}
#define MAX_DISC_RAW_DATA_BUF (4096)
typedef struct {
RawAddress bd_addr;
tBTA_SERVICE_MASK services_to_search;
tBTA_SERVICE_MASK services_found;
uint8_t service_index;
uint8_t peer_scn;
std::array g_disc_raw_data_buf;
/* sdp_db must be together with sdp_db_buffer*/
alignas(tSDP_DISCOVERY_DB) uint8_t sdp_db_buffer[BTA_DM_SDP_DB_SIZE];
} tBTA_DM_SDP_STATE;
typedef struct {
service_discovery_callbacks service_search_cbacks;
tGATT_IF client_if;
std::queue pending_discovery_queue;
RawAddress peer_bdaddr;
uint8_t transports;
/* This covers service discovery state - callers of BTA_DmDiscover. That is
* initial service discovery after bonding and
* BluetoothDevice.fetchUuidsWithSdp(). Responsible for LE GATT Service
* Discovery and SDP */
tBTA_DM_SERVICE_DISCOVERY_STATE service_discovery_state;
std::unique_ptr sdp_state;
uint16_t conn_id;
alarm_t* gatt_close_timer; /* GATT channel close delay timer */
RawAddress pending_close_bda; /* pending GATT channel remote device address */
} tBTA_DM_SERVICE_DISCOVERY_CB;
extern const uint32_t bta_service_id_to_btm_srv_id_lkup_tbl[];
extern const uint16_t bta_service_id_to_uuid_lkup_tbl[];
void bta_dm_disc_override_sdp_performer_for_testing(
base::RepeatingCallback sdp_performer);
void bta_dm_disc_override_gatt_performer_for_testing(
base::RepeatingCallback test_gatt_performer);
void bta_dm_sdp_find_services(tBTA_DM_SDP_STATE* sdp_state);
void bta_dm_sdp_result(tSDP_STATUS sdp_result, tBTA_DM_SDP_STATE* sdp_state);
void bta_dm_sdp_finished(RawAddress bda, tBTA_STATUS result,
std::vector uuids = {},
std::vector gatt_uuids = {});
void bta_dm_gatt_finished(RawAddress bda, tBTA_STATUS result,
std::vector gatt_uuids = {});
void bta_dm_sdp_callback(const RawAddress& bd_addr, tSDP_STATUS sdp_status);
#ifdef TARGET_FLOSS
void bta_dm_sdp_received_di(const RawAddress& bd_addr,
tSDP_DI_GET_RECORD& di_record);
#endif
namespace fmt {
template <>
struct formatter : enum_formatter {};
template <>
struct formatter
: enum_formatter {};
} // namespace fmt