mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-18 10:44:28 +00:00
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
This commit is contained in:
12
CHANGES
12
CHANGES
@@ -26,6 +26,18 @@ ConfBridge
|
||||
be asked if they want to confirm or re-record the recording of their
|
||||
name when entering the conference
|
||||
|
||||
Directory
|
||||
--------------------------
|
||||
* At exit, the Directory application now sets a channel variable
|
||||
DIRECTORY_RESULT to one of the following based on the reason for exiting:
|
||||
OPERATOR user requested operator by pressing '0' for operator
|
||||
ASSISTANT user requested assistant by pressing '*' for assistant
|
||||
TIMEOUT user pressed nothing and Directory stopped waiting
|
||||
HANGUP user's channel hung up
|
||||
SELECTED user selected a user from the directory and is routed
|
||||
USEREXIT user pressed '#' from the selection prompt to exit
|
||||
FAILED directory failed in a way that wasn't accounted for. Dang.
|
||||
|
||||
Say
|
||||
--------------------------
|
||||
* If a channel variable SAY_DTMF_INTERRUPT is present on a channel and set
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user