diff --git a/CHANGES b/CHANGES index c6166894b6..88a36a864f 100644 --- a/CHANGES +++ b/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 diff --git a/apps/app_directory.c b/apps/app_directory.c index ccdac427b4..3afb19f29d 100644 --- a/apps/app_directory.c +++ b/apps/app_directory.c @@ -111,6 +111,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") options may be specified. If more than one is specified, then Directory will act as if b was specified. The number of characters for the user to type defaults to 3. + @@ -121,6 +122,19 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") received and the extension to jump to exists: 0 - Jump to the 'o' extension, if it exists. * - Jump to the 'a' extension, if it exists. + This application will set the following channel variable before completion: + + + Reason Directory application exited. + User requested operator + User requested assistant + User allowed DTMF wait duration to pass without sending DTMF + The channel hung up before the application finished + User selected a user to call from the directory + User exited with '#' during selection + The application failed + + @@ -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; }