pbap_client: provide pbap_client by callee

This commit is contained in:
Matthias Ringwald 2024-07-18 10:08:58 +02:00
parent 65bf3c45de
commit 3971078c5e

View File

@ -321,53 +321,51 @@ static void pbap_client_yml_append_character(yxml_t * xml_parser, char * buffer,
buffer[zero_pos] = '\0';
}
static void pbap_client_process_vcard_list_body(const uint8_t * data, uint16_t data_len){
pbap_client_t * pbap_client = pbap_client_singleton_pointer;
static void pbap_client_process_vcard_list_body(pbap_client_t *client, const uint8_t *data, uint16_t data_len) {
while (data_len--) {
yxml_ret_t r = yxml_parse(&pbap_client->xml_parser, *data++);
yxml_ret_t r = yxml_parse(&client->xml_parser, *data++);
switch (r) {
case YXML_ELEMSTART:
pbap_client->parser_card_found = strcmp("card", pbap_client->xml_parser.elem) == 0;
client->parser_card_found = strcmp("card", client->xml_parser.elem) == 0;
break;
case YXML_ELEMEND:
if (pbap_client->parser_card_found) {
pbap_client_emit_card_result_event(pbap_client, pbap_client->parser_name,
pbap_client->parser_handle);
if (client->parser_card_found) {
pbap_client_emit_card_result_event(client, client->parser_name,
client->parser_handle);
}
pbap_client->parser_card_found = false;
client->parser_card_found = false;
break;
case YXML_ATTRSTART:
if (!pbap_client->parser_card_found) break;
if (strcmp("name", pbap_client->xml_parser.attr) == 0) {
pbap_client->parser_name_found = true;
pbap_client->parser_name[0] = 0;
if (!client->parser_card_found) break;
if (strcmp("name", client->xml_parser.attr) == 0) {
client->parser_name_found = true;
client->parser_name[0] = 0;
break;
}
if (strcmp("handle", pbap_client->xml_parser.attr) == 0) {
pbap_client->parser_handle_found = true;
pbap_client->parser_handle[0] = 0;
if (strcmp("handle", client->xml_parser.attr) == 0) {
client->parser_handle_found = true;
client->parser_handle[0] = 0;
break;
}
break;
case YXML_ATTRVAL:
if (pbap_client->parser_name_found) {
pbap_client_yml_append_character(&pbap_client->xml_parser,
pbap_client->parser_name,
sizeof(pbap_client->parser_name));
if (client->parser_name_found) {
pbap_client_yml_append_character(&client->xml_parser,
client->parser_name,
sizeof(client->parser_name));
break;
}
if (pbap_client->parser_handle_found) {
pbap_client_yml_append_character(&pbap_client->xml_parser,
pbap_client->parser_handle,
sizeof(pbap_client->parser_handle));
if (client->parser_handle_found) {
pbap_client_yml_append_character(&client->xml_parser,
client->parser_handle,
sizeof(client->parser_handle));
break;
}
break;
case YXML_ATTREND:
pbap_client->parser_name_found = false;
pbap_client->parser_handle_found = false;
client->parser_name_found = false;
client->parser_handle_found = false;
break;
default:
break;
@ -424,7 +422,7 @@ static void pbap_client_parser_callback_get_operation(void * user_data, uint8_t
}
break;
case PBAP_CLIENT_W4_GET_CARD_LIST_COMPLETE:
pbap_client_process_vcard_list_body(data_buffer, data_len);
pbap_client_process_vcard_list_body(client, data_buffer, data_len);
break;
default:
btstack_unreachable();
@ -554,7 +552,7 @@ static void pbap_client_prepare_get_operation(pbap_client_t * client){
client->obex_parser_waiting_for_response = true;
}
static void pbap_handle_can_send_now(void){
static void pbap_handle_can_send_now(pbap_client_t *pbap_client) {
uint16_t path_element_start;
uint16_t path_element_len;
const char * path_element;
@ -564,8 +562,6 @@ static void pbap_handle_can_send_now(void){
MD5_CTX md5_ctx;
pbap_client_t * pbap_client = pbap_client_singleton_pointer;
if (pbap_client->abort_operation){
pbap_client->abort_operation = 0;
// prepare request
@ -846,7 +842,7 @@ static void pbap_packet_handler_hci(uint8_t *packet, uint16_t size){
pbap_client_emit_connection_closed_event(pbap_client);
break;
case GOEP_SUBEVENT_CAN_SEND_NOW:
pbap_handle_can_send_now();
pbap_handle_can_send_now(pbap_client);
break;
default:
break;
@ -857,102 +853,101 @@ static void pbap_packet_handler_hci(uint8_t *packet, uint16_t size){
}
}
static void pbap_packet_handler_goep(uint8_t *packet, uint16_t size){
pbap_client_t * pbap_client = pbap_client_singleton_pointer;
static void pbap_packet_handler_goep(pbap_client_t *client, uint8_t *packet, uint16_t size) {
if (pbap_client->obex_parser_waiting_for_response == false) return;
if (client->obex_parser_waiting_for_response == false) return;
obex_parser_object_state_t parser_state;
parser_state = obex_parser_process_data(&pbap_client->obex_parser, packet, size);
parser_state = obex_parser_process_data(&client->obex_parser, packet, size);
if (parser_state == OBEX_PARSER_OBJECT_STATE_COMPLETE){
pbap_client->obex_parser_waiting_for_response = false;
client->obex_parser_waiting_for_response = false;
obex_parser_operation_info_t op_info;
obex_parser_get_operation_info(&pbap_client->obex_parser, &op_info);
switch (pbap_client->state){
obex_parser_get_operation_info(&client->obex_parser, &op_info);
switch (client->state){
case PBAP_CLIENT_W4_CONNECT_RESPONSE:
switch (op_info.response_code) {
case OBEX_RESP_SUCCESS:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client->vcard_selector_supported = pbap_client_supported_features & goep_client_get_pbap_supported_features( pbap_client->goep_cid) & PBAP_SUPPORTED_FEATURES_VCARD_SELECTING;
pbap_client_emit_connected_event(pbap_client, ERROR_CODE_SUCCESS);
client->state = PBAP_CLIENT_CONNECTED;
client->vcard_selector_supported = pbap_client_supported_features & goep_client_get_pbap_supported_features(client->goep_cid) & PBAP_SUPPORTED_FEATURES_VCARD_SELECTING;
pbap_client_emit_connected_event(client, ERROR_CODE_SUCCESS);
break;
case OBEX_RESP_UNAUTHORIZED:
pbap_client->state = PBAP_CLIENT_W4_USER_AUTHENTICATION;
pbap_client_emit_authentication_event(pbap_client, pbap_client->obex_auth_parser.authentication_options);
client->state = PBAP_CLIENT_W4_USER_AUTHENTICATION;
pbap_client_emit_authentication_event(client, client->obex_auth_parser.authentication_options);
break;
default:
log_info("pbap: obex connect failed, result 0x%02x", packet[0]);
pbap_client->state = PBAP_CLIENT_INIT;
pbap_client_emit_connected_event(pbap_client, OBEX_CONNECT_FAILED);
client->state = PBAP_CLIENT_INIT;
pbap_client_emit_connected_event(client, OBEX_CONNECT_FAILED);
break;
}
break;
case PBAP_CLIENT_W4_DISCONNECT_RESPONSE:
goep_client_disconnect(pbap_client->goep_cid);
goep_client_disconnect(client->goep_cid);
break;
case PBAP_CLIENT_W4_SET_PATH_ROOT_COMPLETE:
case PBAP_CLIENT_W4_SET_PATH_ELEMENT_COMPLETE:
switch (op_info.response_code) {
case OBEX_RESP_SUCCESS:
// more path?
if (pbap_client->current_folder[pbap_client->set_path_offset]) {
pbap_client->state = PBAP_CLIENT_W2_SET_PATH_ELEMENT;
goep_client_request_can_send_now(pbap_client->goep_cid);
if (client->current_folder[client->set_path_offset]) {
client->state = PBAP_CLIENT_W2_SET_PATH_ELEMENT;
goep_client_request_can_send_now(client->goep_cid);
} else {
pbap_client->current_folder = NULL;
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, ERROR_CODE_SUCCESS);
client->current_folder = NULL;
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, ERROR_CODE_SUCCESS);
}
break;
case OBEX_RESP_NOT_FOUND:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_NOT_FOUND);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, OBEX_NOT_FOUND);
break;
default:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_UNKNOWN_ERROR);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, OBEX_UNKNOWN_ERROR);
break;
}
break;
case PBAP_CLIENT_W4_PHONEBOOK:
switch (op_info.response_code) {
case OBEX_RESP_CONTINUE:
pbap_client_handle_srm_headers(pbap_client);
if (pbap_client->srm_state == SRM_ENABLED) {
pbap_client_handle_srm_headers(client);
if (client->srm_state == SRM_ENABLED) {
// prepare response
pbap_client_prepare_get_operation(pbap_client);
pbap_client_prepare_get_operation(client);
break;
}
pbap_client->state = PBAP_CLIENT_W2_PULL_PHONEBOOK;
if (!pbap_client->flow_control_enabled || !pbap_client->flow_wait_for_user ||
pbap_client->flow_next_triggered) {
goep_client_request_can_send_now(pbap_client->goep_cid);
client->state = PBAP_CLIENT_W2_PULL_PHONEBOOK;
if (!client->flow_control_enabled || !client->flow_wait_for_user ||
client->flow_next_triggered) {
goep_client_request_can_send_now(client->goep_cid);
}
break;
case OBEX_RESP_SUCCESS:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, ERROR_CODE_SUCCESS);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, ERROR_CODE_SUCCESS);
break;
default:
log_info("unexpected response 0x%02x", packet[0]);
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_UNKNOWN_ERROR);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, OBEX_UNKNOWN_ERROR);
break;
}
break;
case PBAP_CLIENT_W4_GET_PHONEBOOK_SIZE_COMPLETE:
switch (op_info.response_code) {
case OBEX_RESP_SUCCESS:
if (pbap_client->phonebook_size_parser.have_size) {
uint16_t phonebook_size = big_endian_read_16(pbap_client->phonebook_size_parser.size_buffer, 0);
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_phonebook_size_event(pbap_client, 0, phonebook_size);
if (client->phonebook_size_parser.have_size) {
uint16_t phonebook_size = big_endian_read_16(client->phonebook_size_parser.size_buffer, 0);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_phonebook_size_event(client, 0, phonebook_size);
break;
}
/* fall through */
default:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_phonebook_size_event(pbap_client, OBEX_UNKNOWN_ERROR, 0);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_phonebook_size_event(client, OBEX_UNKNOWN_ERROR, 0);
break;
}
break;
@ -960,61 +955,61 @@ static void pbap_packet_handler_goep(uint8_t *packet, uint16_t size){
switch (op_info.response_code) {
case OBEX_RESP_CONTINUE:
// handle continue
pbap_client_handle_srm_headers(pbap_client);
if (pbap_client->srm_state == SRM_ENABLED) {
pbap_client_handle_srm_headers(client);
if (client->srm_state == SRM_ENABLED) {
// prepare response
pbap_client_prepare_get_operation(pbap_client);
pbap_client_prepare_get_operation(client);
break;
}
pbap_client->state = PBAP_CLIENT_W2_GET_CARD_LIST;
goep_client_request_can_send_now(pbap_client->goep_cid);
client->state = PBAP_CLIENT_W2_GET_CARD_LIST;
goep_client_request_can_send_now(client->goep_cid);
break;
case OBEX_RESP_SUCCESS:
// done
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, ERROR_CODE_SUCCESS);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, ERROR_CODE_SUCCESS);
break;
case OBEX_RESP_NOT_ACCEPTABLE:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_NOT_ACCEPTABLE);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, OBEX_NOT_ACCEPTABLE);
break;
default:
log_info("unexpected response 0x%02x", packet[0]);
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_UNKNOWN_ERROR);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, OBEX_UNKNOWN_ERROR);
break;
}
break;
case PBAP_CLIENT_W4_GET_CARD_ENTRY_COMPLETE:
switch (op_info.response_code) {
case OBEX_RESP_CONTINUE:
pbap_client_handle_srm_headers(pbap_client);
if (pbap_client->srm_state == SRM_ENABLED) {
pbap_client_handle_srm_headers(client);
if (client->srm_state == SRM_ENABLED) {
// prepare response
pbap_client_prepare_get_operation(pbap_client);
pbap_client_prepare_get_operation(client);
break;
}
pbap_client->state = PBAP_CLIENT_W2_GET_CARD_ENTRY;
goep_client_request_can_send_now(pbap_client->goep_cid);
client->state = PBAP_CLIENT_W2_GET_CARD_ENTRY;
goep_client_request_can_send_now(client->goep_cid);
break;
case OBEX_RESP_SUCCESS:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, ERROR_CODE_SUCCESS);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, ERROR_CODE_SUCCESS);
break;
case OBEX_RESP_NOT_ACCEPTABLE:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_NOT_ACCEPTABLE);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, OBEX_NOT_ACCEPTABLE);
break;
default:
log_info("unexpected response 0x%02x", packet[0]);
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_UNKNOWN_ERROR);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, OBEX_UNKNOWN_ERROR);
break;
}
break;
case PBAP_CLIENT_W4_ABORT_COMPLETE:
pbap_client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_ABORTED);
client->state = PBAP_CLIENT_CONNECTED;
pbap_client_emit_operation_complete_event(client, OBEX_ABORTED);
break;
default:
btstack_unreachable();
@ -1027,12 +1022,15 @@ static void pbap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *
UNUSED(channel); // ok: there is no channel
UNUSED(size); // ok: handling own geop events
pbap_client_t * client;
switch (packet_type){
case HCI_EVENT_PACKET:
pbap_packet_handler_hci(packet, size);
break;
case GOEP_DATA_PACKET:
pbap_packet_handler_goep(packet, size);
client = pbap_client_singleton_pointer;
pbap_packet_handler_goep(client, packet, size);
break;
default:
break;