pbap_client: handle OBEX_RESP_NOT_ACCEPTABLE

This commit is contained in:
Matthias Ringwald 2018-09-27 17:39:13 +02:00
parent e47802fe3c
commit 16ded4fec1
3 changed files with 89 additions and 74 deletions

View File

@ -184,6 +184,7 @@ typedef uint8_t sm_key_t[16];
#define OBEX_CONNECT_FAILED 0xB1 #define OBEX_CONNECT_FAILED 0xB1
#define OBEX_DISCONNECTED 0xB2 #define OBEX_DISCONNECTED 0xB2
#define OBEX_NOT_FOUND 0xB3 #define OBEX_NOT_FOUND 0xB3
#define OBEX_NOT_ACCEPTABLE 0xB4
#define AVDTP_SEID_DOES_NOT_EXIST 0xC0 #define AVDTP_SEID_DOES_NOT_EXIST 0xC0
#define AVDTP_CONNECTION_DOES_NOT_EXIST 0xC1 #define AVDTP_CONNECTION_DOES_NOT_EXIST 0xC1

View File

@ -54,7 +54,7 @@
#define OBEX_RESP_UNAUTHORIZED 0xC1 #define OBEX_RESP_UNAUTHORIZED 0xC1
#define OBEX_RESP_FORBIDDEN 0xC3 #define OBEX_RESP_FORBIDDEN 0xC3
#define OBEX_RESP_NOT_FOUND 0xC4 #define OBEX_RESP_NOT_FOUND 0xC4
#define OBEX_RESP_REFUSED 0xC6 #define OBEX_RESP_NOT_ACCEPTABLE 0xC6
#define OBEX_HEADER_BODY 0x48 #define OBEX_HEADER_BODY 0x48
#define OBEX_HEADER_END_OF_BODY 0x49 #define OBEX_HEADER_END_OF_BODY 0x49

View File

