improve group_confirm:
group_confirm_read_timeout=<ms> group_confirm_file=<file> group_confirm_error_file=<file> group_confirm_key=<now can be one or more keys> git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16980 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
2f8b5c84e2
commit
2d47baee43
|
@ -99,6 +99,8 @@ typedef struct {
|
||||||
int32_t idx;
|
int32_t idx;
|
||||||
uint32_t hups;
|
uint32_t hups;
|
||||||
char file[512];
|
char file[512];
|
||||||
|
char error_file[512];
|
||||||
|
int confirm_timeout;
|
||||||
char key[80];
|
char key[80];
|
||||||
uint8_t early_ok;
|
uint8_t early_ok;
|
||||||
uint8_t ring_ready;
|
uint8_t ring_ready;
|
||||||
|
@ -133,6 +135,8 @@ typedef enum {
|
||||||
struct key_collect {
|
struct key_collect {
|
||||||
char *key;
|
char *key;
|
||||||
char *file;
|
char *file;
|
||||||
|
char *error_file;
|
||||||
|
int confirm_timeout;
|
||||||
switch_core_session_t *session;
|
switch_core_session_t *session;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -141,7 +145,6 @@ static void *SWITCH_THREAD_FUNC collect_thread_run(switch_thread_t *thread, void
|
||||||
struct key_collect *collect = (struct key_collect *) obj;
|
struct key_collect *collect = (struct key_collect *) obj;
|
||||||
switch_channel_t *channel = switch_core_session_get_channel(collect->session);
|
switch_channel_t *channel = switch_core_session_get_channel(collect->session);
|
||||||
char buf[10] = SWITCH_BLANK_STRING;
|
char buf[10] = SWITCH_BLANK_STRING;
|
||||||
char *p, term;
|
|
||||||
switch_application_interface_t *application_interface = NULL;
|
switch_application_interface_t *application_interface = NULL;
|
||||||
|
|
||||||
if (collect->session) {
|
if (collect->session) {
|
||||||
|
@ -194,28 +197,33 @@ static void *SWITCH_THREAD_FUNC collect_thread_run(switch_thread_t *thread, void
|
||||||
}
|
}
|
||||||
|
|
||||||
while (switch_channel_ready(channel)) {
|
while (switch_channel_ready(channel)) {
|
||||||
|
switch_size_t len = strlen(collect->key);
|
||||||
|
const char *file = collect->file;
|
||||||
|
switch_status_t status;
|
||||||
|
|
||||||
memset(buf, 0, sizeof(buf));
|
memset(buf, 0, sizeof(buf));
|
||||||
|
|
||||||
if (collect->file) {
|
if (zstr(file)) {
|
||||||
switch_status_t status;
|
file = "silence";
|
||||||
switch_input_args_t args = { 0 };
|
}
|
||||||
args.buf = buf;
|
|
||||||
args.buflen = sizeof(buf);
|
status = switch_ivr_read(collect->session,
|
||||||
status = switch_ivr_play_file(collect->session, NULL, collect->file, &args);
|
len,
|
||||||
if (!SWITCH_READ_ACCEPTABLE(status)) {
|
len,
|
||||||
|
collect->file, NULL, buf, sizeof(buf), collect->confirm_timeout, "#");
|
||||||
|
|
||||||
|
|
||||||
|
if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK && status != SWITCH_STATUS_TOO_SMALL) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(collect->session), SWITCH_LOG_ERROR, "%s Error Playing File!",
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(collect->session), SWITCH_LOG_ERROR, "%s Error Playing File!",
|
||||||
switch_channel_get_name(channel));
|
switch_channel_get_name(channel));
|
||||||
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
|
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
switch_ivr_collect_digits_count(collect->session, buf, sizeof(buf), 1, SWITCH_BLANK_STRING, &term, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (p = buf; *p; p++) {
|
if (!strcmp(collect->key, buf)) {
|
||||||
if (*collect->key == *p) {
|
|
||||||
switch_channel_set_flag(channel, CF_WINNER);
|
switch_channel_set_flag(channel, CF_WINNER);
|
||||||
goto wbreak;
|
goto wbreak;
|
||||||
}
|
} else if (collect->error_file) {
|
||||||
|
switch_ivr_play_file(collect->session, NULL, collect->error_file, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wbreak:
|
wbreak:
|
||||||
|
@ -625,6 +633,16 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
||||||
if (!zstr(oglobals->file)) {
|
if (!zstr(oglobals->file)) {
|
||||||
collect->file = switch_core_session_strdup(originate_status[i].peer_session, oglobals->file);
|
collect->file = switch_core_session_strdup(originate_status[i].peer_session, oglobals->file);
|
||||||
}
|
}
|
||||||
|
if (!zstr(oglobals->error_file)) {
|
||||||
|
collect->error_file = switch_core_session_strdup(originate_status[i].peer_session, oglobals->error_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (oglobals->confirm_timeout) {
|
||||||
|
collect->confirm_timeout = oglobals->confirm_timeout;
|
||||||
|
} else {
|
||||||
|
collect->confirm_timeout = 5000;
|
||||||
|
}
|
||||||
|
|
||||||
switch_channel_audio_sync(originate_status[i].peer_channel);
|
switch_channel_audio_sync(originate_status[i].peer_channel);
|
||||||
collect->session = originate_status[i].peer_session;
|
collect->session = originate_status[i].peer_session;
|
||||||
launch_collect_thread(collect);
|
launch_collect_thread(collect);
|
||||||
|
@ -1987,6 +2005,17 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
|
||||||
if ((var = switch_event_get_header(var_event, "group_confirm_file"))) {
|
if ((var = switch_event_get_header(var_event, "group_confirm_file"))) {
|
||||||
switch_copy_string(oglobals.file, var, sizeof(oglobals.file));
|
switch_copy_string(oglobals.file, var, sizeof(oglobals.file));
|
||||||
}
|
}
|
||||||
|
if ((var = switch_event_get_header(var_event, "group_confirm_error_file"))) {
|
||||||
|
switch_copy_string(oglobals.error_file, var, sizeof(oglobals.error_file));
|
||||||
|
}
|
||||||
|
if ((var = switch_event_get_header(var_event, "group_confirm_read_timeout"))) {
|
||||||
|
int tmp = atoi(var);
|
||||||
|
|
||||||
|
if (tmp >= 0) {
|
||||||
|
oglobals.confirm_timeout = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* When using the AND operator, the fail_on_single_reject flag may be set in order to indicate that a single
|
/* When using the AND operator, the fail_on_single_reject flag may be set in order to indicate that a single
|
||||||
rejections should terminate the attempt rather than a timeout, answer, or rejection by all.
|
rejections should terminate the attempt rather than a timeout, answer, or rejection by all.
|
||||||
|
@ -2002,6 +2031,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
|
||||||
*oglobals.file = '\0';
|
*oglobals.file = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((*oglobals.error_file != '\0') && (!strcmp(oglobals.error_file, "undef"))) {
|
||||||
|
*oglobals.error_file = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
if ((var_val = switch_event_get_header(var_event, "bridge_early_media"))) {
|
if ((var_val = switch_event_get_header(var_event, "bridge_early_media"))) {
|
||||||
if (switch_true(var_val)) {
|
if (switch_true(var_val)) {
|
||||||
oglobals.early_ok = 0;
|
oglobals.early_ok = 0;
|
||||||
|
|
Loading…
Reference in New Issue