mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-24 13:12:03 +00:00
add new execute_extension application to execute another extension in the current scope
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4993 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
@@ -36,6 +36,7 @@
|
||||
static const char modname[] = "mod_dptools";
|
||||
|
||||
static const switch_application_interface_t detect_speech_application_interface;
|
||||
static const switch_application_interface_t exe_application_interface;
|
||||
|
||||
static void detect_speech_function(switch_core_session_t *session, char *data)
|
||||
{
|
||||
@@ -64,6 +65,26 @@ static void detect_speech_function(switch_core_session_t *session, char *data)
|
||||
|
||||
}
|
||||
|
||||
static void exe_function(switch_core_session_t *session, char *data)
|
||||
{
|
||||
char *argv[4];
|
||||
int argc;
|
||||
char *lbuf = NULL;
|
||||
char *extension;
|
||||
char *context;
|
||||
char *dialplan;
|
||||
|
||||
if (data && (lbuf = switch_core_session_strdup(session, data))
|
||||
&& (argc = switch_separate_string(lbuf, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
|
||||
extension = argv[0];
|
||||
dialplan = argv[1];
|
||||
context = argv[2];
|
||||
switch_core_session_execute_exten(session, extension, dialplan, context);
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", exe_application_interface.syntax);
|
||||
}
|
||||
}
|
||||
|
||||
static void ring_ready_function(switch_core_session_t *session, char *data)
|
||||
{
|
||||
switch_channel_t *channel;
|
||||
@@ -606,7 +627,7 @@ static void ivr_application_function(switch_core_session_t *session, char *data)
|
||||
}
|
||||
|
||||
|
||||
static switch_api_interface_t strepoch_api_interface = {
|
||||
static const switch_api_interface_t strepoch_api_interface = {
|
||||
/*.interface_name */ "strepoch",
|
||||
/*.desc */ "Convert a date string into epoch time",
|
||||
/*.function */ strepoch_api_function,
|
||||
@@ -614,7 +635,7 @@ static switch_api_interface_t strepoch_api_interface = {
|
||||
/*.next */ NULL
|
||||
};
|
||||
|
||||
static switch_api_interface_t chat_api_interface = {
|
||||
static const switch_api_interface_t chat_api_interface = {
|
||||
/*.interface_name */ "chat",
|
||||
/*.desc */ "chat",
|
||||
/*.function */ chat_api_function,
|
||||
@@ -622,7 +643,7 @@ static switch_api_interface_t chat_api_interface = {
|
||||
/*.next */ &strepoch_api_interface
|
||||
};
|
||||
|
||||
static switch_api_interface_t dptools_api_interface = {
|
||||
static const switch_api_interface_t dptools_api_interface = {
|
||||
/*.interface_name */ "strftime",
|
||||
/*.desc */ "strftime",
|
||||
/*.function */ strftime_api_function,
|
||||
@@ -630,7 +651,7 @@ static switch_api_interface_t dptools_api_interface = {
|
||||
/*.next */ &chat_api_interface
|
||||
};
|
||||
|
||||
static switch_api_interface_t presence_api_interface = {
|
||||
static const switch_api_interface_t presence_api_interface = {
|
||||
/*.interface_name */ "presence",
|
||||
/*.desc */ "presence",
|
||||
/*.function */ presence_api_function,
|
||||
@@ -639,18 +660,27 @@ static switch_api_interface_t presence_api_interface = {
|
||||
};
|
||||
|
||||
|
||||
static const switch_application_interface_t exe_application_interface = {
|
||||
/*.interface_name */ "execute_extension",
|
||||
/*.application_function */ exe_function,
|
||||
/*.long_desc */ "Execute an extension",
|
||||
/*.short_desc */ "Execute an extension",
|
||||
/*.syntax */ "<extension> <dialplan> <context>",
|
||||
/* flags */ SAF_SUPPORT_NOMEDIA,
|
||||
/*.next */
|
||||
};
|
||||
|
||||
static switch_application_interface_t sched_transfer_application_interface = {
|
||||
static const switch_application_interface_t sched_transfer_application_interface = {
|
||||
/*.interface_name */ "sched_transfer",
|
||||
/*.application_function */ sched_transfer_function,
|
||||
/*.long_desc */ "Schedule a transfer in the future",
|
||||
/*.short_desc */ "Schedule a transfer in the future",
|
||||
/*.syntax */ "[+]<time> <extension> <dialplan> <context>",
|
||||
/* flags */ SAF_SUPPORT_NOMEDIA,
|
||||
/*.next */ NULL
|
||||
/*.next */ &exe_application_interface
|
||||
};
|
||||
|
||||
static switch_application_interface_t sched_broadcast_application_interface = {
|
||||
static const switch_application_interface_t sched_broadcast_application_interface = {
|
||||
/*.interface_name */ "sched_broadcast",
|
||||
/*.application_function */ sched_broadcast_function,
|
||||
/*.long_desc */ "Schedule a broadcast in the future",
|
||||
@@ -660,7 +690,7 @@ static switch_application_interface_t sched_broadcast_application_interface = {
|
||||
/*.next */ &sched_transfer_application_interface
|
||||
};
|
||||
|
||||
static switch_application_interface_t sched_hangup_application_interface = {
|
||||
static const switch_application_interface_t sched_hangup_application_interface = {
|
||||
/*.interface_name */ "sched_hangup",
|
||||
/*.application_function */ sched_hangup_function,
|
||||
/*.long_desc */ "Schedule a hangup in the future",
|
||||
|
||||
@@ -519,10 +519,9 @@ static switch_status_t enum_lookup(char *root, char *in, enum_record_t ** result
|
||||
}
|
||||
|
||||
|
||||
static switch_caller_extension_t *enum_dialplan_hunt(switch_core_session_t *session, void *arg)
|
||||
static switch_caller_extension_t *enum_dialplan_hunt(switch_core_session_t *session, void *arg, switch_caller_profile_t *caller_profile)
|
||||
{
|
||||
switch_caller_extension_t *extension = NULL;
|
||||
switch_caller_profile_t *caller_profile;
|
||||
enum_record_t *results, *rp;
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
enum_route_t *rtp;
|
||||
@@ -530,7 +529,9 @@ static switch_caller_extension_t *enum_dialplan_hunt(switch_core_session_t *sess
|
||||
|
||||
assert(channel != NULL);
|
||||
|
||||
caller_profile = switch_channel_get_caller_profile(channel);
|
||||
if (!caller_profile) {
|
||||
caller_profile = switch_channel_get_caller_profile(channel);
|
||||
}
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "ENUM Lookup on %s\n", caller_profile->destination_number);
|
||||
|
||||
|
||||
@@ -83,9 +83,8 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_directory_name, globals.directory_n
|
||||
switch_xml_free(xml);
|
||||
}
|
||||
|
||||
static switch_caller_extension_t *directory_dialplan_hunt(switch_core_session_t *session, void *arg)
|
||||
static switch_caller_extension_t *directory_dialplan_hunt(switch_core_session_t *session, void *arg, switch_caller_profile_t *caller_profile)
|
||||
{
|
||||
switch_caller_profile_t *caller_profile;
|
||||
switch_caller_extension_t *extension = NULL;
|
||||
switch_channel_t *channel;
|
||||
char *var, *val;
|
||||
@@ -97,8 +96,10 @@ static switch_caller_extension_t *directory_dialplan_hunt(switch_core_session_t
|
||||
channel = switch_core_session_get_channel(session);
|
||||
assert(channel != NULL);
|
||||
|
||||
caller_profile = switch_channel_get_caller_profile(channel);
|
||||
|
||||
if (!caller_profile) {
|
||||
caller_profile = switch_channel_get_caller_profile(channel);
|
||||
}
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Hello %s You Dialed %s!\n", caller_profile->caller_id_name,
|
||||
caller_profile->destination_number);
|
||||
|
||||
|
||||
@@ -43,17 +43,15 @@ typedef enum {
|
||||
BREAK_NEVER
|
||||
} break_t;
|
||||
|
||||
static int parse_exten(switch_core_session_t *session, switch_xml_t xexten, switch_caller_extension_t **extension)
|
||||
static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *caller_profile, switch_xml_t xexten, switch_caller_extension_t **extension)
|
||||
{
|
||||
switch_xml_t xcond, xaction;
|
||||
switch_caller_profile_t *caller_profile;
|
||||
switch_channel_t *channel;
|
||||
char *exten_name = (char *) switch_xml_attr_soft(xexten, "name");
|
||||
int proceed = 0;
|
||||
switch_stream_handle_t stream = { 0 };
|
||||
|
||||
channel = switch_core_session_get_channel(session);
|
||||
caller_profile = switch_channel_get_caller_profile(channel);
|
||||
|
||||
for (xcond = switch_xml_child(xexten, "condition"); xcond; xcond = xcond->next) {
|
||||
char *field = NULL;
|
||||
@@ -291,24 +289,26 @@ static switch_status_t dialplan_xml_locate(switch_core_session_t *session, switc
|
||||
return status;
|
||||
}
|
||||
|
||||
static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session, void *arg)
|
||||
static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session, void *arg, switch_caller_profile_t *caller_profile)
|
||||
{
|
||||
switch_caller_profile_t *caller_profile;
|
||||
switch_caller_extension_t *extension = NULL;
|
||||
switch_channel_t *channel;
|
||||
switch_xml_t alt_root = NULL, cfg, xml = NULL, xcontext, xexten;
|
||||
char *alt_path = (char *) arg;
|
||||
|
||||
|
||||
channel = switch_core_session_get_channel(session);
|
||||
|
||||
if ((caller_profile = switch_channel_get_caller_profile(channel))) {
|
||||
if (!caller_profile->context) {
|
||||
caller_profile->context = "default";
|
||||
if (!caller_profile) {
|
||||
if (!(caller_profile = switch_channel_get_caller_profile(channel))) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Obtaining Profile!\n");
|
||||
goto done;
|
||||
}
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Obtaining Profile!\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!caller_profile->context) {
|
||||
caller_profile->context = "default";
|
||||
}
|
||||
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Processing %s->%s!\n", caller_profile->caller_id_name, caller_profile->destination_number);
|
||||
|
||||
@@ -352,7 +352,7 @@ static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session,
|
||||
int proceed = 0;
|
||||
char *cont = (char *) switch_xml_attr_soft(xexten, "continue");
|
||||
|
||||
proceed = parse_exten(session, xexten, &extension);
|
||||
proceed = parse_exten(session, caller_profile, xexten, &extension);
|
||||
|
||||
if (proceed && !switch_true(cont)) {
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user