Originate application. More...
#include "asterisk.h"#include "asterisk/file.h"#include "asterisk/channel.h"#include "asterisk/pbx.h"#include "asterisk/module.h"#include "asterisk/app.h"
Go to the source code of this file.
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static int | load_module (void) |
| static int | originate_exec (struct ast_channel *chan, void *data) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Originate call" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static const char | app_originate [] = "Originate" |
| static struct ast_module_info * | ast_module_info = &__mod_info |
Originate application.
Definition in file app_originate.c.
| static void __reg_module | ( | void | ) | [static] |
Definition at line 217 of file app_originate.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 217 of file app_originate.c.
| static int load_module | ( | void | ) | [static] |
Definition at line 208 of file app_originate.c.
References AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_register_application_xml, and originate_exec().
{
int res;
res = ast_register_application_xml(app_originate, originate_exec);
return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
}
| static int originate_exec | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
Definition at line 92 of file app_originate.c.
References AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), AST_CONTROL_ANSWER, AST_CONTROL_BUSY, AST_CONTROL_CONGESTION, AST_CONTROL_HANGUP, AST_CONTROL_RINGING, ast_debug, AST_DECLARE_APP_ARGS, AST_FORMAT_SLINEAR, ast_log(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_strlen_zero(), exten, LOG_ERROR, LOG_WARNING, parse(), pbx_builtin_setvar_helper(), S_OR, strsep(), and type.
Referenced by load_module().
{
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(tech_data);
AST_APP_ARG(type);
AST_APP_ARG(arg1);
AST_APP_ARG(arg2);
AST_APP_ARG(arg3);
);
char *parse;
char *chantech, *chandata;
int res = -1;
int outgoing_res = 0;
int outgoing_status = 0;
static const unsigned int timeout = 30;
static const char default_exten[] = "s";
ast_autoservice_start(chan);
if (ast_strlen_zero(data)) {
ast_log(LOG_ERROR, "Originate() requires arguments\n");
goto return_cleanup;
}
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
if (args.argc < 3) {
ast_log(LOG_ERROR, "Incorrect number of arguments\n");
goto return_cleanup;
}
chandata = ast_strdupa(args.tech_data);
chantech = strsep(&chandata, "/");
if (ast_strlen_zero(chandata) || ast_strlen_zero(chantech)) {
ast_log(LOG_ERROR, "Channel Tech/Data invalid: '%s'\n", args.tech_data);
goto return_cleanup;
}
if (!strcasecmp(args.type, "exten")) {
int priority = 1; /* Initialized in case priority not specified */
const char *exten = args.arg2;
if (args.argc == 5) {
/* Context/Exten/Priority all specified */
if (sscanf(args.arg3, "%30d", &priority) != 1) {
ast_log(LOG_ERROR, "Invalid priority: '%s'\n", args.arg3);
goto return_cleanup;
}
} else if (args.argc == 3) {
/* Exten not specified */
exten = default_exten;
}
ast_debug(1, "Originating call to '%s/%s' and connecting them to extension %s,%s,%d\n",
chantech, chandata, args.arg1, exten, priority);
outgoing_res = ast_pbx_outgoing_exten(chantech, AST_FORMAT_SLINEAR, chandata,
timeout * 1000, args.arg1, exten, priority, &outgoing_status, 0, NULL,
NULL, NULL, NULL, NULL);
} else if (!strcasecmp(args.type, "app")) {
ast_debug(1, "Originating call to '%s/%s' and connecting them to %s(%s)\n",
chantech, chandata, args.arg1, S_OR(args.arg2, ""));
outgoing_res = ast_pbx_outgoing_app(chantech, AST_FORMAT_SLINEAR, chandata,
timeout * 1000, args.arg1, args.arg2, &outgoing_status, 0, NULL,
NULL, NULL, NULL, NULL);
} else {
ast_log(LOG_ERROR, "Incorrect type, it should be 'exten' or 'app': %s\n",
args.type);
goto return_cleanup;
}
res = 0;
return_cleanup:
if (res) {
pbx_builtin_setvar_helper(chan, "ORIGINATE_STATUS", "FAILED");
} else {
switch (outgoing_status) {
case 0:
case AST_CONTROL_ANSWER:
pbx_builtin_setvar_helper(chan, "ORIGINATE_STATUS", "SUCCESS");
break;
case AST_CONTROL_BUSY:
pbx_builtin_setvar_helper(chan, "ORIGINATE_STATUS", "BUSY");
break;
case AST_CONTROL_CONGESTION:
pbx_builtin_setvar_helper(chan, "ORIGINATE_STATUS", "CONGESTION");
break;
case AST_CONTROL_HANGUP:
pbx_builtin_setvar_helper(chan, "ORIGINATE_STATUS", "HANGUP");
break;
case AST_CONTROL_RINGING:
pbx_builtin_setvar_helper(chan, "ORIGINATE_STATUS", "RINGING");
break;
default:
ast_log(LOG_WARNING, "Unknown originate status result of '%d'\n",
outgoing_status);
pbx_builtin_setvar_helper(chan, "ORIGINATE_STATUS", "UNKNOWN");
break;
}
}
ast_autoservice_stop(chan);
return res;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 203 of file app_originate.c.
References ast_unregister_application().
{
return ast_unregister_application(app_originate);
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Originate call" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 217 of file app_originate.c.
const char app_originate[] = "Originate" [static] |
Definition at line 45 of file app_originate.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 217 of file app_originate.c.