@ -504,15 +504,20 @@ static void pbap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *
pbap_client->client_handler(PBAP_DATA_PACKET, pbap_client->cid, (uint8_t *) data, data_len); pbap_client->client_handler(PBAP_DATA_PACKET, pbap_client->cid, (uint8_t *) data, data_len);
} }
} }
if (packet[0] == OBEX_RESP_CONTINUE){ switch(packet[0]){
pbap_client->state = PBAP_W2_PULL_PHONEBOOK; case OBEX_RESP_CONTINUE:
goep_client_request_can_send_now(pbap_client->goep_cid); pbap_client->state = PBAP_W2_PULL_PHONEBOOK;
} else if (packet[0] == OBEX_RESP_SUCCESS){ goep_client_request_can_send_now(pbap_client->goep_cid);
pbap_client->state = PBAP_CONNECTED; break;
pbap_client_emit_operation_complete_event(pbap_client, 0); case OBEX_RESP_SUCCESS:
} else { pbap_client->state = PBAP_CONNECTED;
pbap_client->state = PBAP_CONNECTED; pbap_client_emit_operation_complete_event(pbap_client, 0);
pbap_client_emit_operation_complete_event(pbap_client, OBEX_UNKNOWN_ERROR); break;
default:
log_info("unexpected response 0x%02x", packet[0]);
pbap_client->state = PBAP_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_UNKNOWN_ERROR);
break;
} }
break; break;
case PBAP_W4_GET_PHONEBOOK_SIZE_COMPLETE: case PBAP_W4_GET_PHONEBOOK_SIZE_COMPLETE:
@ -546,77 +551,86 @@ static void pbap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *
pbap_client_emit_phonebook_size_event(pbap_client, OBEX_UNKNOWN_ERROR, 0); pbap_client_emit_phonebook_size_event(pbap_client, OBEX_UNKNOWN_ERROR, 0);
break; break;
case PBAP_W4_GET_CARD_LIST_COMPLETE: case PBAP_W4_GET_CARD_LIST_COMPLETE:
if (packet[0] == OBEX_RESP_CONTINUE){ switch (packet[0]){
pbap_client->state = PBAP_W2_GET_CARD_LIST; case OBEX_RESP_CONTINUE:
goep_client_request_can_send_now(pbap_client->goep_cid); pbap_client->state = PBAP_W2_GET_CARD_LIST;
} else if (packet[0] == OBEX_RESP_SUCCESS){ goep_client_request_can_send_now(pbap_client->goep_cid);
for (obex_iterator_init_with_response_packet(&it, goep_client_get_request_opcode(pbap_client->goep_cid), packet, size); obex_iterator_has_more(&it) ; obex_iterator_next(&it)){ break;
uint8_t hi = obex_iterator_get_hi(&it); case OBEX_RESP_SUCCESS:
if (hi == OBEX_HEADER_END_OF_BODY){ for (obex_iterator_init_with_response_packet(&it, goep_client_get_request_opcode(pbap_client->goep_cid), packet, size); obex_iterator_has_more(&it) ; obex_iterator_next(&it)){
uint16_t data_len = obex_iterator_get_data_len(&it); uint8_t hi = obex_iterator_get_hi(&it);
const uint8_t * data = obex_iterator_get_data(&it); if (hi == OBEX_HEADER_END_OF_BODY){
// now try parsing it uint16_t data_len = obex_iterator_get_data_len(&it);
yxml_init(&pbap_client->xml_parser, pbap_client->xml_buffer, sizeof(pbap_client->xml_buffer)); const uint8_t * data = obex_iterator_get_data(&it);
int card_found = 0; // now try parsing it
int name_found = 0; yxml_init(&pbap_client->xml_parser, pbap_client->xml_buffer, sizeof(pbap_client->xml_buffer));
int handle_found = 0; int card_found = 0;
char name[PBAP_MAX_NAME_LEN]; int name_found = 0;
char handle[PBAP_MAX_HANDLE_LEN]; int handle_found = 0;
name[0] = 0; char name[PBAP_MAX_NAME_LEN];
handle[0] = 0; char handle[PBAP_MAX_HANDLE_LEN];
while (data_len--){ name[0] = 0;
yxml_ret_t r = yxml_parse(&pbap_client->xml_parser, *data++); handle[0] = 0;
switch (r){ while (data_len--){
case YXML_ELEMSTART: yxml_ret_t r = yxml_parse(&pbap_client->xml_parser, *data++);
card_found = strcmp("card", pbap_client->xml_parser.elem) == 0; switch (r){
break; case YXML_ELEMSTART:
case YXML_ELEMEND: card_found = strcmp("card", pbap_client->xml_parser.elem) == 0;
if (card_found){
pbap_client_emit_card_result_event(pbap_client, name, handle);
}
card_found = 0;
break;
case YXML_ATTRSTART:
if (!card_found) break;
if (strcmp("name", pbap_client->xml_parser.attr) == 0){
name_found = 1;
break; break;
} case YXML_ELEMEND:
if (strcmp("handle", pbap_client->xml_parser.attr) == 0){ if (card_found){
handle_found = 1; pbap_client_emit_card_result_event(pbap_client, name, handle);
}
card_found = 0;
break; break;
} case YXML_ATTRSTART:
break; if (!card_found) break;
case YXML_ATTRVAL: if (strcmp("name", pbap_client->xml_parser.attr) == 0){
if (name_found) { name_found = 1;
// "In UTF-8, characters from the U+0000..U+10FFFF range (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets." break;
if (strlen(name) + 4 + 1 >= sizeof(name)) break; }
strcat(name, pbap_client->xml_parser.data); if (strcmp("handle", pbap_client->xml_parser.attr) == 0){
handle_found = 1;
break;
}
break; break;
} case YXML_ATTRVAL:
if (handle_found) { if (name_found) {
// "In UTF-8, characters from the U+0000..U+10FFFF range (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets." // "In UTF-8, characters from the U+0000..U+10FFFF range (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets."
if (strlen(handle) + 4 + 1 >= sizeof(handle)) break; if (strlen(name) + 4 + 1 >= sizeof(name)) break;
strcat(handle, pbap_client->xml_parser.data); strcat(name, pbap_client->xml_parser.data);
break;
}
if (handle_found) {
// "In UTF-8, characters from the U+0000..U+10FFFF range (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets."
if (strlen(handle) + 4 + 1 >= sizeof(handle)) break;
strcat(handle, pbap_client->xml_parser.data);
break;
}
break; break;
} case YXML_ATTREND:
break; name_found = 0;
case YXML_ATTREND: handle_found = 0;
name_found = 0; break;
handle_found = 0; default:
break; break;
default: }
break;
} }
//
pbap_client->state = PBAP_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, 0);
} }
//
pbap_client->state = PBAP_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, 0);
} }
} break;
case OBEX_RESP_NOT_ACCEPTABLE:
} else { pbap_client->state = PBAP_CONNECTED;
// ? pbap_client_emit_operation_complete_event(pbap_client, OBEX_NOT_ACCEPTABLE);
break;
default:
log_info("unexpected response 0x%02x", packet[0]);
pbap_client->state = PBAP_CONNECTED;
pbap_client_emit_operation_complete_event(pbap_client, OBEX_UNKNOWN_ERROR);
break;
} }
break; break;
default: default: