aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authoralecdavis <alecdavis@f38db490-d61c-443f-a65b-d21fe96a405b>2010-03-11 07:48:14 +0000
committeralecdavis <alecdavis@f38db490-d61c-443f-a65b-d21fe96a405b>2010-03-11 07:48:14 +0000
commitc2fd8dc43e83291cef37f3bb7a22b1fa4f425f83 (patch)
treea12a4d15776a6299741670cc233c05b1b56e953b /apps
parent144ea34380f0d959c2a264ca12e0d9b10e31219e (diff)
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: http://svn.digium.com/svn/asterisk/branches/1.6.2@251820 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_directory.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/apps/app_directory.c b/apps/app_directory.c
index a95f4cba4..d8a26a500 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;