FS-6172 --resolve mod_rayo: fire input-timers-started during prompt lifecycle

This commit is contained in:
Chris Rienzo 2014-01-31 13:40:39 -05:00
parent 59d10edd79
commit ce945c3f49
1 changed files with 24 additions and 3 deletions

View File

@ -64,6 +64,7 @@ struct prompt_component {
iks *complete; iks *complete;
const char *input_jid; const char *input_jid;
const char *output_jid; const char *output_jid;
const char *start_timers_request_id;
}; };
#define PROMPT_COMPONENT(x) ((struct prompt_component *)x) #define PROMPT_COMPONENT(x) ((struct prompt_component *)x)
@ -86,6 +87,20 @@ static const char *prompt_component_state_to_string(enum prompt_component_state
return "UNKNOWN"; return "UNKNOWN";
} }
/**
* Send input-timers-started event
*/
void rayo_component_send_input_timers_started_event(struct rayo_component *component)
{
iks *event = iks_new("presence");
iks *x;
iks_insert_attrib(event, "from", RAYO_JID(component));
iks_insert_attrib(event, "to", component->client_jid);
x = iks_insert(event, "input-timers-started");
iks_insert_attrib(x, "xmlns", RAYO_PROMPT_NS);
RAYO_SEND_REPLY(component, component->client_jid, event);
}
/** /**
* Send stop to component * Send stop to component
*/ */
@ -131,7 +146,8 @@ static void start_input_timers(struct prompt_component *prompt)
iks_insert_attrib(iq, "from", RAYO_JID(prompt)); iks_insert_attrib(iq, "from", RAYO_JID(prompt));
iks_insert_attrib(iq, "to", prompt->input_jid); iks_insert_attrib(iq, "to", prompt->input_jid);
iks_insert_attrib(iq, "type", "set"); iks_insert_attrib(iq, "type", "set");
iks_insert_attrib_printf(iq, "id", "mod_rayo-prompt-%d", RAYO_SEQ_NEXT(prompt)); prompt->start_timers_request_id = switch_core_sprintf(RAYO_POOL(prompt), "mod_rayo-prompt-%d", RAYO_SEQ_NEXT(prompt));
iks_insert_attrib(iq, "id", prompt->start_timers_request_id);
x = iks_insert(iq, "start-timers"); x = iks_insert(iq, "start-timers");
iks_insert_attrib(x, "xmlns", RAYO_INPUT_NS); iks_insert_attrib(x, "xmlns", RAYO_INPUT_NS);
RAYO_SEND_MESSAGE(prompt, prompt->input_jid, iq); RAYO_SEND_MESSAGE(prompt, prompt->input_jid, iq);
@ -186,6 +202,7 @@ static iks *prompt_component_handle_input_start(struct rayo_actor *prompt, struc
case PCS_START_INPUT: case PCS_START_INPUT:
PROMPT_COMPONENT(prompt)->input_jid = switch_core_strdup(RAYO_POOL(prompt), msg->from_jid); PROMPT_COMPONENT(prompt)->input_jid = switch_core_strdup(RAYO_POOL(prompt), msg->from_jid);
PROMPT_COMPONENT(prompt)->state = PCS_INPUT; PROMPT_COMPONENT(prompt)->state = PCS_INPUT;
rayo_component_send_input_timers_started_event(RAYO_COMPONENT(prompt));
break; break;
case PCS_START_INPUT_OUTPUT: case PCS_START_INPUT_OUTPUT:
PROMPT_COMPONENT(prompt)->input_jid = switch_core_strdup(RAYO_POOL(prompt), msg->from_jid); PROMPT_COMPONENT(prompt)->input_jid = switch_core_strdup(RAYO_POOL(prompt), msg->from_jid);
@ -235,7 +252,7 @@ static iks *prompt_component_handle_io_start(struct rayo_actor *prompt, struct r
} }
/** /**
* Handle barge event * Handle failure to start timers
*/ */
static iks *prompt_component_handle_input_start_timers_error(struct rayo_actor *prompt, struct rayo_message *msg, void *data) static iks *prompt_component_handle_input_start_timers_error(struct rayo_actor *prompt, struct rayo_message *msg, void *data)
{ {
@ -451,11 +468,15 @@ static iks *prompt_component_handle_result(struct rayo_actor *prompt, struct ray
iks *iq = msg->payload; iks *iq = msg->payload;
/* forward all results, except for internal ones... */ /* forward all results, except for internal ones... */
if (strncmp("mod_rayo-prompt", iks_find_attrib_soft(iq, "id"), 15)) { const char *id = iks_find_attrib_soft(iq, "id");
if (strncmp("mod_rayo-prompt", id, 15)) {
iks_insert_attrib(iq, "from", RAYO_JID(prompt)); iks_insert_attrib(iq, "from", RAYO_JID(prompt));
iks_insert_attrib(iq, "to", RAYO_COMPONENT(prompt)->client_jid); iks_insert_attrib(iq, "to", RAYO_COMPONENT(prompt)->client_jid);
RAYO_SEND_REPLY_DUP(prompt, RAYO_COMPONENT(prompt)->client_jid, iq); RAYO_SEND_REPLY_DUP(prompt, RAYO_COMPONENT(prompt)->client_jid, iq);
} else if (!strcmp(PROMPT_COMPONENT(prompt)->start_timers_request_id, id)) {
rayo_component_send_input_timers_started_event(RAYO_COMPONENT(prompt));
} }
return NULL; return NULL;
} }