hfp: rewrite parse sequence

This commit is contained in:
Milanka Ringwald 2015-08-14 15:01:30 +02:00
parent 8acae519b0
commit 211b60e2b1

221
src/hfp.c
View File

@ -605,127 +605,122 @@ void hfp_parse(hfp_connection_t * context, uint8_t byte){
case HFP_PARSER_CMD_SEQUENCE: // parse comma separated sequence, ignore breacktes
if (byte == '"'){ // indicators
context->parser_state = HFP_PARSER_CMD_INDICATOR_NAME;
context->line_size = 0;
break;
}
if (byte == '(' ){ // tuple separated mit comma
if (!hfp_parser_found_separator(context, byte)){
hfp_parser_store_byte(context, byte);
break;
}
if (byte == ',' || byte == '\n' || byte == '\r' || byte == ')'){
context->line_buffer[context->line_size] = 0;
switch (context->command){
case HFP_CMD_SUPPORTED_FEATURES:
context->remote_supported_features = atoi((char*)context->line_buffer);
printf("Parsed supported feature %d\n", context->remote_supported_features);
context->parser_state = HFP_PARSER_CMD_HEADER;
break;
case HFP_CMD_AVAILABLE_CODECS:
printf("Parsed codec %s\n", context->line_buffer);
context->remote_codecs[context->parser_item_index] = (uint16_t)atoi((char*)context->line_buffer);
context->parser_item_index++;
context->remote_codecs_nr = context->parser_item_index;
break;
case HFP_CMD_INDICATOR:
if (context->retrieve_ag_indicators_status == 0) break;
printf("Parsed Indicator %d with status: %s\n", context->parser_item_index+1, context->line_buffer);
context->ag_indicators[context->parser_item_index].status = atoi((char *) context->line_buffer);
context->parser_item_index++;
break;
case HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE:
if (context->parser_item_index == 3){
printf("Parsed Enable indicators: %s\n", context->line_buffer);
value = atoi((char *)&context->line_buffer[0]);
context->enable_status_update_for_ag_indicators = (uint8_t) value;
} else {
context->parser_item_index++;
}
break;
case HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES:
printf("Parsed Support call hold: %s\n", context->line_buffer);
if (context->line_size > 2 ) break;
strcpy((char *)context->remote_call_services[context->remote_call_services_nr].name, (char *)context->line_buffer);
context->remote_call_services_nr++;
if (byte == ')'){
context->parser_state = HFP_PARSER_CMD_HEADER;
context->parser_item_index = 0;
}
break;
case HFP_CMD_GENERIC_STATUS_INDICATOR:
printf("parser HFP_CMD_GENERIC_STATUS_INDICATOR 1 (%d, %d, %d)\n",
context->list_generic_status_indicators,
context->retrieve_generic_status_indicators,
context->retrieve_generic_status_indicators_state);
if (context->retrieve_generic_status_indicators == 1 || context->list_generic_status_indicators == 1){
printf("Parsed Generic status indicator: %s\n", context->line_buffer);
context->generic_status_indicators[context->parser_item_index].uuid = (uint16_t)atoi((char*)context->line_buffer);
context->parser_item_index++;
context->generic_status_indicators_nr = context->parser_item_index;
break;
}
printf("parser HFP_CMD_GENERIC_STATUS_INDICATOR 2\n");
if (context->retrieve_generic_status_indicators_state == 1){
// HF parses inital AG gen. ind. state
printf("Parsed List generic status indicator %s state: ", context->line_buffer);
context->parser_state = HFP_PARSER_SECOND_ITEM;
context->parser_item_index = (uint8_t)atoi((char*)context->line_buffer);
break;
}
break;
case HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE:
// AG parses new gen. ind. state
printf("Parsed Enable ag indicator state: %s\n", context->line_buffer);
value = atoi((char *)&context->line_buffer[0]);
if (!context->ag_indicators[context->parser_item_index].mandatory){
context->ag_indicators[context->parser_item_index].enabled = value;
}
context->parser_item_index++;
break;
case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS:
// indicators are indexed starting with 1
context->parser_item_index = atoi((char *)&context->line_buffer[0]) - 1;
context->parser_state = HFP_PARSER_SECOND_ITEM;
printf("Parsed status of the AG indicator %d, status ", context->parser_item_index);
break;
case HFP_CMD_QUERY_OPERATOR_SELECTION:
context->parser_state = HFP_PARSER_SECOND_ITEM;
context->line_size = 0;
if (context->operator_name_format == 1){
if (context->line_buffer[0] == '3'){
printf("Parsed Set network operator format : %s, ", context->line_buffer);
break;
}
// TODO emit ERROR, wrong format
printf("ERROR Set network operator format: index %s not supported\n", context->line_buffer);
break;
}
if (context->operator_name == 1) {
context->network_operator.mode = atoi((char *)&context->line_buffer[0]);
printf("Parsed network operator mode: %d, ", context->network_operator.mode);
break;
}
break;
default:
break;
}
context->line_size = 0;
if (byte == '\n' || byte == '\r'){
if (hfp_parser_buffer_empty(context)) break;
switch (context->command){
case HFP_CMD_SUPPORTED_FEATURES:
context->remote_supported_features = atoi((char*)context->line_buffer);
printf("Parsed supported feature %d\n", context->remote_supported_features);
context->parser_state = HFP_PARSER_CMD_HEADER;
context->parser_item_index = 0;
break;
}
case HFP_CMD_AVAILABLE_CODECS:
printf("Parsed codec %s\n", context->line_buffer);
context->remote_codecs[context->parser_item_index] = (uint16_t)atoi((char*)context->line_buffer);
context->parser_item_index++;
context->remote_codecs_nr = context->parser_item_index;
break;
case HFP_CMD_INDICATOR:
if (context->retrieve_ag_indicators_status == 0) break;
printf("Parsed Indicator %d with status: %s\n", context->parser_item_index+1, context->line_buffer);
context->ag_indicators[context->parser_item_index].status = atoi((char *) context->line_buffer);
context->parser_item_index++;
break;
case HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE:
if (context->parser_item_index == 3){
printf("Parsed Enable indicators: %s\n", context->line_buffer);
value = atoi((char *)&context->line_buffer[0]);
context->enable_status_update_for_ag_indicators = (uint8_t) value;
} else {
context->parser_item_index++;
}
break;
case HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES:
printf("Parsed Support call hold: %s\n", context->line_buffer);
if (context->line_size > 2 ) break;
strcpy((char *)context->remote_call_services[context->remote_call_services_nr].name, (char *)context->line_buffer);
context->remote_call_services_nr++;
if (byte == ')'){
context->parser_state = HFP_PARSER_CMD_HEADER;
context->parser_item_index = 0;
}
break;
case HFP_CMD_GENERIC_STATUS_INDICATOR:
printf("parser HFP_CMD_GENERIC_STATUS_INDICATOR 1 (%d, %d, %d)\n",
context->list_generic_status_indicators,
context->retrieve_generic_status_indicators,
context->retrieve_generic_status_indicators_state);
if (context->retrieve_generic_status_indicators == 1 || context->list_generic_status_indicators == 1){
printf("Parsed Generic status indicator: %s\n", context->line_buffer);
context->generic_status_indicators[context->parser_item_index].uuid = (uint16_t)atoi((char*)context->line_buffer);
context->parser_item_index++;
context->generic_status_indicators_nr = context->parser_item_index;
break;
}
printf("parser HFP_CMD_GENERIC_STATUS_INDICATOR 2\n");
if (context->retrieve_generic_status_indicators_state == 1){
// HF parses inital AG gen. ind. state
printf("Parsed List generic status indicator %s state: ", context->line_buffer);
context->parser_state = HFP_PARSER_SECOND_ITEM;
context->parser_item_index = (uint8_t)atoi((char*)context->line_buffer);
break;
}
break;
case HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE:
// AG parses new gen. ind. state
printf("Parsed Enable ag indicator state: %s\n", context->line_buffer);
value = atoi((char *)&context->line_buffer[0]);
if (!context->ag_indicators[context->parser_item_index].mandatory){
context->ag_indicators[context->parser_item_index].enabled = value;
}
context->parser_item_index++;
break;
case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS:
// indicators are indexed starting with 1
context->parser_item_index = atoi((char *)&context->line_buffer[0]) - 1;
context->parser_state = HFP_PARSER_SECOND_ITEM;
printf("Parsed status of the AG indicator %d, status ", context->parser_item_index);
break;
case HFP_CMD_QUERY_OPERATOR_SELECTION:
context->parser_state = HFP_PARSER_SECOND_ITEM;
context->line_size = 0;
if (context->operator_name_format == 1){
if (context->line_buffer[0] == '3'){
printf("Parsed Set network operator format : %s, ", context->line_buffer);
break;
}
// TODO emit ERROR, wrong format
printf("ERROR Set network operator format: index %s not supported\n", context->line_buffer);
break;
}
if (context->operator_name == 1) {
context->network_operator.mode = atoi((char *)&context->line_buffer[0]);
printf("Parsed network operator mode: %d, ", context->network_operator.mode);
break;
}
break;
default:
break;
}
context->line_size = 0;
if (byte == '\n' || byte == '\r'){
context->parser_state = HFP_PARSER_CMD_HEADER;
context->parser_item_index = 0;
break;
}
context->line_buffer[context->line_size++] = byte;
break;
case HFP_PARSER_SECOND_ITEM: