char *parsed = NULL;
switch_event_create_brackets(h->originate_string, '{', '}', ',', &ovars, &parsed);
+ switch_event_del_header(ovars, "fifo_outbound_uuid");
if (!h->timeout) h->timeout = 60;
if (timeout < h->timeout) timeout = h->timeout;
}
+static switch_status_t hanguphook(switch_core_session_t *session)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ switch_channel_state_t state = switch_channel_get_state(channel);
+ const char *uuid = NULL;
+ char sql[256] = "";
+
+ if (state == CS_HANGUP || state == CS_ROUTING) {
+ if ((uuid = switch_channel_get_variable(channel, "fifo_outbound_uuid"))) {
+ switch_snprintf(sql, sizeof(sql), "update fifo_outbound set use_count=use_count-1, "
+ "outbound_call_count=outbound_call_count+1, next_avail=%ld + lag where uuid='%s'",
+ (long)switch_epoch_time_now(NULL), uuid);
+
+ fifo_execute_sql(sql, globals.sql_mutex);
+ }
+ switch_core_event_hook_remove_state_change(session, hanguphook);
+ }
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
+SWITCH_STANDARD_APP(fifo_member_usage_function)
+{
+ char *sql;
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+
+ if (zstr(data)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid!\n");
+ return;
+ }
+
+ switch_channel_set_variable(channel, "fifo_outbound_uuid", data);
+ sql = switch_mprintf("update fifo_outbound set use_count=use_count+1,outbound_fail_count=0 where uuid='%s'", data);
+
+ fifo_execute_sql(sql, globals.sql_mutex);
+ switch_safe_free(sql);
+
+ switch_core_event_hook_add_state_change(session, hanguphook);
+
+}
typedef enum {
STRAT_MORE_PPL,
");\n"
;
+
+
+static void extract_fifo_outbound_uuid(char *string, char *uuid, switch_size_t len)
+{
+ switch_event_t *ovars;
+ char *parsed = NULL;
+ const char *fifo_outbound_uuid;
+
+ switch_event_create(&ovars, SWITCH_EVENT_REQUEST_PARAMS);
+
+ switch_event_create_brackets(string, '{', '}', ',', &ovars, &parsed);
+
+ if ((fifo_outbound_uuid = switch_event_get_header(ovars, "fifo_outbound_uuid"))) {
+ switch_snprintf(uuid, len, "%s", fifo_outbound_uuid);
+ }
+
+ switch_safe_free(parsed);
+ switch_event_destroy(&ovars);
+}
+
static switch_status_t load_config(int reload, int del_all)
{
char *cf = "fifo.conf";
const char *taking_calls = switch_xml_attr_soft(member, "taking_calls");
char *name_dup, *p;
char digest[SWITCH_MD5_DIGEST_STRING_SIZE] = { 0 };
- switch_md5_string(digest, (void *) member->txt, strlen(member->txt));
+ if (switch_stristr("fifo_outbound_uuid=", member->txt)) {
+ extract_fifo_outbound_uuid(member->txt, digest, sizeof(digest));
+ } else {
+ switch_md5_string(digest, (void *) member->txt, strlen(member->txt));
+ }
+
if (simo) {
simo_i = atoi(simo);
}
char *sql, *name_dup, *p;
fifo_node_t *node = NULL;
- switch_md5_string(digest, (void *) originate_string, strlen(originate_string));
+ if (switch_stristr("fifo_outbound_uuid=", originate_string)) {
+ extract_fifo_outbound_uuid(originate_string, digest, sizeof(digest));
+ } else {
+ switch_md5_string(digest, (void *) originate_string, strlen(originate_string));
+ }
sql = switch_mprintf("delete from fifo_outbound where fifo_name='%q' and uuid = '%q'", fifo_name, digest);
switch_assert(sql);
callback_t cbt = { 0 };
fifo_node_t *node = NULL;
- switch_md5_string(digest, (void *) originate_string, strlen(originate_string));
+ if (switch_stristr("fifo_outbound_uuid=", originate_string)) {
+ extract_fifo_outbound_uuid(originate_string, digest, sizeof(digest));
+ } else {
+ switch_md5_string(digest, (void *) originate_string, strlen(originate_string));
+ }
sql = switch_mprintf("delete from fifo_outbound where fifo_name='%q' and uuid = '%q' and hostname='%q'", fifo_name, digest, globals.hostname);
switch_assert(sql);
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
SWITCH_ADD_APP(app_interface, "fifo", "Park with FIFO", FIFO_DESC, fifo_function, FIFO_USAGE, SAF_NONE);
+ SWITCH_ADD_APP(app_interface, "fifo_member_usage", "increment a member usage until the call ends",
+ "", fifo_member_usage_function, "<fifo_outbound_uuid>", SAF_NONE);
SWITCH_ADD_API(commands_api_interface, "fifo", "Return data about a fifo", fifo_api_function, FIFO_API_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "fifo_member", "Add members to a fifo", fifo_member_api_function, FIFO_MEMBER_API_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "fifo_add_outbound", "Add outbound members to a fifo", fifo_add_outbound_function, "<node> <url> [<priority>]");