From: Alec L Davis Date: Thu, 11 Mar 2010 07:48:14 +0000 (+0000) Subject: Merged revisions 251779 via svnmerge from X-Git-Tag: 1.6.2.7-rc1~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e96c2b0f469317802f453bcd738b1f1e7afc6a17;p=thirdparty%2Fasterisk.git Merged revisions 251779 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ........ r251779 | alecdavis | 2010-03-11 20:03:51 +1300 (Thu, 11 Mar 2010) | 14 lines Add supporting code for app-directory pause option. Since 1.6.1 CLI help reports that option p(n) 'initial pause' is available. Supporting code was never implemented. (closes issue #16751) Reported by: alecdavis Patches: directory_pause.trunk.diff.txt uploaded by alecdavis (license 585) Tested by: alecdavis Review: https://reviewboard.asterisk.org/r/481/ ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@251820 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_directory.c b/apps/app_directory.c index a95f4cba41..d8a26a5002 100644 --- a/apps/app_directory.c +++ b/apps/app_directory.c @@ -284,17 +284,35 @@ static int select_entry(struct ast_channel *chan, const char *dialcontext, const return 0; } -static int select_item_seq(struct ast_channel *chan, struct directory_item **items, int count, const char *dialcontext, struct ast_flags *flags) +static int select_item_pause(struct ast_channel *chan, struct ast_flags *flags, char *opts[]) +{ + int res = 0, opt_pause = 0; + + if (ast_test_flag(flags, OPT_PAUSE) && !ast_strlen_zero(opts[OPT_ARG_PAUSE])) { + opt_pause = atoi(opts[OPT_ARG_PAUSE]); + if (opt_pause > 3000) { + opt_pause = 3000; + } + res = ast_waitfordigit(chan, opt_pause); + } + return res; +} + +static int select_item_seq(struct ast_channel *chan, struct directory_item **items, int count, const char *dialcontext, struct ast_flags *flags, char *opts[]) { struct directory_item *item, **ptr; int i, res, loop; + /* option p(n): cellphone pause option */ + /* allow early press of selection key */ + res = select_item_pause(chan, flags, opts); + for (ptr = items, i = 0; i < count; i++, ptr++) { item = *ptr; for (loop = 3 ; loop > 0; loop--) { - res = play_mailbox_owner(chan, item->context, item->exten, item->name, flags); - + if (!res) + res = play_mailbox_owner(chan, item->context, item->exten, item->name, flags); if (!res) res = ast_stream_and_wait(chan, "dir-instr", AST_DIGIT_ANY); if (!res) @@ -313,18 +331,22 @@ static int select_item_seq(struct ast_channel *chan, struct directory_item **ite res = 0; } + res = 0; } /* Nothing was selected */ return 0; } -static int select_item_menu(struct ast_channel *chan, struct directory_item **items, int count, const char *dialcontext, struct ast_flags *flags) +static int select_item_menu(struct ast_channel *chan, struct directory_item **items, int count, const char *dialcontext, struct ast_flags *flags, char *opts[]) { struct directory_item **block, *item; int i, limit, res = 0; char buf[9]; + /* option p(n): cellphone pause option */ + select_item_pause(chan, flags, opts); + for (block = items; count; block += limit, count -= limit) { limit = count; if (limit > 8) @@ -643,7 +665,7 @@ static int goto_exten(struct ast_channel *chan, const char *dialcontext, char *e } } -static int do_directory(struct ast_channel *chan, struct ast_config *vmcfg, struct ast_config *ucfg, char *context, char *dialcontext, char digit, int digits, struct ast_flags *flags) +static int do_directory(struct ast_channel *chan, struct ast_config *vmcfg, struct ast_config *ucfg, char *context, char *dialcontext, char digit, int digits, struct ast_flags *flags, char *opts[]) { /* Read in the first three digits.. "digit" is the first digit, already read */ int res = 0; @@ -700,10 +722,10 @@ static int do_directory(struct ast_channel *chan, struct ast_config *vmcfg, stru if (ast_test_flag(flags, OPT_SELECTFROMMENU)) { /* Offer multiple entries at the same time */ - res = select_item_menu(chan, sorted, count, dialcontext, flags); + res = select_item_menu(chan, sorted, count, dialcontext, flags, opts); } else { /* Offer entries one by one */ - res = select_item_seq(chan, sorted, count, dialcontext, flags); + res = select_item_seq(chan, sorted, count, dialcontext, flags, opts); } if (!res) { @@ -819,7 +841,7 @@ static int directory_exec(struct ast_channel *chan, void *data) if (res <= 0) break; - res = do_directory(chan, cfg, ucfg, args.vmcontext, args.dialcontext, res, digit, &flags); + res = do_directory(chan, cfg, ucfg, args.vmcontext, args.dialcontext, res, digit, &flags, opts); if (res) break;