sdp_query: emit SDP_EVENT_QUERY_COMPLETE with error SDP_QUERY_BUSY

This commit is contained in:
Matthias Ringwald 2016-02-17 20:38:37 +01:00
parent 6c927b22a9
commit e505764193
5 changed files with 33 additions and 12 deletions

View File

@ -55,6 +55,7 @@
#include "btstack_run_loop.h"
#include "classic/sdp_client.h"
#include "classic/sdp_query_util.h"
#include "classic/sdp_util.h"
#include "hci.h"
#include "hci_cmd.h"
#include "hci_dump.h"

View File

@ -129,7 +129,8 @@ typedef uint8_t sm_key_t[16];
#define SDP_QUERY_INCOMPLETE 0x81
#define SDP_SERVICE_NOT_FOUND 0x82
#define SDP_HANDLE_INVALID 0x83
#define SDP_QUERY_BUSY 0x84
#define ATT_HANDLE_VALUE_INDICATION_IN_PORGRESS 0x90
#define ATT_HANDLE_VALUE_INDICATION_TIMEOUT 0x91

View File

@ -46,6 +46,7 @@
#include "l2cap.h"
#include "classic/sdp_server.h"
#include "classic/sdp_util.h"
#include "btstack_debug.h"
// Types SDP Parser - Data Element stream helper
@ -306,6 +307,11 @@ void sdp_parser_handle_done(uint8_t status){
(*sdp_parser_callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
static void sdp_client_emit_busy(btstack_packet_handler_t callback){
log_error("sdp_client query initiated when not ready");
uint8_t event[] = { SDP_EVENT_QUERY_COMPLETE, 1, SDP_QUERY_BUSY};
(*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
// SDP Client
@ -688,7 +694,7 @@ int sdp_client_ready(void){
void sdp_client_query(btstack_packet_handler_t callback, bd_addr_t remote, const uint8_t * des_service_search_pattern, const uint8_t * des_attribute_id_list){
if (!sdp_client_ready()) {
log_error("sdp_client_query called when not ready");
sdp_client_emit_busy(callback);
return;
}
sdp_parser_init(callback);
@ -704,7 +710,7 @@ void sdp_client_query(btstack_packet_handler_t callback, bd_addr_t remote, const
#ifdef ENABLE_SDP_EXTRA_QUERIES
void sdp_client_service_attribute_search(btstack_packet_handler_t callback, bd_addr_t remote, uint32_t search_service_record_handle, uint8_t * des_attribute_id_list){
if (!sdp_client_ready()) {
log_error("sdp_client_query called when not ready");
sdp_client_emit_busy(callback);
return;
}
sdp_parser_init(callback);
@ -719,7 +725,7 @@ void sdp_client_service_attribute_search(btstack_packet_handler_t callback, bd_a
void sdp_client_service_search(btstack_packet_handler_t callback, bd_addr_t remote, uint8_t * des_service_search_pattern){
if (!sdp_client_ready()) {
log_error("sdp_client_query called when not ready");
sdp_client_emit_busy(callback);
return;
}
sdp_parser_init(callback);

View File

@ -87,7 +87,7 @@ static de_state_t sn_de_header_state;
static btstack_packet_handler_t sdp_app_callback;
//
static void emit_service(void){
static void sdp_rfcomm_query_emit_service(void){
uint8_t event[3+SDP_SERVICE_NAME_LEN+1];
event[0] = SDP_EVENT_QUERY_RFCOMM_SERVICE;
event[1] = sdp_service_name_len + 1;
@ -98,6 +98,12 @@ static void emit_service(void){
sdp_rfcomm_channel_nr = 0;
}
static void sdp_query_rfcomm_emit_busy(btstack_packet_handler_t callback){
log_error("sdp_query_rfcomm initiated when not ready");
uint8_t event[] = { SDP_EVENT_QUERY_COMPLETE, 1, SDP_QUERY_BUSY};
(*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
static void handleProtocolDescriptorListData(uint32_t attribute_value_length, uint32_t data_offset, uint8_t data){
// init state on first byte
if (data_offset == 0){
@ -235,7 +241,7 @@ static void handleServiceNameData(uint32_t attribute_value_length, uint32_t data
// notify on last char
if (data_offset == attribute_value_length - 1 && sdp_rfcomm_channel_nr!=0){
emit_service();
sdp_rfcomm_query_emit_service();
}
}
@ -244,7 +250,7 @@ static void handle_sdp_parser_event(uint8_t packet_type, uint16_t channel, uint8
case SDP_EVENT_QUERY_SERVICE_RECORD_HANDLE:
// handle service without a name
if (sdp_rfcomm_channel_nr){
emit_service();
sdp_rfcomm_query_emit_service();
}
// prepare for new record
@ -276,7 +282,7 @@ static void handle_sdp_parser_event(uint8_t packet_type, uint16_t channel, uint8
case SDP_EVENT_QUERY_COMPLETE:
// handle service without a name
if (sdp_rfcomm_channel_nr){
emit_service();
sdp_rfcomm_query_emit_service();
}
(*sdp_app_callback)(HCI_EVENT_PACKET, 0, packet, size);
break;
@ -302,7 +308,7 @@ int sdp_query_rfcomm_ready(void){
void sdp_query_rfcomm_channel_and_name_for_search_pattern(btstack_packet_handler_t callback, bd_addr_t remote, uint8_t * serviceSearchPattern){
if (!sdp_query_rfcomm_ready()){
log_error("sdp_query_rfcomm_channel_and_name_for_search_pattern called when not readdy");
sdp_query_rfcomm_emit_busy(callback);
return;
}
sdp_app_callback = callback;
@ -312,7 +318,7 @@ void sdp_query_rfcomm_channel_and_name_for_search_pattern(btstack_packet_handler
void sdp_query_rfcomm_channel_and_name_for_uuid(btstack_packet_handler_t callback, bd_addr_t remote, uint16_t uuid){
if (!sdp_query_rfcomm_ready()){
log_error("sdp_query_rfcomm_channel_and_name_for_uuid called when not readdy");
sdp_query_rfcomm_emit_busy(callback);
return;
}
big_endian_store_16(des_serviceSearchPattern, 3, uuid);

View File

@ -54,6 +54,12 @@ static uint8_t* create_service_search_pattern_for_uuid128(uint8_t* uuid){
return (uint8_t*)des_serviceSearchPatternUUID128;
}
static void sdp_general_query_emit_busy(btstack_packet_handler_t callback){
log_error("sdp_general_query initiated when not ready");
uint8_t event[] = { SDP_EVENT_QUERY_COMPLETE, 1, SDP_QUERY_BUSY};
(*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
/**
* @brief Checks if the SDP Client is ready
* @return 1 when no query is active
@ -67,9 +73,10 @@ uint8_t* create_service_search_pattern_for_uuid(uint16_t uuid){
return (uint8_t*)des_serviceSearchPattern;
}
void sdp_general_query_for_uuid(btstack_packet_handler_t callback, bd_addr_t remote, uint16_t uuid){
if (!sdp_client_ready()){
log_error("sdp_general_query_for_uuid called when not readdy");
sdp_general_query_emit_busy(callback);
return;
}
create_service_search_pattern_for_uuid(uuid);
@ -78,7 +85,7 @@ void sdp_general_query_for_uuid(btstack_packet_handler_t callback, bd_addr_t rem
void sdp_general_query_for_uuid128(btstack_packet_handler_t callback, bd_addr_t remote, uint8_t* uuid){
if (!sdp_client_ready()){
log_error("sdp_general_query_for_uuid called when not readdy");
sdp_general_query_emit_busy(callback);
return;
}
create_service_search_pattern_for_uuid128(uuid);