Page 433 - Asterisk™: The Future of Telephony
P. 433

The calling extension, context, and priority are stored in ${MACRO_EXTEN}, ${MACRO_CON
               TEXT},  and  ${MACRO_PRIORITY},  respectively.  Arguments  arg1,  arg2,  etc.  become  $
               {ARG1}, ${ARG2}, etc. in the macro context.
               Macro() exits abnormally if any step in the macro exited abnormally or indicated a
               hangup. If ${MACRO_OFFSET} is set at termination, this application will attempt to con-
               tinue at priority MACRO_OFFSET+n+1 if such a step exists, and at n+1 otherwise. (In both
               cases, n stands for the current priority.)
               If you call the Goto() application inside of the macro to specify a context outside of the
               currently executing macro, the macro will terminate and control will go to the desti-
               nation of the Goto().
                   ; define a macro to count down from the specified value
                   [macro-countdown]
                   exten => s,1,Set(COUNT=${ARG1})
                   exten => s,2,While($[ ${COUNT} > 0])
                   exten => s,3,SayNumber(${COUNT})
                   exten => s,4,Set(COUNT=$[ ${COUNT} - 1 ])
                   exten => s,5,EndWhile()

                   ; call our macro with two different values
                   [example]
                   exten => 123,1,Macro(countdown,10)
                   exten => 124,1,Macro(countdown,5)


                           While a macro is being executed, it becomes the current context. This
                           means that if a hangup occurs, for instance, the macro will be searched
                           for an h extension, not the context from which the macro was called.
                           So, make sure to define all appropriate extensions in your macro (you
                           can use catch in AEL).


                           Because of the way Macro() is implemented (it executes the priorities
                           contained within it  via sub-engine),  and  a  fixed per-thread  memory
                           stack allowance, macros are limited to seven levels of nesting (macro
                           calling macro calling macro, etc.); It may be possible that stack-intensive
                           applications in deeply nested macros could cause Asterisk to crash ear-
                           lier than this limit.


               See Also
               MacroExit(), Goto(), Gosub(), Chapter 6


               MacroExclusive()                              Runs a macro, exclusive of any other channel
               MacroExclusive(macroname[,arguments])






                                                                         MacroExclusive() | 405
   428   429   430   431   432   433   434   435   436   437   438