Updated the gadget bridge parser

This commit is contained in:
Th3maz1ng 2023-05-14 22:10:13 +02:00
parent 23f592bcc1
commit edb127e626
2 changed files with 118 additions and 11 deletions

View File

@ -31,6 +31,9 @@ typedef enum gadget_bridge_parser_fsm
GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE, GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE,
GADGET_BRIDGE_PARSER_FSM_PARSING_TITLE_CONTENT, GADGET_BRIDGE_PARSER_FSM_PARSING_TITLE_CONTENT,
GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT,
GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT,
GADGET_BRIDGE_PARSER_FSM_FOUND_ID_SRC, GADGET_BRIDGE_PARSER_FSM_FOUND_ID_SRC,
GADGET_BRIDGE_PARSER_FSM_FOUND_SRC_BODY, GADGET_BRIDGE_PARSER_FSM_FOUND_SRC_BODY,
GADGET_BRIDGE_PARSER_FSM_PARSING_BODY_CONTENT, GADGET_BRIDGE_PARSER_FSM_PARSING_BODY_CONTENT,
@ -244,7 +247,7 @@ static bool _parser_extract_bool(char *start, char *end, bool *data);
gadget_bridge_parser_code_e gadget_bridge_parser_run(void) gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
{ {
if(!_gadget_bridge_internals.new_data) return GADGET_BRIDGE_PARSER_CODE_OK; if(!_gadget_bridge_internals.new_data) return GADGET_BRIDGE_PARSER_CODE_OK;
char *start = NULL, *end = NULL; char *start = NULL, *end = NULL, *end2 = NULL; // end2 is used when more than one next tag is possible
bool free_some_space = false; bool free_some_space = false;
gadget_bridge_parser_code_e to_return = GADGET_BRIDGE_PARSER_CODE_PARSING; gadget_bridge_parser_code_e to_return = GADGET_BRIDGE_PARSER_CODE_PARSING;
@ -427,10 +430,20 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
else to_return = GADGET_BRIDGE_PARSER_CODE_OK; else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
break; break;
case GADGET_BRIDGE_PARSER_FSM_FOUND_ID_SRC: case GADGET_BRIDGE_PARSER_FSM_FOUND_ID_SRC:
if((start = strstr(_gadget_bridge_internals.buffer, "src:")) if((start = strstr(_gadget_bridge_internals.buffer, "src:")) &&
&& (end = strstr(_gadget_bridge_internals.buffer, ",title"))) ((end = strstr(_gadget_bridge_internals.buffer, ",title")) || (end2 = strstr(_gadget_bridge_internals.buffer, ",subject"))))
{
if((end && !end2) || (end != NULL && end < end2))
{ {
//printf("###Found TITLE\n"); //printf("###Found TITLE\n");
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE;
}
else if((!end && end2) || (end2 != NULL && end2 < end))
{
//printf("###Found SUBJECT\n");
end = end2;
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT;
}
_parser_extract_src(start + 5, end - 1); _parser_extract_src(start + 5, end - 1);
@ -439,7 +452,6 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
_parser_free_buffer( _parser_free_buffer(
end -_gadget_bridge_internals.buffer end -_gadget_bridge_internals.buffer
); );
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE;
} }
else if((start = strstr(_gadget_bridge_internals.buffer, "GB("))) else if((start = strstr(_gadget_bridge_internals.buffer, "GB(")))
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE; _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
@ -486,7 +498,7 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
// Then we have a very long title, in this case we juste keep the max set up // Then we have a very long title, in this case we juste keep the max set up
else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_TITLE_SIZE) else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_TITLE_SIZE)
{ {
printf("###NOTIFICATION (MAX TITLE SIZE)\n"); //printf("###NOTIFICATION (MAX TITLE SIZE)\n");
_parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_TITLE_SIZE, &_gadget_bridge_internals.event_data.notification.title); _parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_TITLE_SIZE, &_gadget_bridge_internals.event_data.notification.title);
@ -511,6 +523,10 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
_parser_free_buffer( _parser_free_buffer(
start -_gadget_bridge_internals.buffer start -_gadget_bridge_internals.buffer
); );
if(_gadget_bridge_internals.event_data.notification.notification_type == GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE)
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT;
else
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_BODY_CONTENT; _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_BODY_CONTENT;
} }
else if((start = strstr(_gadget_bridge_internals.buffer, "GB("))) else if((start = strstr(_gadget_bridge_internals.buffer, "GB(")))
@ -551,7 +567,64 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
// Then we have a very long body, in this case we juste keep the max set up // Then we have a very long body, in this case we juste keep the max set up
else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_BODY_SIZE) else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_BODY_SIZE)
{ {
//printf("###NOTIFICATION (MAX BODY SIZE) Type done\n"); // printf("###NOTIFICATION (MAX BODY SIZE) Type done\n");
_parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_BODY_SIZE, &_gadget_bridge_internals.event_data.notification.body);
// We remove the parsed part from the buffer
_parser_free_buffer(
GADGET_BRIDGE_PARSER_MAX_BODY_SIZE + 1
);
// If a callback was registered, we call it and pass the data to it
if(_gadget_bridge_internals.parser_event_callback)
{
_gadget_bridge_internals.parser_event_callback(&_gadget_bridge_internals.event_data);
}
// Free the allocated data
_free_event_data();
// The end of the road for this object
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
}
else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
}
break;
case GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT:
{
end = strstr(_gadget_bridge_internals.buffer, ",sender");
if(end)
{
// We don't care about the sender nor the tel tag
//printf("###TEST NOTIFICATION Type done\n");
_parser_extract_char_str(_gadget_bridge_internals.buffer, end - 1, &_gadget_bridge_internals.event_data.notification.body);
// We remove the parsed part from the buffer
end += 7;
_parser_free_buffer(
end -_gadget_bridge_internals.buffer
);
// If a callback was registered, we call it and pass the data to it
if(_gadget_bridge_internals.parser_event_callback)
{
_gadget_bridge_internals.parser_event_callback(&_gadget_bridge_internals.event_data);
}
// Free the allocated data
_free_event_data();
// The end of the road for this object
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
}
else if((start = strstr(_gadget_bridge_internals.buffer, "GB(")))
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
// Then we have a very long body, in this case we juste keep the max set up
else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_BODY_SIZE)
{
//printf("###TEST NOTIFICATION (MAX BODY SIZE) Type done\n");
_parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_BODY_SIZE, &_gadget_bridge_internals.event_data.notification.body); _parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_BODY_SIZE, &_gadget_bridge_internals.event_data.notification.body);
@ -632,6 +705,24 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE; _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
break;*/ break;*/
case GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT:
if((start = strstr(_gadget_bridge_internals.buffer, "subject:")))
{
//printf("###Parsing SUBJECT content\n");
// We remove the parsed part from the buffer
start += 9;
_parser_free_buffer(
start -_gadget_bridge_internals.buffer
);
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_TITLE_CONTENT;
}
else if((start = strstr(_gadget_bridge_internals.buffer, "GB(")))
_gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE;
else if(_gadget_bridge_internals.buffer_content_size > GADGET_BRIDGE_PARSER_BUFFER_THRESHOLD)
free_some_space = true;
else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
break;
case GADGET_BRIDGE_PARSER_FSM_FOUND_CALL: case GADGET_BRIDGE_PARSER_FSM_FOUND_CALL:
if((start = strstr(_gadget_bridge_internals.buffer, "cmd:")) if((start = strstr(_gadget_bridge_internals.buffer, "cmd:"))
&& (end = strstr(_gadget_bridge_internals.buffer, ",name"))) && (end = strstr(_gadget_bridge_internals.buffer, ",name")))
@ -1024,10 +1115,14 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void)
else to_return = GADGET_BRIDGE_PARSER_CODE_OK; else to_return = GADGET_BRIDGE_PARSER_CODE_OK;
break; break;
case GADGET_BRIDGE_PARSER_FSM_FOUND_MUSICINFO: case GADGET_BRIDGE_PARSER_FSM_FOUND_MUSICINFO:
if((start = strstr(_gadget_bridge_internals.buffer, "artist:")) if((start = strstr(_gadget_bridge_internals.buffer, "artist:")) &&
&& (end = strstr(_gadget_bridge_internals.buffer, ",track"))) (end = strstr(_gadget_bridge_internals.buffer, ",track")))
{ {
end2 = strstr(_gadget_bridge_internals.buffer, ",album");
//printf("###Found TRACK\n"); //printf("###Found TRACK\n");
if(end2 != NULL && end2 < end)
_parser_extract_char_str(start + 8, end2 - 1, &_gadget_bridge_internals.event_data.music_info.artist);
else
_parser_extract_char_str(start + 8, end - 1, &_gadget_bridge_internals.event_data.music_info.artist); _parser_extract_char_str(start + 8, end - 1, &_gadget_bridge_internals.event_data.music_info.artist);
// We remove the parsed part from the buffer // We remove the parsed part from the buffer
@ -1152,6 +1247,8 @@ const char *gadget_bridge_notification_type_2_str(gadget_bridge_notification_typ
{ {
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_SMS) CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_SMS)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL) CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE)
CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN) CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN)
default: default:
return "Unknown notification type"; return "Unknown notification type";
@ -1164,6 +1261,7 @@ const char *gadget_bridge_music_state_2_str(gadget_bridge_music_state_e music_st
{ {
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PAUSE) CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PAUSE)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PLAY) CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PLAY)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_STOP)
CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_UNKNOWN) CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_UNKNOWN)
default: default:
return "Unknown music state"; return "Unknown music state";
@ -1323,10 +1421,14 @@ static void _parser_extract_tel(char *start, char *end)
static void _parser_extract_src(char *start, char *end) static void _parser_extract_src(char *start, char *end)
{ {
*end = '\0'; *end = '\0';
if(strcmp(start, "Messages") == 0) if(strcasecmp(start, "Messages") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_SMS; _gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_SMS;
else if(strcmp(start, "E-mail") == 0) else if(strcasecmp(start, "E-mail") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL; _gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL;
else if(strcasecmp(start, "WhatsApp") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP;
else if(strcasecmp(start, "Gadgetbridge") == 0)
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE;
else else
_gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN; _gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN;
@ -1363,6 +1465,8 @@ static void _parser_extract_state(char *start, char *end)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PLAY; _gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PLAY;
else if(strcmp(start, "pause") == 0) else if(strcmp(start, "pause") == 0)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PAUSE; _gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PAUSE;
else if(strcmp(start, "stop") == 0)
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_STOP;
else else
_gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_UNKNOWN; _gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_UNKNOWN;

View File

@ -129,6 +129,8 @@ typedef enum gadget_bridge_notification_type
{ {
GADGET_BRIDGE_NOTIFICATION_TYPE_SMS = 0, GADGET_BRIDGE_NOTIFICATION_TYPE_SMS = 0,
GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL, GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL,
GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP,
GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE,
GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN, GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN,
} gadget_bridge_notification_type_e; } gadget_bridge_notification_type_e;
@ -136,6 +138,7 @@ typedef enum
{ {
GADGET_BRIDGE_MUSIC_STATE_PAUSE = 0, GADGET_BRIDGE_MUSIC_STATE_PAUSE = 0,
GADGET_BRIDGE_MUSIC_STATE_PLAY, GADGET_BRIDGE_MUSIC_STATE_PLAY,
GADGET_BRIDGE_MUSIC_STATE_STOP,
GADGET_BRIDGE_MUSIC_STATE_UNKNOWN, GADGET_BRIDGE_MUSIC_STATE_UNKNOWN,
} gadget_bridge_music_state_e; } gadget_bridge_music_state_e;