diff options
author | Mark Michelson <mmichelson@digium.com> | 2009-06-01 20:57:31 +0000 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2009-06-01 20:57:31 +0000 |
commit | 298d745fb4cf56cfe76cf89d4d5ae4dcb134d2bd (patch) | |
tree | 22c7cb967cc375a45f8cabb0f6c6998b7b5f674a /main/channel.c | |
parent | 0fb1700522fb5eac568c2144fb714cc3563b392f (diff) |
Add the ability to execute connected line interception macros.
When connected line updates are received or generated in the middle
of an application call, it is now possible to execute a macro to
manipulate the connected line data. This way, phone numbers may be
manipulated to be more presentable to users, names may be changed
for...whatever reason, or whatever else needs to be done may be.
Review: https://reviewboard.asterisk.org/r/256
AST-165
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@198727 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/channel.c')
-rw-r--r-- | main/channel.c | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/main/channel.c b/main/channel.c index bd997def6..d9ce2efbf 100644 --- a/main/channel.c +++ b/main/channel.c @@ -5008,13 +5008,19 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct int bridge_exit = 0; switch (f->subclass) { + case AST_CONTROL_REDIRECTING: + ast_indicate_data(other, f->subclass, f->data.ptr, f->datalen); + break; + case AST_CONTROL_CONNECTED_LINE: + if (ast_channel_connected_line_macro(who, other, f, other == c0, 1)) { + ast_indicate_data(other, f->subclass, f->data.ptr, f->datalen); + } + break; case AST_CONTROL_HOLD: case AST_CONTROL_UNHOLD: case AST_CONTROL_VIDUPDATE: case AST_CONTROL_T38: case AST_CONTROL_SRCUPDATE: - case AST_CONTROL_CONNECTED_LINE: - case AST_CONTROL_REDIRECTING: ast_indicate_data(other, f->subclass, f->data.ptr, f->datalen); if (jb_in_use) { ast_jb_empty_and_reset(c0, c1); @@ -6503,6 +6509,44 @@ void ast_channel_queue_redirecting_update(struct ast_channel *chan, const struct ast_queue_control_data(chan, AST_CONTROL_REDIRECTING, data, datalen); } +int ast_channel_connected_line_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const void *connected_info, int caller, int frame) +{ + const char *macro; + const char *macro_args; + union { + const struct ast_frame *frame; + const struct ast_party_connected_line *connected; + } pointer; + int retval; + + if (frame) { + pointer.frame = connected_info; + } else { + pointer.connected = connected_info; + } + + ast_channel_lock(macro_chan); + macro = ast_strdupa(S_OR(pbx_builtin_getvar_helper(macro_chan, caller ? "CONNECTED_LINE_CALLER_SEND_MACRO" : "CONNECTED_LINE_CALLEE_SEND_MACRO"), "")); + macro_args = ast_strdupa(S_OR(pbx_builtin_getvar_helper(macro_chan, caller ? "CONNECTED_LINE_CALLER_SEND_MACRO_ARGS" : "CONNECTED_LINE_CALLEE_SEND_MACRO_ARGS"), "")); + ast_channel_unlock(macro_chan); + + if (ast_strlen_zero(macro)) { + return -1; + } + + if (frame) { + ast_connected_line_parse_data(pointer.frame->data.ptr, pointer.frame->datalen, ¯o_chan->connected); + } else { + ast_party_connected_line_copy(¯o_chan->connected, pointer.connected); + } + + if (!(retval = ast_app_run_macro(autoservice_chan, macro_chan, macro, macro_args))) { + ast_channel_update_connected_line(macro_chan, ¯o_chan->connected); + } + + return retval; +} + /* DO NOT PUT ADDITIONAL FUNCTIONS BELOW THIS BOUNDARY * * ONLY FUNCTIONS FOR PROVIDING BACKWARDS ABI COMPATIBILITY BELONG HERE |