typedef struct caller_control_actions {
char *binded_dtmf;
- void *data;
+ char *data;
+ char *expanded_data;
} caller_control_action_t;
typedef struct caller_control_menu_info {
conference_add_event_member_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "dtmf");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "DTMF-Key", action->binded_dtmf);
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Data", action->data);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Data", action->expanded_data);
switch_event_fire(&event);
}
}
if (test_eflag(member->conference, EFLAG_DTMF) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_add_event_member_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "transfer");
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Dialplan", action->data);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Dialplan", action->expanded_data);
switch_event_fire(&event);
}
switch_clear_flag_locked(member, MFLAG_RUNNING);
- if ((mydata = switch_core_session_strdup(member->session, action->data))) {
+ if ((mydata = switch_core_session_strdup(member->session, action->expanded_data))) {
if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
if (argc > 0) {
exten = argv[0];
}
} else {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Empty transfer string [%s]\n", (char *) action->data);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Empty transfer string [%s]\n", (char *) action->expanded_data);
goto done;
}
} else {
switch_event_t *event = NULL;
switch_channel_t *channel = NULL;
+ if (!action->expanded_data) return;
+
if (test_eflag(member->conference, EFLAG_DTMF) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_add_event_member_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "execute_app");
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Application", action->data);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Application", action->expanded_data);
switch_event_fire(&event);
}
- if ((mydata = switch_core_session_strdup(member->session, action->data))) {
+ if ((mydata = switch_core_session_strdup(member->session, action->expanded_data))) {
if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
if (argc > 0) {
app = argv[0];
}
} else {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Empty execute app string [%s]\n", (char *) action->data);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Empty execute app string [%s]\n",
+ (char *) action->expanded_data);
goto done;
}
} else {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Unable to find application.\n");
goto done;
}
+
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_DEBUG, "Execute app: %s, %s\n", app, arg);
channel = switch_core_session_get_channel(member->session);
switch_core_session_set_read_codec(member->session, &member->read_codec);
switch_channel_clear_app_flag(channel, CF_APP_TAGGED);
done:
+
return;
}
static switch_status_t dmachine_dispatcher(switch_ivr_dmachine_match_t *match)
{
key_binding_t *binding = match->user_data;
+ switch_channel_t *channel;
if (!binding) return SWITCH_STATUS_FALSE;
+ channel = switch_core_session_get_channel(binding->member->session);
+ switch_channel_set_variable(channel, "conference_last_matching_digits", match->match_digits);
+
+ if (binding->action.data) {
+ binding->action.expanded_data = switch_channel_expand_variables(channel, binding->action.data);
+ }
+
binding->handler(binding->member, &binding->action);
+
+ if (binding->action.expanded_data != binding->action.data) {
+ free(binding->action.expanded_data);
+ binding->action.expanded_data = NULL;
+ }
+
switch_set_flag_locked(binding->member, MFLAG_FLUSH_BUFFER);
return SWITCH_STATUS_SUCCESS;
}
-static void do_binding(conference_member_t *member, conf_key_callback_t handler, const char *digits, void *data)
+static void do_binding(conference_member_t *member, conf_key_callback_t handler, const char *digits, const char *data)
{
key_binding_t *binding;
binding->action.binded_dtmf = switch_core_strdup(member->pool, digits);
if (data) {
- binding->action.data = switch_core_strdup(member->pool, (char *)data);
+ binding->action.data = switch_core_strdup(member->pool, data);
}
binding->handler = handler;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s binding '%s' to '%s'\n",
switch_core_session_get_name(member->session), digits, key);
- do_binding(member, control_mappings[i].handler, digits, (void *) data);
+ do_binding(member, control_mappings[i].handler, digits, data);
}
}
}