diff options
author | Joshua Colp <jcolp@digium.com> | 2016-12-06 05:34:54 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2016-12-06 05:34:54 -0600 |
commit | faf2194fab68f4af0044f2282cb169fadbcbc7aa (patch) | |
tree | a4537bfb3dab426cf1a2ca8e09a63fa41a6418ca /main | |
parent | 8bd9dc568af0bd111dd44b048c9dd069be7396b4 (diff) | |
parent | ddc951060ad748c31fb5c37b82d258ef6bfaa7f2 (diff) |
Merge "app_originate: Add option to execute gosub prior to dial"
Diffstat (limited to 'main')
-rw-r--r-- | main/pbx.c | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/main/pbx.c b/main/pbx.c index e5c3d3c07..208c2308b 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -7631,11 +7631,13 @@ static int pbx_outgoing_attempt(const char *type, struct ast_format_cap *cap, const char *app, const char *appdata, int *reason, int synchronous, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel, int early_media, - const struct ast_assigned_ids *assignedids) + const struct ast_assigned_ids *assignedids, const char *predial_callee) { RAII_VAR(struct pbx_outgoing *, outgoing, NULL, ao2_cleanup); struct ast_channel *dialed; pthread_t thread; + char tmp_cid_name[128]; + char tmp_cid_num[128]; outgoing = ao2_alloc(sizeof(*outgoing), pbx_outgoing_destroy); if (!outgoing) { @@ -7662,6 +7664,11 @@ static int pbx_outgoing_attempt(const char *type, struct ast_format_cap *cap, ast_dial_set_global_timeout(outgoing->dial, timeout); + if (!ast_strlen_zero(predial_callee)) { + /* note casting to void * here to suppress compiler warning message (passing const to non-const function) */ + ast_dial_option_global_enable(outgoing->dial, AST_DIAL_OPTION_PREDIAL, (void *)predial_callee); + } + if (ast_dial_prerun(outgoing->dial, NULL, cap)) { if (synchronous && reason) { *reason = pbx_dial_reason(AST_DIAL_RESULT_FAILED, @@ -7686,6 +7693,25 @@ static int pbx_outgoing_attempt(const char *type, struct ast_format_cap *cap, ast_channel_stage_snapshot_done(dialed); } ast_set_flag(ast_channel_flags(dialed), AST_FLAG_ORIGINATED); + + if (!ast_strlen_zero(predial_callee)) { + char *tmp = NULL; + /* + * The predial sub routine may have set callerid so set this into the new channel + * Note... cid_num and cid_name parameters to this function will always be NULL if + * predial_callee is non-NULL so we are not overwriting anything here. + */ + tmp = S_COR(ast_channel_caller(dialed)->id.number.valid, ast_channel_caller(dialed)->id.number.str, NULL); + if (tmp) { + ast_copy_string(tmp_cid_num, tmp, sizeof(tmp_cid_num)); + cid_num = tmp_cid_num; + } + tmp = S_COR(ast_channel_caller(dialed)->id.name.valid, ast_channel_caller(dialed)->id.name.str, NULL); + if (tmp) { + ast_copy_string(tmp_cid_name, tmp, sizeof(tmp_cid_name)); + cid_name = tmp_cid_name; + } + } ast_channel_unlock(dialed); if (!ast_strlen_zero(cid_num) || !ast_strlen_zero(cid_name)) { @@ -7794,6 +7820,16 @@ int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const c const char *account, struct ast_channel **locked_channel, int early_media, const struct ast_assigned_ids *assignedids) { + return ast_pbx_outgoing_exten_predial(type, cap, addr, timeout, context, exten, priority, reason, + synchronous, cid_num, cid_name, vars, account, locked_channel, early_media, assignedids, NULL); +} + +int ast_pbx_outgoing_exten_predial(const char *type, struct ast_format_cap *cap, const char *addr, + int timeout, const char *context, const char *exten, int priority, int *reason, + int synchronous, const char *cid_num, const char *cid_name, struct ast_variable *vars, + const char *account, struct ast_channel **locked_channel, int early_media, + const struct ast_assigned_ids *assignedids, const char *predial_callee) +{ int res; int my_reason; @@ -7807,7 +7843,7 @@ int ast_pbx_outgoing_exten(const char *type, struct ast_format_cap *cap, const c res = pbx_outgoing_attempt(type, cap, addr, timeout, context, exten, priority, NULL, NULL, reason, synchronous, cid_num, cid_name, vars, account, locked_channel, - early_media, assignedids); + early_media, assignedids, predial_callee); if (res < 0 /* Call failed to get connected for some reason. */ && 1 < synchronous @@ -7848,6 +7884,16 @@ int ast_pbx_outgoing_app(const char *type, struct ast_format_cap *cap, const cha const char *account, struct ast_channel **locked_channel, const struct ast_assigned_ids *assignedids) { + return ast_pbx_outgoing_app_predial(type, cap, addr, timeout, app, appdata, reason, synchronous, + cid_num, cid_name, vars, account, locked_channel, assignedids, NULL); +} + +int ast_pbx_outgoing_app_predial(const char *type, struct ast_format_cap *cap, const char *addr, + int timeout, const char *app, const char *appdata, int *reason, int synchronous, + const char *cid_num, const char *cid_name, struct ast_variable *vars, + const char *account, struct ast_channel **locked_channel, + const struct ast_assigned_ids *assignedids, const char *predial_callee) +{ if (reason) { *reason = 0; } @@ -7860,7 +7906,7 @@ int ast_pbx_outgoing_app(const char *type, struct ast_format_cap *cap, const cha return pbx_outgoing_attempt(type, cap, addr, timeout, NULL, NULL, 0, app, appdata, reason, synchronous, cid_num, cid_name, vars, account, locked_channel, 0, - assignedids); + assignedids, predial_callee); } /* this is the guts of destroying a context -- |