]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
cancel outbound call if customer hangs up
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 7 Jul 2010 16:29:16 +0000 (11:29 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 7 Jul 2010 16:29:25 +0000 (11:29 -0500)
src/mod/applications/mod_fifo/mod_fifo.c

index 6d70d2b53efc8c810a5ec04aeda5b58c6701f7b9..f872ebfd63d0dc66992f3205d5e850deaefefb73 100644 (file)
@@ -194,7 +194,6 @@ static switch_status_t fifo_queue_pop_nameval(fifo_queue_t *queue, const char *n
        return SWITCH_STATUS_SUCCESS;
 }
 
-
 static switch_status_t fifo_queue_popfly(fifo_queue_t *queue, const char *uuid)
 {
        int i, j;
@@ -693,6 +692,12 @@ static void *SWITCH_THREAD_FUNC ringall_thread_run(switch_thread_t *thread, void
        fifo_queue_t *q = NULL;
        int x = 0;
        switch_event_t *event;
+       switch_uuid_t uuid;
+    char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1];
+
+    switch_uuid_get(&uuid);
+    switch_uuid_format(uuid_str, &uuid);
+
 
        if (!cbh->rowcount) {
                goto end;
@@ -797,10 +802,15 @@ static void *SWITCH_THREAD_FUNC ringall_thread_run(switch_thread_t *thread, void
                switch_event_add_header_string(ovars, SWITCH_STACK_BOTTOM, "fifo_bridge_uuid", id);
        }
 
+       switch_event_add_header_string(ovars, SWITCH_STACK_BOTTOM, "fifo_originate_uuid", uuid_str);
+
        if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FIFO_EVENT) == SWITCH_STATUS_SUCCESS) {
                switch_core_session_t *session;
                if (id && (session = switch_core_session_locate(id))) {
-                       switch_channel_event_set_data(switch_core_session_get_channel(session), event);
+                       switch_channel_t *channel = switch_core_session_get_channel(session);
+
+                       switch_channel_set_variable(channel, "fifo_originate_uuid", uuid_str);
+                       switch_channel_event_set_data(channel, event);
                        switch_core_session_rwunlock(session);
                }
 
@@ -817,8 +827,8 @@ static void *SWITCH_THREAD_FUNC ringall_thread_run(switch_thread_t *thread, void
 
                switch_event_fire(&event);
        }
-
        switch_mutex_unlock(q->mutex);
+       pop = NULL;
 
        status = switch_ivr_originate(NULL, &session, &cause, originate_string, timeout, NULL, NULL, NULL, NULL, ovars, SOF_NONE, NULL);
        
@@ -1097,11 +1107,13 @@ static void find_consumers(fifo_node_t *node)
                        }
 
                        fifo_execute_sql_callback(globals.sql_mutex, sql, place_call_ringall_callback, cbh);
-                       
-                       switch_threadattr_create(&thd_attr, cbh->pool);
-                       switch_threadattr_detach_set(thd_attr, 1);
-                       switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
-                       switch_thread_create(&thread, thd_attr, ringall_thread_run, cbh, cbh->pool);
+
+                       if (cbh->rowcount) {
+                               switch_threadattr_create(&thd_attr, cbh->pool);
+                               switch_threadattr_detach_set(thd_attr, 1);
+                               switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+                               switch_thread_create(&thread, thd_attr, ringall_thread_run, cbh, cbh->pool);
+                       }
 
                }
                break;
@@ -1183,6 +1195,23 @@ static int stop_node_thread(void)
        return 0;
 }
 
+static void check_ocancel(switch_core_session_t *session)
+{
+       switch_channel_t *channel;
+       const char *var;
+
+       switch_assert(session);
+
+       channel = switch_core_session_get_channel(session);
+
+       if ((var = switch_channel_get_variable(channel, "fifo_originate_uuid"))) {
+               switch_core_session_hupall_matching_var("fifo_originate_uuid", var, 
+                                                                                               switch_channel_test_flag(channel, CF_ANSWERED) ? 
+                                                                                               SWITCH_CAUSE_NORMAL_CLEARING : SWITCH_CAUSE_ORIGINATOR_CANCEL);
+       }
+}
+
+
 static void check_cancel(fifo_node_t *node)
 {
        int ppl_waiting = node_consumer_wait_count(node);
@@ -1191,7 +1220,7 @@ static void check_cancel(fifo_node_t *node)
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Outbound call count (%d) exceeds required value for queue %s (%d), "
                                                  "Ending extraneous calls\n", node->ring_consumer_count, node->name, ppl_waiting);
 
-
+               
                switch_core_session_hupall_matching_var("fifo_hangup_check", node->name, SWITCH_CAUSE_ORIGINATOR_CANCEL);
        }
 }
@@ -1660,6 +1689,8 @@ SWITCH_STANDARD_APP(fifo_function)
                        switch_ivr_session_transfer(session, cd.orbit_exten, cd.orbit_dialplan, cd.orbit_context);
                }
 
+               check_ocancel(session);
+
                goto done;
 
        } else {                                        /* consumer */