summaryrefslogtreecommitdiff
path: root/funcs/func_channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'funcs/func_channel.c')
-rw-r--r--funcs/func_channel.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/funcs/func_channel.c b/funcs/func_channel.c
index 14ece0cfd..699f3b660 100644
--- a/funcs/func_channel.c
+++ b/funcs/func_channel.c
@@ -98,6 +98,29 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<enum name="checkhangup">
<para>R/O Whether the channel is hanging up (1/0)</para>
</enum>
+ <enum name="hangup_handler_pop">
+ <para>W/O Replace the most recently added hangup handler
+ with a new hangup handler on the channel if supplied. The
+ assigned string is passed to the Gosub application when
+ the channel is hung up. Any optionally omitted context
+ and exten are supplied by the channel pushing the handler
+ before it is pushed.</para>
+ </enum>
+ <enum name="hangup_handler_push">
+ <para>W/O Push a hangup handler onto the channel hangup
+ handler stack. The assigned string is passed to the
+ Gosub application when the channel is hung up. Any
+ optionally omitted context and exten are supplied by the
+ channel pushing the handler before it is pushed.</para>
+ </enum>
+ <enum name="hangup_handler_wipe">
+ <para>W/O Wipe the entire hangup handler stack and replace
+ with a new hangup handler on the channel if supplied. The
+ assigned string is passed to the Gosub application when
+ the channel is hung up. Any optionally omitted context
+ and exten are supplied by the channel pushing the handler
+ before it is pushed.</para>
+ </enum>
<enum name="language">
<para>R/W language for sounds played.</para>
</enum>
@@ -523,6 +546,17 @@ static int func_channel_write_real(struct ast_channel *chan, const char *functio
break;
}
}
+ } else if (!strcasecmp(data, "hangup_handler_pop")) {
+ /* Pop one hangup handler before pushing the new handler. */
+ ast_pbx_hangup_handler_pop(chan);
+ ast_pbx_hangup_handler_push(chan, value);
+ } else if (!strcasecmp(data, "hangup_handler_push")) {
+ ast_pbx_hangup_handler_push(chan, value);
+ } else if (!strcasecmp(data, "hangup_handler_wipe")) {
+ /* Pop all hangup handlers before pushing the new handler. */
+ while (ast_pbx_hangup_handler_pop(chan)) {
+ }
+ ast_pbx_hangup_handler_push(chan, value);
} else if (!strncasecmp(data, "secure_bridge_", 14)) {
struct ast_datastore *ds;
struct ast_secure_call_store *store;