I've been banging my head on a brick wall for about an hour now trying
to understand why the following doesn't work (which is even provided as
an example in the distribution!).
The goal is to create a voicemail-only extension not associated with a
phone. I'd rather not have an extension dedicated to VoicemailMain(),
so I would like the user to be able to hit '*' during the introductory
message and be prompted for a password.
For whatever reason, this doesn't work as expected. The first section,
macro-stdexten, is what is provided in the distribution. It defines
exten => a,1,VoicemailMain(${ARG1}), which should match the return
extension from Voicemail() if the user presses '*'. Neither this nor
my "vmonly" macro do this properly. The '*' key instead does
nothing.
Am I not understanding macros properly?
Thanks,
Chad
[macro-stdexten];
;
; Standard extension macro:
; ${ARG1} - Extension (we could have used ${MACRO_EXTEN} here as well
; ${ARG2} - Device(s) to ring
;
exten => s,1,Dial(${ARG2},20) ; Ring
the interface, 20 seconds maximum
exten => s,2,Goto(s-${DIALSTATUS}) ; Jump
based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
exten => s-NOANSWER,1,Voicemail(u${ARG1}) ; If
unavailable, send to voicemail w/ unavail announce
exten => s-NOANSWER,2,Goto(default,s,1) ; If they press
#, return to start
exten => s-BUSY,1,Voicemail(b${ARG1}) ; If busy, send
to voicemail w/ busy announce
exten => s-BUSY,2,Goto(default,s,1) ; If
they press #, return to start
exten => s-.,1,Goto(s-NOANSWER,1) ; Treat
anything else as no answer
exten => a,1,VoicemailMain(${ARG1}) ; If
they press *, send the user into VoicemailMain
[macro-vmonly]
exten => s,1,Voicemail(${ARG1})
exten => s,2,Hangup
exten => a,1,VoicemailMain(${ARG1})
I'm using HEAD right out of the repository. It also doesn't appear the 'o' extension is working either. Is this just something that's unfinished in HEAD? On Jun 27, 2004, at 6:59 AM, Philipp von Klitzing wrote:> Hi! > >> I've been banging my head on a brick wall for about an hour now trying >> to understand why the following doesn't work (which is even provided >> as >> an example in the distribution!). > > Are you using CVS-STABLE? I believe the 'a' extension was introduced in > CVS-HEAD only. > > Cheers, Philipp > >
Chad Scott
2004-Jun-28 11:09 UTC
[Asterisk-Users] Re: 'a' and 'o' extensions do not work with app_voicemail.c (was: Newbie needs help)
I've been doing some debugging on this and I think it's a code problem.
I'm by no means an expert on Asterisk or how it is written or
implemented, but the following patch to app_voicemail.c fixes the
issue. With this code change, Asterisk correctly transfers to the 'a'
and 'o' extensions as I'd expect them to.
As I said, I'm not an expert, so I would strongly recommend against
committing this as-is... someone please interpret why this works and
fix the root problem (or help me understand why this works so I can fix
the root problem).
Index: app_voicemail.c
==================================================================RCS file:
/usr/cvsroot/asterisk/apps/app_voicemail.c,v
retrieving revision 1.119
diff -C3 -r1.119 app_voicemail.c
*** app_voicemail.c 26 Jun 2004 16:06:19 -0000 1.119
--- app_voicemail.c 28 Jun 2004 17:58:17 -0000
***************
*** 1727,1735 ****
make_dir(dir, sizeof(dir), vmu->context, ext,
"INBOX");
if (mkdir(dir, 0700) && (errno != EEXIST))
ast_log(LOG_WARNING, "mkdir '%s' failed:
%s\n",
dir, strerror(errno));
! if (ast_exists_extension(chan,
strlen(chan->macrocontext) ? chan->macrocontext : chan->context,
"o",
1, chan->callerid))
strcat(ecodes, "0");
! if (ast_exists_extension(chan,
strlen(chan->macrocontext) ? chan->macrocontext : chan->context,
"a",
1, chan->callerid))
strcat(ecodes, "*");
/* Play the beginning intro if desired */
if (!ast_strlen_zero(prefile)) {
--- 1727,1735 ----
make_dir(dir, sizeof(dir), vmu->context, ext,
"INBOX");
if (mkdir(dir, 0700) && (errno != EEXIST))
ast_log(LOG_WARNING, "mkdir '%s' failed:
%s\n",
dir, strerror(errno));
! if (ast_exists_extension(chan, chan->context, "o",
1,
chan->callerid))
strcat(ecodes, "0");
! if (ast_exists_extension(chan, chan->context, "a",
1,
chan->callerid))
strcat(ecodes, "*");
/* Play the beginning intro if desired */
if (!ast_strlen_zero(prefile)) {
***************
*** 1768,1775 ****
strncpy(chan->exten, "a",
sizeof(chan->exten) -
1);
if (!ast_strlen_zero(vmu->exit)) {
strncpy(chan->context, vmu->exit,
sizeof(chan->context) - 1);
- } else if
(!ast_strlen_zero(chan->macrocontext)) {
- strncpy(chan->context,
chan->macrocontext, sizeof(chan->context) - 1);
}
chan->priority = 0;
free_user(vmu);
--- 1768,1773 ----
On Jun 26, 2004, at 8:52 PM, Chad Scott wrote:
> I've been banging my head on a brick wall for about an hour now trying
> to understand why the following doesn't work (which is even provided
> as an example in the distribution!).
>
> The goal is to create a voicemail-only extension not associated with a
> phone. I'd rather not have an extension dedicated to VoicemailMain(),
> so I would like the user to be able to hit '*' during the
introductory
> message and be prompted for a password.
>
> For whatever reason, this doesn't work as expected. The first
> section, macro-stdexten, is what is provided in the distribution. It
> defines exten => a,1,VoicemailMain(${ARG1}), which should match the
> return extension from Voicemail() if the user presses '*'. Neither
> this nor my "vmonly" macro do this properly. The '*' key
instead does
> nothing.
>
> Am I not understanding macros properly?
>
> Thanks,
> Chad
>
> [macro-stdexten];
> ;
> ; Standard extension macro:
> ; ${ARG1} - Extension (we could have used ${MACRO_EXTEN} here as
> well
> ; ${ARG2} - Device(s) to ring
> ;
> exten => s,1,Dial(${ARG2},20) ; Ring
> the interface, 20 seconds maximum
> exten => s,2,Goto(s-${DIALSTATUS}) ; Jump
> based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
>
> exten => s-NOANSWER,1,Voicemail(u${ARG1}) ; If
> unavailable, send to voicemail w/ unavail announce
> exten => s-NOANSWER,2,Goto(default,s,1) ; If they
> press #, return to start
>
> exten => s-BUSY,1,Voicemail(b${ARG1}) ; If busy,
> send to voicemail w/ busy announce
> exten => s-BUSY,2,Goto(default,s,1) ; If
> they press #, return to start
>
> exten => s-.,1,Goto(s-NOANSWER,1) ;
> Treat anything else as no answer
>
> exten => a,1,VoicemailMain(${ARG1}) ; If
> they press *, send the user into VoicemailMain
>
> [macro-vmonly]
> exten => s,1,Voicemail(${ARG1})
> exten => s,2,Hangup
>
> exten => a,1,VoicemailMain(${ARG1})
>
> _______________________________________________
> Asterisk-Users mailing list
> Asterisk-Users@lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-users
> To UNSUBSCRIBE or update options visit:
> http://lists.digium.com/mailman/listinfo/asterisk-users