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.