obex: move srm state back into clients

This commit is contained in:
Matthias Ringwald 2024-08-07 17:02:45 +02:00
parent a2763e0c6f
commit 1a3b1957af
5 changed files with 66 additions and 60 deletions

View File

@ -163,7 +163,7 @@ static void avrcp_cover_art_client_parser_callback_connect(void * user_data, uin
static void avrcp_cover_art_client_prepare_srm_header(avrcp_cover_art_client_t * cover_art_client){ static void avrcp_cover_art_client_prepare_srm_header(avrcp_cover_art_client_t * cover_art_client){
if (cover_art_client->flow_control_enabled == false){ if (cover_art_client->flow_control_enabled == false){
goep_client_header_add_srm_enable(cover_art_client->goep_cid); goep_client_header_add_srm_enable(cover_art_client->goep_cid);
cover_art_client->srm_state = SRM_W4_CONFIRM; cover_art_client->srm_state = AVRCP_COVER_ART_SRM_W4_CONFIRM;
} }
} }
@ -176,30 +176,30 @@ static void avrcp_cover_art_client_handle_srm_headers(avrcp_cover_art_client_t *
const avrcp_cover_art_obex_srm_t * obex_srm = &context->obex_srm; const avrcp_cover_art_obex_srm_t * obex_srm = &context->obex_srm;
// Update SRM state based on SRM headers // Update SRM state based on SRM headers
switch (context->srm_state){ switch (context->srm_state){
case SRM_W4_CONFIRM: case AVRCP_COVER_ART_SRM_W4_CONFIRM:
switch (obex_srm->srm_value){ switch (obex_srm->srm_value){
case OBEX_SRM_ENABLE: case OBEX_SRM_ENABLE:
switch (obex_srm->srmp_value){ switch (obex_srm->srmp_value){
case OBEX_SRMP_WAIT: case OBEX_SRMP_WAIT:
context->srm_state = SRM_ENABLED_BUT_WAITING; context->srm_state = AVRCP_COVER_ART_SRM_ENABLED_BUT_WAITING;
break; break;
default: default:
context->srm_state = SRM_ENABLED; context->srm_state = AVRCP_COVER_ART_SRM_ENABLED;
break; break;
} }
break; break;
default: default:
context->srm_state = SRM_DISABLED; context->srm_state = AVRCP_COVER_ART_SRM_DISABLED;
break; break;
} }
break; break;
case SRM_ENABLED_BUT_WAITING: case AVRCP_COVER_ART_SRM_ENABLED_BUT_WAITING:
switch (obex_srm->srmp_value){ switch (obex_srm->srmp_value){
case OBEX_SRMP_WAIT: case OBEX_SRMP_WAIT:
context->srm_state = SRM_ENABLED_BUT_WAITING; context->srm_state = AVRCP_COVER_ART_SRM_ENABLED_BUT_WAITING;
break; break;
default: default:
context->srm_state = SRM_ENABLED; context->srm_state = AVRCP_COVER_ART_SRM_ENABLED;
break; break;
} }
break; break;
@ -384,7 +384,7 @@ static void avrcp_cover_art_client_goep_data_handler(avrcp_cover_art_client_t *
switch (op_info.response_code) { switch (op_info.response_code) {
case OBEX_RESP_CONTINUE: case OBEX_RESP_CONTINUE:
avrcp_cover_art_client_handle_srm_headers(cover_art_client); avrcp_cover_art_client_handle_srm_headers(cover_art_client);
if (cover_art_client->srm_state == SRM_ENABLED) { if (cover_art_client->srm_state == AVRCP_COVER_ART_SRM_ENABLED) {
// prepare response // prepare response
avrcp_cover_art_client_prepare_get_operation(cover_art_client); avrcp_cover_art_client_prepare_get_operation(cover_art_client);
break; break;

View File

@ -84,6 +84,13 @@ typedef struct {
uint8_t srmp_value; uint8_t srmp_value;
} avrcp_cover_art_obex_srm_t; } avrcp_cover_art_obex_srm_t;
typedef enum {
AVRCP_COVER_ART_SRM_DISABLED,
AVRCP_COVER_ART_SRM_W4_CONFIRM,
AVRCP_COVER_ART_SRM_ENABLED_BUT_WAITING,
AVRCP_COVER_ART_SRM_ENABLED
} avrcp_cover_art_srm_state_t;
typedef struct { typedef struct {
btstack_linked_item_t item; btstack_linked_item_t item;
@ -114,7 +121,7 @@ typedef struct {
// obex srm // obex srm
avrcp_cover_art_obex_srm_t obex_srm; avrcp_cover_art_obex_srm_t obex_srm;
obex_srm_state_t srm_state; avrcp_cover_art_srm_state_t srm_state;
// request // request
const char * object_type; const char * object_type;

View File

@ -148,36 +148,5 @@
// PbapSupportedFeatures - 0x10 - 4 bytes // PbapSupportedFeatures - 0x10 - 4 bytes
#define PBAP_APPLICATION_PARAMETER_PBAP_SUPPORTED_FEATURES 0x10 #define PBAP_APPLICATION_PARAMETER_PBAP_SUPPORTED_FEATURES 0x10
// OBEX related structs used by BTstack
typedef enum {
SRM_DISABLED,
SRM_W4_CONFIRM,
SRM_ENABLED_BUT_WAITING,
SRM_ENABLED
} obex_srm_state_t;
typedef enum {
OBEX_AUTH_PARSER_STATE_W4_TYPE = 0,
OBEX_AUTH_PARSER_STATE_W4_LEN,
OBEX_AUTH_PARSER_STATE_W4_VALUE,
OBEX_AUTH_PARSER_STATE_INVALID,
} obex_auth_parser_state_t;
typedef struct {
// parsing
obex_auth_parser_state_t state;
uint8_t type;
uint8_t len;
uint8_t pos;
// data
uint8_t authentication_options;
uint16_t authentication_nonce[16];
} obex_auth_parser_t;
typedef struct {
uint8_t srm_value;
uint8_t srmp_value;
} obex_srm_t;
#endif #endif

View File

@ -261,11 +261,11 @@ static void pbap_client_phonebook_size_parser_process_data(pbap_client_phonebook
} }
} }
static void obex_auth_parser_init(obex_auth_parser_t * auth_parser){ static void obex_auth_parser_init(pbap_client_obex_auth_parser_t * auth_parser){
memset(auth_parser, 0, sizeof(obex_auth_parser_t)); memset(auth_parser, 0, sizeof(pbap_client_obex_auth_parser_t));
} }
static void obex_auth_parser_process_data(obex_auth_parser_t * auth_parser, const uint8_t * data_buffer, uint16_t data_len){ static void obex_auth_parser_process_data(pbap_client_obex_auth_parser_t * auth_parser, const uint8_t * data_buffer, uint16_t data_len){
while (data_len){ while (data_len){
uint16_t bytes_to_consume = 1; uint16_t bytes_to_consume = 1;
switch(auth_parser->state){ switch(auth_parser->state){
@ -326,7 +326,7 @@ static void obex_auth_parser_process_data(obex_auth_parser_t * auth_parser, cons
} }
} }
static void obex_srm_init(obex_srm_t * obex_srm){ static void obex_srm_init(pbap_client_obex_srm_t * obex_srm){
obex_srm->srm_value = OBEX_SRM_DISABLE; obex_srm->srm_value = OBEX_SRM_DISABLE;
obex_srm->srmp_value = OBEX_SRMP_NEXT; obex_srm->srmp_value = OBEX_SRMP_NEXT;
} }
@ -561,7 +561,7 @@ static void pbap_client_add_application_parameters(const pbap_client_t * client,
static void pbap_client_prepare_srm_header(pbap_client_t * client){ static void pbap_client_prepare_srm_header(pbap_client_t * client){
if (!client->flow_control_enabled && goep_client_version_20_or_higher(client->goep_cid)){ if (!client->flow_control_enabled && goep_client_version_20_or_higher(client->goep_cid)){
goep_client_header_add_srm_enable(client->goep_cid); goep_client_header_add_srm_enable(client->goep_cid);
client->srm_state = SRM_W4_CONFIRM; client->srm_state = PBAP_CLIENT_SRM_W4_CONFIRM;
} }
} }
@ -792,33 +792,33 @@ static void pbap_handle_can_send_now(pbap_client_t *pbap_client) {
} }
static void pbap_client_handle_srm_headers(pbap_client_t *client) { static void pbap_client_handle_srm_headers(pbap_client_t *client) {
const obex_srm_t * obex_srm = &client->obex_srm; const pbap_client_obex_srm_t * obex_srm = &client->obex_srm;
// Update SRM state based on SRM headers // Update SRM state based on SRM headers
switch (client->srm_state){ switch (client->srm_state){
case SRM_W4_CONFIRM: case PBAP_CLIENT_SRM_W4_CONFIRM:
switch (obex_srm->srm_value){ switch (obex_srm->srm_value){
case OBEX_SRM_ENABLE: case OBEX_SRM_ENABLE:
switch (obex_srm->srmp_value){ switch (obex_srm->srmp_value){
case OBEX_SRMP_WAIT: case OBEX_SRMP_WAIT:
client->srm_state = SRM_ENABLED_BUT_WAITING; client->srm_state = PBAP_CLIENT_SRM_ENABLED_BUT_WAITING;
break; break;
default: default:
client->srm_state = SRM_ENABLED; client->srm_state = PBAP_CLIENT_SRM_ENABLED;
break; break;
} }
break; break;
default: default:
client->srm_state = SRM_DISABLED; client->srm_state = PBAP_CLIENT_SRM_DISABLED;
break; break;
} }
break; break;
case SRM_ENABLED_BUT_WAITING: case PBAP_CLIENT_SRM_ENABLED_BUT_WAITING:
switch (obex_srm->srmp_value){ switch (obex_srm->srmp_value){
case OBEX_SRMP_WAIT: case OBEX_SRMP_WAIT:
client->srm_state = SRM_ENABLED_BUT_WAITING; client->srm_state = PBAP_CLIENT_SRM_ENABLED_BUT_WAITING;
break; break;
default: default:
client->srm_state = SRM_ENABLED; client->srm_state = PBAP_CLIENT_SRM_ENABLED;
break; break;
} }
break; break;
@ -937,7 +937,7 @@ static void pbap_packet_handler_goep(pbap_client_t *client, uint8_t *packet, uin
switch (op_info.response_code) { switch (op_info.response_code) {
case OBEX_RESP_CONTINUE: case OBEX_RESP_CONTINUE:
pbap_client_handle_srm_headers(client); pbap_client_handle_srm_headers(client);
if (client->srm_state == SRM_ENABLED) { if (client->srm_state == PBAP_CLIENT_SRM_ENABLED) {
// prepare response // prepare response
pbap_client_prepare_get_operation(client); pbap_client_prepare_get_operation(client);
break; break;
@ -980,7 +980,7 @@ static void pbap_packet_handler_goep(pbap_client_t *client, uint8_t *packet, uin
case OBEX_RESP_CONTINUE: case OBEX_RESP_CONTINUE:
// handle continue // handle continue
pbap_client_handle_srm_headers(client); pbap_client_handle_srm_headers(client);
if (client->srm_state == SRM_ENABLED) { if (client->srm_state == PBAP_CLIENT_SRM_ENABLED) {
// prepare response // prepare response
pbap_client_prepare_get_operation(client); pbap_client_prepare_get_operation(client);
break; break;
@ -1008,7 +1008,7 @@ static void pbap_packet_handler_goep(pbap_client_t *client, uint8_t *packet, uin
switch (op_info.response_code) { switch (op_info.response_code) {
case OBEX_RESP_CONTINUE: case OBEX_RESP_CONTINUE:
pbap_client_handle_srm_headers(client); pbap_client_handle_srm_headers(client);
if (client->srm_state == SRM_ENABLED) { if (client->srm_state == PBAP_CLIENT_SRM_ENABLED) {
// prepare response // prepare response
pbap_client_prepare_get_operation(client); pbap_client_prepare_get_operation(client);
break; break;

View File

@ -109,6 +109,36 @@ typedef struct {
uint8_t size_buffer[2]; uint8_t size_buffer[2];
} pbap_client_phonebook_size_parser_t; } pbap_client_phonebook_size_parser_t;
typedef enum {
PBAP_CLIENT_SRM_DISABLED,
PBAP_CLIENT_SRM_W4_CONFIRM,
PBAP_CLIENT_SRM_ENABLED_BUT_WAITING,
PBAP_CLIENT_SRM_ENABLED
} pbap_client_obex_srm_state_t;
typedef struct {
uint8_t srm_value;
uint8_t srmp_value;
} pbap_client_obex_srm_t;
typedef enum {
OBEX_AUTH_PARSER_STATE_W4_TYPE = 0,
OBEX_AUTH_PARSER_STATE_W4_LEN,
OBEX_AUTH_PARSER_STATE_W4_VALUE,
OBEX_AUTH_PARSER_STATE_INVALID,
} pbap_client_obex_auth_parser_state_t;
typedef struct {
// parsing
pbap_client_obex_auth_parser_state_t state;
uint8_t type;
uint8_t len;
uint8_t pos;
// data
uint8_t authentication_options;
uint16_t authentication_nonce[16];
} pbap_client_obex_auth_parser_t;
typedef struct pbap_client { typedef struct pbap_client {
// pbap client linked list // pbap client linked list
btstack_linked_item_t item; btstack_linked_item_t item;
@ -142,7 +172,7 @@ typedef struct pbap_client {
obex_parser_t obex_parser; obex_parser_t obex_parser;
uint8_t obex_header_buffer[4]; uint8_t obex_header_buffer[4];
/* authentication */ /* authentication */
obex_auth_parser_t obex_auth_parser; pbap_client_obex_auth_parser_t obex_auth_parser;
const char * authentication_password; const char * authentication_password;
/* xml parser */ /* xml parser */
yxml_t xml_parser; yxml_t xml_parser;
@ -160,8 +190,8 @@ typedef struct pbap_client {
uint8_t flow_next_triggered; uint8_t flow_next_triggered;
bool flow_wait_for_user; bool flow_wait_for_user;
/* srm */ /* srm */
obex_srm_t obex_srm; pbap_client_obex_srm_t obex_srm;
obex_srm_state_t srm_state; pbap_client_obex_srm_state_t srm_state;
} pbap_client_t; } pbap_client_t;
/* API_START */ /* API_START */