Fix a bug with app_voicemail when trying to use app_directory to leave messages

to another user (options 3, 5, 2).

If the context/extension didn't exist in the dialplan (and why should it have to?),
it would fail, saying that it's an "invalid extension".

(issue BE-71)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@40426 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Jason Parker 2006-08-19 00:53:54 +00:00
parent 5dc72404ab
commit 7c05e6478d
2 changed files with 23 additions and 12 deletions

View File

@ -259,7 +259,8 @@ static char *convert(char *lastname)
* '*' for skipped entry from directory
*/
static int play_mailbox_owner(struct ast_channel *chan, char *context,
char *dialcontext, char *ext, char *name, int readext)
char *dialcontext, char *ext, char *name, int readext,
int fromappvm)
{
int res = 0;
int loop;
@ -311,12 +312,17 @@ static int play_mailbox_owner(struct ast_channel *chan, char *context,
if (res < 0) /* User hungup, so jump out now */
break;
if (res == '1') { /* Name selected */
if (ast_goto_if_exists(chan, dialcontext, ext, 1)) {
ast_log(LOG_WARNING,
"Can't find extension '%s' in context '%s'. "
"Did you pass the wrong context to Directory?\n",
ext, dialcontext);
res = -1;
if (fromappvm) {
/* We still want to set the exten though */
ast_copy_string(chan->exten, ext, sizeof(chan->exten));
} else {
if (ast_goto_if_exists(chan, dialcontext, ext, 1)) {
ast_log(LOG_WARNING,
"Can't find extension '%s' in context '%s'. "
"Did you pass the wrong context to Directory?\n",
ext, dialcontext);
res = -1;
}
}
break;
}
@ -388,7 +394,7 @@ static struct ast_config *realtime_directory(char *context)
return cfg;
}
static int do_directory(struct ast_channel *chan, struct ast_config *cfg, char *context, char *dialcontext, char digit, int last, int readext)
static int do_directory(struct ast_channel *chan, struct ast_config *cfg, char *context, char *dialcontext, char digit, int last, int readext, int fromappvm)
{
/* Read in the first three digits.. "digit" is the first digit, already read */
char ext[NUMDIGITS + 1];
@ -467,7 +473,7 @@ static int do_directory(struct ast_channel *chan, struct ast_config *cfg, char *
if (v) {
/* We have a match -- play a greeting if they have it */
res = play_mailbox_owner(chan, context, dialcontext, v->name, name, readext);
res = play_mailbox_owner(chan, context, dialcontext, v->name, name, readext, fromappvm);
switch (res) {
case -1:
/* user pressed '1' but extension does not exist, or
@ -512,6 +518,7 @@ static int directory_exec(struct ast_channel *chan, void *data)
struct ast_config *cfg;
int last = 1;
int readext = 0;
int fromappvm = 0;
char *dirintro, *parse;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(vmcontext);
@ -535,6 +542,8 @@ static int directory_exec(struct ast_channel *chan, void *data)
last = 0;
if (strchr(args.options, 'e'))
readext = 1;
if (strchr(args.options, 'v'))
fromappvm = 1;
}
if (ast_strlen_zero(args.dialcontext))
@ -563,7 +572,7 @@ static int directory_exec(struct ast_channel *chan, void *data)
if (!res)
res = ast_waitfordigit(chan, 5000);
if (res > 0) {
res = do_directory(chan, cfg, args.vmcontext, args.dialcontext, res, last, readext);
res = do_directory(chan, cfg, args.vmcontext, args.dialcontext, res, last, readext, fromappvm);
if (res > 0) {
res = ast_waitstream(chan, AST_DIGIT_ANY);
ast_stopstream(chan);

View File

@ -3864,13 +3864,15 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st
app = pbx_findapp("Directory");
if (app) {
/* make mackup copies */
char vmcontext[256];
/* make backup copies */
memcpy(old_context, chan->context, sizeof(chan->context));
memcpy(old_exten, chan->exten, sizeof(chan->exten));
old_priority = chan->priority;
/* call the the Directory, changes the channel */
res = pbx_exec(chan, app, context ? context : "default");
sprintf(vmcontext, "%s||v", context ? context : "default");
res = pbx_exec(chan, app, vmcontext);
ast_copy_string(username, chan->exten, sizeof(username));