]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-6172 --resolve mod_rayo: fire input-timers-started during prompt lifecycle
authorChris Rienzo <chris.rienzo@grasshopper.com>
Fri, 31 Jan 2014 18:40:39 +0000 (13:40 -0500)
committerChris Rienzo <chris.rienzo@grasshopper.com>
Fri, 31 Jan 2014 18:41:29 +0000 (13:41 -0500)
src/mod/event_handlers/mod_rayo/rayo_prompt_component.c

index c35b1cfe3d84d5c654711ab404b8ce6616fcb641..9eec428eab45dd084305d4f6b686e365e2f70825 100644 (file)
@@ -64,6 +64,7 @@ struct prompt_component {
        iks *complete;
        const char *input_jid;
        const char *output_jid;
+       const char *start_timers_request_id;
 };
 
 #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";
 }
 
+/**
+ * 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
  */
@@ -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, "to", prompt->input_jid);
        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");
        iks_insert_attrib(x, "xmlns", RAYO_INPUT_NS);
        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:
                        PROMPT_COMPONENT(prompt)->input_jid = switch_core_strdup(RAYO_POOL(prompt), msg->from_jid);
                        PROMPT_COMPONENT(prompt)->state = PCS_INPUT;
+                       rayo_component_send_input_timers_started_event(RAYO_COMPONENT(prompt));
                        break;
                case PCS_START_INPUT_OUTPUT:
                        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)
 {
@@ -451,11 +468,15 @@ static iks *prompt_component_handle_result(struct rayo_actor *prompt, struct ray
        iks *iq = msg->payload;
 
        /* 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, "to", RAYO_COMPONENT(prompt)->client_jid);
                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;
 }