Updated the gadget bridge parser
This commit is contained in:
parent
23f592bcc1
commit
edb127e626
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user