diff options
author | Jonathan Rose <jrose@digium.com> | 2013-11-21 22:38:31 +0000 |
---|---|---|
committer | Jonathan Rose <jrose@digium.com> | 2013-11-21 22:38:31 +0000 |
commit | a60764d61ea7cb27dcb314757301e82d78bf38ed (patch) | |
tree | 5ff1f0fd5500346772e9d444e0b19bb607952b3c /apps | |
parent | 79430bfeb80391b2001d5fee8c17aedaae54fe5e (diff) |
app_directory: Set variable indicating reason directory exited
By the time the directory application exits, a channel variable
DIRECTORY_RESULT will be set for the channel that invoked it which
can be used to determine the reason for exit. The changes log and
the app_directory documentation contain specific details about
each of the possible values for DIRECTORY_RESULT.
Review: https://reviewboard.asterisk.org/r/3016/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@402995 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_directory.c | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/apps/app_directory.c b/apps/app_directory.c index ccdac427b..3afb19f29 100644 --- a/apps/app_directory.c +++ b/apps/app_directory.c @@ -111,6 +111,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") options may be specified. <emphasis>If more than one is specified</emphasis>, then Directory will act as if <replaceable>b</replaceable> was specified. The number of characters for the user to type defaults to <literal>3</literal>.</para></note> + </parameter> </syntax> <description> @@ -121,6 +122,19 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") received and the extension to jump to exists:</para> <para><literal>0</literal> - Jump to the 'o' extension, if it exists.</para> <para><literal>*</literal> - Jump to the 'a' extension, if it exists.</para> + <para>This application will set the following channel variable before completion:</para> + <variablelist> + <variable name="DIRECTORY_RESULT"> + <para>Reason Directory application exited.</para> + <value name="OPERATOR">User requested operator</value> + <value name="ASSISTANT">User requested assistant</value> + <value name="TIMEOUT">User allowed DTMF wait duration to pass without sending DTMF</value> + <value name="HANGUP">The channel hung up before the application finished</value> + <value name="SELECTED">User selected a user to call from the directory</value> + <value name="USEREXIT">User exited with '#' during selection</value> + <value name="FAILED">The application failed</value> + </variable> + </variablelist> </description> </application> @@ -309,6 +323,7 @@ static int select_entry(struct ast_channel *chan, const char *dialcontext, const return -1; } + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "SELECTED"); return 0; } @@ -349,6 +364,7 @@ static int select_item_seq(struct ast_channel *chan, struct directory_item **ite if (res == '0') { /* operator selected */ goto_exten(chan, dialcontext, "o"); + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "OPERATOR"); return '0'; } else if (res == '1') { /* Name selected */ return select_entry(chan, dialcontext, item, flags) ? -1 : 1; @@ -357,6 +373,7 @@ static int select_item_seq(struct ast_channel *chan, struct directory_item **ite break; } else if (res == '#') { /* Exit reading, continue in dialplan */ + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "USEREXIT"); return res; } @@ -422,6 +439,7 @@ static int select_item_menu(struct ast_channel *chan, struct directory_item **it } if (res && res > '0' && res < '1' + limit) { + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "SELECTED"); return select_entry(chan, dialcontext, block[res - '1'], flags) ? -1 : 1; } @@ -741,10 +759,12 @@ static int do_directory(struct ast_channel *chan, struct ast_config *vmcfg, stru char ext[10] = ""; if (digit == '0' && !goto_exten(chan, dialcontext, "o")) { + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "OPERATOR"); return digit; } if (digit == '*' && !goto_exten(chan, dialcontext, "a")) { + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "ASSISTANT"); return digit; } @@ -909,8 +929,12 @@ static int directory_exec(struct ast_channel *chan, const char *data) if (!res) res = ast_waitfordigit(chan, 5000); - if (res <= 0) + if (res <= 0) { + if (res == 0) { + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "TIMEOUT"); + } break; + } res = do_directory(chan, cfg, ucfg, args.vmcontext, args.dialcontext, res, digit, &flags, opts); if (res) @@ -918,15 +942,22 @@ static int directory_exec(struct ast_channel *chan, const char *data) res = ast_waitstream(chan, AST_DIGIT_ANY); ast_stopstream(chan); - - if (res) + if (res < 0) { break; + } } if (ucfg) ast_config_destroy(ucfg); ast_config_destroy(cfg); + if (ast_check_hangup(chan)) { + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "HANGUP"); + } else if (res < 0) { + /* If the res < 0 and we didn't hangup, an unaccounted for error must have happened. */ + pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "FAILED"); + } + return res < 0 ? -1 : 0; } |