Show
Ignore:
Timestamp:
03/13/09 19:10:27 (4 years ago)
Author:
p_lindheimer
Message:

Merged revisions 7321 via svnmerge from
http://svn.freepbx.org/modules/branches/2.6

........

r7321 | ethans | 2008-12-17 16:35:28 -0800 (Wed, 17 Dec 2008) | 3 lines


Moves macro-vm to auto-generated dialplan. Removes static dialplan from extensions.conf. This will enable the ability for other modules to tap into the macro-vm dialplan

........

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/branches/2.5

    • Property svnmerge-integrated changed from /modules/branches/2.4:1-5852,5908 /modules/branches/2.6:1-7080,7132,7158-7174,7177,7179-7186,7191-7202,7204-7226,7228-7250,7252-7273,7279-7286,7289-7292,7294-7295,7297-7312,7317-7320,7322-7331,7333-7340 to /modules/branches/2.4:1-5852,5908 /modules/branches/2.6:1-7080,7132,7158-7174,7177,7179-7186,7191-7202,7204-7226,7228-7250,7252-7273,7279-7286,7289-7292,7294-7295,7297-7312,7317-7331,7333-7340
  • modules/branches/2.5/core/etc/extensions.conf

    r7480 r7519  
    186186exten => exit,1,Playback(beep&line-busy-transfer-menu&silence/1) 
    187187exten => exit,n(return),MacroExit() 
    188  
    189 ;------------------------------------------------------------------------ 
    190 ; [macro-vm] 
    191 ;------------------------------------------------------------------------ 
    192 ; CONTEXT:      macro-vm 
    193 ; PURPOSE:      call voicemail system and extend with personal ivr 
    194 ; 
    195 ; Under normal use, this macro will call the voicemail system with the extension and 
    196 ; desired greeting mode of busy, unavailable or as specified with direct voicemail 
    197 ; calls (usually unavailable) when entered from destinations. 
    198 ; 
    199 ; The voicemail system's two greetings have been 'hijacked' as follows to extend the 
    200 ; system by giving the option of a private 'ivr' for each voicemail user. The following 
    201 ; applies to both the busy and unavailable modes of voicemail and can be applied to one 
    202 ; or both, and differently. 
    203 ; 
    204 ; Global Defaults: 
    205 ; 
    206 ; The following are default values, used in both busy and unavail modes if no specific 
    207 ; values are specified. 
    208 ; 
    209 ; VMX_REPEAT 
    210 ;         The number of times to repeat the users message if no option is pressed. 
    211 ; VMX_TIMEOUT 
    212 ;         The timeout to wait after playing message before repeating or giving up. 
    213 ; VMX_LOOPS 
    214 ;         The number of times it should replay the message and check for an option when 
    215 ;         an invalid option is pressed. 
    216 ; 
    217 ; VMX_OPTS_DOVM 
    218 ;         Default voicemail option to use if vm is chosen as an option. No options will 
    219 ;         cause Allison's generic message, 's' will go straight to beep. 
    220 ; VMX_OPTS_TIMEOUT 
    221 ;         Default voicemail option to use if it times out with no options. No options will 
    222 ;         cause Allison's generic message, 's' will go straight to beep. 
    223 ;         IF THE USER PRESSES # - it will look like a timeout as well since no option will 
    224 ;         be presented. If the user wishes to enable a mode where a caller can press # 
    225 ;         during their message and it goes straight to voicemail with only a 'beep' then 
    226 ;         this should be set to 's'. 
    227 ; VMX_OPTS_LOOPS 
    228 ;         Default voicemail option to use if to many wrong options occur. No options will 
    229 ;         cause Allison's generic message, 's' will go straight to beep. 
    230 ; 
    231 ; VMX_CONTEXT 
    232 ;         Default context for user destinations if not supplied in the user's settings 
    233 ; VMX_PRI 
    234 ;         Default priority for user destinations if not supplied in the user's settings 
    235 ; 
    236 ; VMX_TIMEDEST_CONTEXT 
    237 ;         Default context for timeout destination if not supplied in the user's settings 
    238 ; VMX_TIMEDEST_EXT 
    239 ;         Default extension for timeout destination if not supplied in the user's settings 
    240 ; VMX_TIMEDEST_PRI 
    241 ;         Default priority for timeout destination if not supplied in the user's settings 
    242 ; 
    243 ; VMX_LOOPDEST_CONTEXT 
    244 ;         Default context for loops  destination if not supplied in the user's settings 
    245 ; VMX_LOOPDEST_EXT 
    246 ;         Default extension for loops  destination if not supplied in the user's settings 
    247 ; VMX_LOOPDEST_PRI 
    248 ;         Default priority for loops  destination if not supplied in the user's settings 
    249 ; 
    250 ; 
    251 ; The AMPUSER database variable has been extended with a 'vmx' tree (vm-extension). A 
    252 ; duplicate set is included for both unavail and busy. You could choose for to have an 
    253 ; ivr when unavail is taken, but not with busy - or a different once with busy. 
    254 ; The full list is below, each specific entry is futher described: 
    255 ; 
    256 ; state:    Whether teh current mode is enabled or disabled. Anything but 'enabled' is 
    257 ;           treated as disabled. 
    258 ; repeat:   This is the number of times that the users message should be played after the 
    259 ;           timeout if the user has not entered anything. It is just a variable to the 
    260 ;           Read() function which will do the repeating. 
    261 ; timeout:  This is how long to wait after the message has been read for a response from 
    262 ;           the user. A caller can enter a digit any time during the playback. 
    263 ; loops:    This is the number of loops that the system will allow a caller to retry if 
    264 ;           they enter a bad menu choice, before going to the loop failover destination 
    265 ; vmxopts:  This is the vm options to send to the voicemail command used when a specific 
    266 ;           voicemail destination is chosen (inidcated by 'dovm' in the ext field). This is 
    267 ;           typically either set to 's' or left blank. When set to 's' there will be no 
    268 ;           message played when entering the voicemail, just a beep. When blank, you will 
    269 ;           have Allison's generic message played. It is not typical to play the greetings 
    270 ;           since they have been 'hijacked' for these IVR's and from a caller's perspecitive 
    271 ;           this system appears interconnected with the voicemail so instructions can be 
    272 ;           left there. 
    273 ; timedest: The three variables: ext, context and pri are the goto destination if the caller 
    274 ;           enters no options and it timesout. None have to be set and a system default 
    275 ;           will be used. If just ext is set, then defaults will be used for context and 
    276 ;           pri, etc. 
    277 ; loopdest: This is identical to timedest but used if the caller exceeds the maximum invalid 
    278 ;           menu choices. 
    279 ; [0-9*]:   The user can specify up to 11 ivr options, all as single digits from 0-9 or *. The 
    280 ;           # key can not be used since it is used as a terminator key for the Read command 
    281 ;           and will never be returned. A minimum of the ext must be specified for each valid 
    282 ;           option and as above, the context and priority can also be specified if the default 
    283 ;           is not to be used. 
    284 ;           Option '0' takes on a special meaning. Since a user is able to break out of the 
    285 ;           voicemail command once entering it with a 0, if specified, the 0 destination will 
    286 ;           be used. 
    287 ;           Option '*' can also be used to breakout. It is undecided at this point whether 
    288 ;           providing that option will be used as well. (probably should). 
    289 ; 
    290 ; 
    291 ; /AMPUSER/<ext>/vmx/[busy|unavail]/state:                enabled|disabled 
    292 ; /AMPUSER/<ext>/vmx/[busy|unavail]/repeat:               n (times to repeat message) 
    293 ; /AMPUSER/<ext>/vmx/[busy|unavail]/timeout:              n (timeout to wait for digit) 
    294 ; /AMPUSER/<ext>/vmx/[busy|unavail]/loops:                n (loop returies for invalid entries) 
    295 ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/dovm:         vmoptions (if ext is dovm) 
    296 ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/timeout:      vmoptions (if timeout) 
    297 ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/loops:        vmoptions (if loops) 
    298 ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/ext:         extension (if timeout) 
    299 ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/context:     context (if timeout) 
    300 ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/pri:         priority (if timeout) 
    301 ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/ext:         extension (if too many failures) 
    302 ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/context:     context (if too many failures) 
    303 ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/pri:         priority (if too many failures) 
    304 ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/ext:           extension (dovm for vm access) 
    305 ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/context:       context  
    306 ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/pri:           priority  
    307 ;------------------------------------------------------------------------ 
    308 [macro-vm] 
    309 ; ARG1 - extension 
    310 ; ARG2 - DIRECTDIAL/BUSY 
    311 ; ARG3 - RETURN makes macro return, otherwise hangup 
    312 exten => s,1,Macro(user-callerid,SKIPTTL) 
    313 exten => s,n,Set(VMGAIN=${IF($["foo${VM_GAIN}"!="foo"]?"g(${VM_GAIN})":"")}) 
    314 ; 
    315 ; If BLKVM_OVERRIDE is set, then someone told us to block calls from going to 
    316 ; voicemail. This variable is reset by the answering channel so subsequent 
    317 ; transfers will properly function. 
    318 ; 
    319 exten => s,n,GotoIf($["foo${DB(${BLKVM_OVERRIDE})}" != "fooTRUE"]?vmx,1) 
    320 ; 
    321 ; we didn't branch so block this from voicemail 
    322 ; 
    323 exten => s,n,Noop(CAME FROM: ${NODEST} - Blocking VM cause of key: ${DB(BLKVM_OVERRIDE)}) 
    324 exten => s,n,Hangup 
    325  
    326  
    327 ; If vmx not enabled for the current mode,then jump to normal voicemail behavior 
    328 ; also - if not message (no-msg) is requested, straight to voicemail 
    329 ; 
    330 exten => vmx,1,GotoIf($["${ARG2}"="NOMESSAGE"]?s-${ARG2},1) 
    331 exten => vmx,n,Set(MODE=${IF($["${ARG2}"="BUSY"]?busy:unavail)}) 
    332 exten => vmx,n,GotoIf($["${ARG2}" != "DIRECTDIAL"]?notdirect) 
    333 exten => vmx,n,Set(MODE=${IF($["${REGEX("[b]" ${VM_DDTYPE})}" = "1"]?busy:${MODE})}) 
    334 exten => vmx,n(notdirect),Noop(Checking if ext ${ARG1} is enabled: ${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}) 
    335 exten => vmx,n,GotoIf($["${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}" != "enabled"]?s-${ARG2},1) 
    336  
    337 ; If the required voicemail file does not exist, then abort and go to normal voicemail behavior 
    338 ; 
    339 ; TODO: there have been errors using System() with jump to 101 where asterisk works fine at the begining and 
    340 ;       then starts to jump to 101 even on success. This new mode is being tried with the SYSTEM Status which 
    341 ;       returns SUCCESS when the command returned succcessfully with a 0 app return code. 
    342 ; 
    343 exten => vmx,n,Macro(get-vmcontext,${ARG1}) 
    344 ;exten => vmx,n,TrySystem(/bin/ls ${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE}.[wW][aA][vV]) 
    345 exten => vmx,n,AGI(checksound.agi,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/temp) 
    346 exten => vmx,n,GotoIf($["${SYSTEMSTATUS}" = "SUCCESS"]?tmpgreet) 
    347 exten => vmx,n,AGI(checksound.agi,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE}) 
    348 exten => vmx,n,GotoIf($["${SYSTEMSTATUS}" != "SUCCESS"]?nofile) 
    349  
    350 ; Get the repeat, timeout and loop times to use if they are overriden form the global settings 
    351 ; 
    352 exten => vmx,n,Set(LOOPCOUNT=0) 
    353 exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/repeat)}" = "0"]?vmxtime) 
    354 exten => vmx,n,Set(VMX_REPEAT=${DB_RESULT}) 
    355 exten => vmx,n(vmxtime),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timeout)}" = "0"]?vmxloops) 
    356 exten => vmx,n,Set(VMX_TIMEOUT=${DB_RESULT}) 
    357 exten => vmx,n(vmxloops),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loops)}" = "0"]?vmxanswer) 
    358 exten => vmx,n,Set(VMX_LOOPS=${DB_RESULT}) 
    359 exten => vmx,n(vmxanswer),Answer() 
    360  
    361 ; Now play the users voicemail recording as the basis for their ivr, the Read command will repeat as needed and if it timesout 
    362 ; then we go to the timeout. Otherwise handle invalid options by looping until the limit until a valid option is played. 
    363 ; 
    364 exten => vmx,n(loopstart),Read(ACTION,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE},1,skip,${VMX_REPEAT},${VMX_TIMEOUT}) 
    365 exten => vmx,n,GotoIf($["${EXISTS(${ACTION})}" = "1"]?checkopt) 
    366  
    367 ; If we are here we timed out, go to the required destination 
    368 ; 
    369 exten => vmx,n(noopt),Noop(Timeout: going to timeout dest) 
    370 exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_TIMEOUT}) 
    371 exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/timeout)}" = "0"]?chktime) 
    372 exten => vmx,n,Set(VMX_OPTS=${DB_RESULT}) 
    373 exten => vmx,n(chktime),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/ext)}" = "0"]?dotime) 
    374 exten => vmx,n,Set(VMX_TIMEDEST_EXT=${DB_RESULT}) 
    375 exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/context)}" = "0"]?timepri) 
    376 exten => vmx,n,Set(VMX_TIMEDEST_CONTEXT=${DB_RESULT}) 
    377 exten => vmx,n(timepri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/pri)}" = "0"]?dotime) 
    378 exten => vmx,n,Set(VMX_TIMEDEST_PRI=${DB_RESULT}) 
    379 exten => vmx,n(dotime),Goto(${VMX_TIMEDEST_CONTEXT},${VMX_TIMEDEST_EXT},${VMX_TIMEDEST_PRI}) 
    380  
    381 ; We got an option, check if the option is defined, or one of the system defaults 
    382 ; 
    383 exten => vmx,n(checkopt),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/ext)}" = "1"]?doopt) 
    384 exten => vmx,n,GotoIf($["${ACTION}" = "0"]?o,1) 
    385 exten => vmx,n,GotoIf($["${ACTION}" = "*"]?adef,1) 
    386  
    387 ; Got invalid option loop until the max 
    388 ; 
    389 exten => vmx,n,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1]) 
    390 exten => vmx,n,GotoIf($[${LOOPCOUNT} > ${VMX_LOOPS}]?toomany) 
    391 exten => vmx,n,Playback(pm-invalid-option&please-try-again) 
    392 exten => vmx,n,Goto(loopstart) 
    393  
    394 ; tomany: to many invalid options, go to the specified destination 
    395 ; 
    396 exten => vmx,n(toomany),Noop(Too Many invalid entries, got to invalid dest) 
    397 exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_LOOPS}) 
    398 exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/loops)}" = "0"]?chkloop) 
    399 exten => vmx,n,Set(VMX_OPTS=${DB_RESULT}) 
    400 exten => vmx,n(chkloop),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/ext)}" = "0"]?doloop) 
    401 exten => vmx,n,Set(VMX_LOOPDEST_EXT=${DB_RESULT}) 
    402 exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/context)}" = "0"]?looppri) 
    403 exten => vmx,n,Set(VMX_LOOPDEST_CONTEXT=${DB_RESULT}) ;TODO make configurable per above 
    404 exten => vmx,n(looppri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/pri)}" = "0"]?doloop) 
    405 exten => vmx,n,Set(VMX_LOOPDEST_PRI=${DB_RESULT}) ;TODO make configurable per above 
    406 exten => vmx,n(doloop),Goto(${VMX_LOOPDEST_CONTEXT},${VMX_LOOPDEST_EXT},${VMX_LOOPDEST_PRI}) 
    407  
    408 ; doopt: execute the valid option that was chosen 
    409 ; 
    410 exten => vmx,n(doopt),Noop(Got a valid option: ${DB_RESULT}) 
    411 exten => vmx,n,Set(VMX_EXT=${DB_RESULT}) 
    412 ; 
    413 ; Special case, if this option was to go to voicemail, set options and go 
    414 ; 
    415 exten => vmx,n,GotoIf($["${VMX_EXT}" != "dovm"]?getdest) 
    416 exten => vmx,n(vmxopts),Set(VMX_OPTS=${VMX_OPTS_DOVM}) 
    417 exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/dovm)}" = "0"]?vmxdovm) 
    418 exten => vmx,n(vmxopts),Set(VMX_OPTS=${DB_RESULT}) 
    419 exten => vmx,n(vmxdovm),goto(dovm,1) 
    420 ; 
    421 ; General case, setup the goto destination and go there (no error checking, its up to the GUI's to assure 
    422 ; reasonable values 
    423 ; 
    424 exten => vmx,n(getdest),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/context)}" = "0"]?vmxpri) 
    425 exten => vmx,n,Set(VMX_CONTEXT=${DB_RESULT}) 
    426 exten => vmx,n(vmxpri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/pri)}" = "0"]?vmxgoto) 
    427 exten => vmx,n,Set(VMX_PRI=${DB_RESULT}) 
    428 exten => vmx,n(vmxgoto),Goto(${VMX_CONTEXT},${VMX_EXT},${VMX_PRI}) 
    429  
    430 ; If the required voicemail file is not present, then revert to normal voicemail 
    431 ; behavior treating as if it was not set 
    432 ; 
    433 exten => vmx,n(nofile),Noop(File for mode: ${MODE} does not exist, SYSTEMSTATUS: ${SYSTEMSTATUS}, going to normal voicemail) 
    434 exten => vmx,n,Goto(s-${ARG2},1) 
    435 exten => vmx,n(tmpgreet),Noop(Temporary Greeting Detected, going to normal voicemail) 
    436 exten => vmx,n,Goto(s-${ARG2},1) 
    437  
    438 ; Drop into voicemail either as a direct destination (in which case VMX_OPTS might be set to something) or 
    439 ; if the user timed out or broke out of the loop then VMX_OPTS is always cleared such that an Allison 
    440 ; message is played and the caller know's what is going on. 
    441 ; 
    442 exten => dovm,1,Noop(VMX Timeout - go to voicemail) 
    443 exten => dovm,n,Voicemail(${ARG1}@${VMCONTEXT},${VMX_OPTS}${VMGAIN}) ; no flags, so allison plays please leave ... 
    444 exten => dovm,n,Goto(exit-${VMSTATUS},1) 
    445  
    446 exten => s-BUSY,1,NoOp(BUSY voicemail) 
    447 exten => s-BUSY,n,Macro(get-vmcontext,${ARG1}) 
    448 exten => s-BUSY,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}b${VMGAIN})   ; Voicemail Busy message 
    449 exten => s-BUSY,n,Goto(exit-${VMSTATUS},1) 
    450  
    451 exten => s-NOMESSAGE,1,NoOp(NOMESSAGE (beeb only) voicemail) 
    452 exten => s-NOMESSAGE,n,Macro(get-vmcontext,${ARG1}) 
    453 exten => s-NOMESSAGE,n,Voicemail(${ARG1}@${VMCONTEXT},s${VM_OPTS}${VMGAIN}) 
    454 exten => s-NOMESSAGE,n,Goto(exit-${VMSTATUS},1) 
    455  
    456 exten => s-DIRECTDIAL,1,NoOp(DIRECTDIAL voicemail) 
    457 exten => s-DIRECTDIAL,n,Macro(get-vmcontext,${ARG1}) 
    458 exten => s-DIRECTDIAL,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}${VM_DDTYPE}${VMGAIN}) 
    459 exten => s-DIRECTDIAL,n,Goto(exit-${VMSTATUS},1) 
    460  
    461 exten => _s-.,1,Macro(get-vmcontext,${ARG1}) 
    462 exten => _s-.,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}u${VMGAIN})     ; Voicemail Unavailable message 
    463 exten => _s-.,n,Goto(exit-${VMSTATUS},1) 
    464  
    465 ; If the user has a 0 option defined, use that for operator zero-out from within voicemail 
    466 ; as well to keep it consistant with the menu structure 
    467 ; 
    468 exten => o,1,Background(one-moment-please)      ; 0 during vm message will hangup 
    469 exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/ext)}" = "0"]?doopdef) 
    470  
    471 exten => o,n,Set(VMX_OPDEST_EXT=${DB_RESULT}) 
    472 exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/context)}" = "1"]?opcontext) 
    473 exten => o,n,Set(DB_RESULT=${VMX_CONTEXT}) 
    474 exten => o,n(opcontext),Set(VMX_OPDEST_CONTEXT=${DB_RESULT}) 
    475 exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/pri)}" = "1"]?oppri) 
    476 exten => o,n,Set(DB_RESULT=${VMX_PRI}) 
    477 exten => o,n(oppri),Set(VMX_OPDEST_PRI=${DB_RESULT}) 
    478  
    479 exten => o,n,Goto(${VMX_OPDEST_CONTEXT},${VMX_OPDEST_EXT},${VMX_OPDEST_PRI}) 
    480 exten => o,n(doopdef),GotoIf($["x${OPERATOR_XTN}"="x"]?nooper:from-internal,${OPERATOR_XTN},1) 
    481 exten => o,n(nooper),GotoIf($["x${FROM_DID}"="x"]?nodid) 
    482 exten => o,n,Dial(Local/${FROM_DID}@from-pstn) 
    483 exten => o,n,Macro(hangup) 
    484 exten => o,n(nodid),Dial(Local/s@from-pstn) 
    485 exten => o,n,Macro(hangup) 
    486  
    487 ; If the user has a * option defined, use that for the * out from within voicemail 
    488 ; as well to keep it consistant with the menu structure 
    489 ; 
    490 exten => a,1,Macro(get-vmcontext,${ARG1}) 
    491 exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/ext)}" = "0"]?adef,1) 
    492  
    493 exten => a,n,Set(VMX_ADEST_EXT=${DB_RESULT}) 
    494 exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/context)}" = "1"]?acontext) 
    495 exten => a,n,Set(DB_RESULT=${VMX_CONTEXT}) 
    496 exten => a,n(acontext),Set(VMX_ADEST_CONTEXT=${DB_RESULT}) 
    497 exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/pri)}" = "1"]?apri) 
    498 exten => a,n,Set(DB_RESULT=${VMX_PRI}) 
    499 exten => a,n(apri),Set(VMX_ADEST_PRI=${DB_RESULT}) 
    500 exten => a,n,Goto(${VMX_ADEST_CONTEXT},${VMX_ADEST_EXT},${VMX_ADEST_PRI}) 
    501  
    502 exten => adef,1,VoiceMailMain(${ARG1}@${VMCONTEXT}) 
    503 exten => adef,n,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1) 
    504 exten => adef,n,Hangup 
    505  
    506 exten => exit-FAILED,1,Playback(im-sorry&an-error-has-occured) 
    507 exten => exit-FAILED,n,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1) 
    508 exten => exit-FAILED,n,Hangup() 
    509  
    510 exten => exit-SUCCESS,1,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1) 
    511 exten => exit-SUCCESS,n,Playback(goodbye) 
    512 exten => exit-SUCCESS,n,Hangup() 
    513  
    514 exten => exit-USEREXIT,1,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1) 
    515 exten => exit-USEREXIT,n,Playback(goodbye) 
    516 exten => exit-USEREXIT,n,Hangup() 
    517  
    518 exten => exit-RETURN,1,Noop(Returning From Voicemail because macro) 
    519  
    520 exten => t,1,Hangup() 
    521 ;------------------------------------------------------------------------ 
    522188 
    523189;------------------------------------------------------------------------ 
  • modules/branches/2.5/core/functions.inc.php

    r7458 r7519  
    19081908 
    19091909      /* end vm-callme context  */ 
     1910 
     1911      /* 
     1912      * macro-vm  
     1913      */ 
     1914       
     1915      /* 
     1916                        ;------------------------------------------------------------------------ 
     1917                        ; [macro-vm] 
     1918                        ;------------------------------------------------------------------------ 
     1919                        ; CONTEXT:      macro-vm 
     1920                        ; PURPOSE:      call voicemail system and extend with personal ivr 
     1921                        ; 
     1922                        ; Under normal use, this macro will call the voicemail system with the extension and 
     1923                        ; desired greeting mode of busy, unavailable or as specified with direct voicemail 
     1924                        ; calls (usually unavailable) when entered from destinations. 
     1925                        ; 
     1926                        ; The voicemail system's two greetings have been 'hijacked' as follows to extend the 
     1927                        ; system by giving the option of a private 'ivr' for each voicemail user. The following 
     1928                        ; applies to both the busy and unavailable modes of voicemail and can be applied to one 
     1929                        ; or both, and differently. 
     1930                        ; 
     1931                        ; Global Defaults: 
     1932                        ; 
     1933                        ; The following are default values, used in both busy and unavail modes if no specific 
     1934                        ; values are specified. 
     1935                        ; 
     1936                        ; VMX_REPEAT 
     1937                        ;                                       The number of times to repeat the users message if no option is pressed. 
     1938                        ; VMX_TIMEOUT 
     1939                        ;                                       The timeout to wait after playing message before repeating or giving up. 
     1940                        ; VMX_LOOPS 
     1941                        ;                                       The number of times it should replay the message and check for an option when 
     1942                        ;                                       an invalid option is pressed. 
     1943                        ; 
     1944                        ; VMX_OPTS_DOVM 
     1945                        ;                                       Default voicemail option to use if vm is chosen as an option. No options will 
     1946                        ;                                       cause Allison's generic message, 's' will go straight to beep. 
     1947                        ; VMX_OPTS_TIMEOUT 
     1948                        ;                                       Default voicemail option to use if it times out with no options. No options will 
     1949                        ;                                       cause Allison's generic message, 's' will go straight to beep. 
     1950                        ;                                       IF THE USER PRESSES # - it will look like a timeout as well since no option will 
     1951                        ;                                       be presented. If the user wishes to enable a mode where a caller can press # 
     1952                        ;                                       during their message and it goes straight to voicemail with only a 'beep' then 
     1953                        ;                                       this should be set to 's'. 
     1954                        ; VMX_OPTS_LOOPS 
     1955                        ;                                       Default voicemail option to use if to many wrong options occur. No options will 
     1956                        ;                                       cause Allison's generic message, 's' will go straight to beep. 
     1957                        ; 
     1958                        ; VMX_CONTEXT 
     1959                        ;                                       Default context for user destinations if not supplied in the user's settings 
     1960                        ; VMX_PRI 
     1961                        ;                                       Default priority for user destinations if not supplied in the user's settings 
     1962                        ; 
     1963                        ; VMX_TIMEDEST_CONTEXT 
     1964                        ;                                       Default context for timeout destination if not supplied in the user's settings 
     1965                        ; VMX_TIMEDEST_EXT 
     1966                        ;                                       Default extension for timeout destination if not supplied in the user's settings 
     1967                        ; VMX_TIMEDEST_PRI 
     1968                        ;                                       Default priority for timeout destination if not supplied in the user's settings 
     1969                        ; 
     1970                        ; VMX_LOOPDEST_CONTEXT 
     1971                        ;                                       Default context for loops  destination if not supplied in the user's settings 
     1972                        ; VMX_LOOPDEST_EXT 
     1973                        ;                                       Default extension for loops  destination if not supplied in the user's settings 
     1974                        ; VMX_LOOPDEST_PRI 
     1975                        ;                                       Default priority for loops  destination if not supplied in the user's settings 
     1976                        ; 
     1977                        ; 
     1978                        ; The AMPUSER database variable has been extended with a 'vmx' tree (vm-extension). A 
     1979                        ; duplicate set is included for both unavail and busy. You could choose for to have an 
     1980                        ; ivr when unavail is taken, but not with busy - or a different once with busy. 
     1981                        ; The full list is below, each specific entry is futher described: 
     1982                        ; 
     1983                        ; state:                Whether teh current mode is enabled or disabled. Anything but 'enabled' is 
     1984                        ;                                               treated as disabled. 
     1985                        ; repeat:               This is the number of times that the users message should be played after the 
     1986                        ;                                               timeout if the user has not entered anything. It is just a variable to the 
     1987                        ;                                               Read() function which will do the repeating. 
     1988                        ; timeout:      This is how long to wait after the message has been read for a response from 
     1989                        ;                                               the user. A caller can enter a digit any time during the playback. 
     1990                        ; loops:                This is the number of loops that the system will allow a caller to retry if 
     1991                        ;                                               they enter a bad menu choice, before going to the loop failover destination 
     1992                        ; vmxopts:      This is the vm options to send to the voicemail command used when a specific 
     1993                        ;                                               voicemail destination is chosen (inidcated by 'dovm' in the ext field). This is 
     1994                        ;                                               typically either set to 's' or left blank. When set to 's' there will be no 
     1995                        ;                                               message played when entering the voicemail, just a beep. When blank, you will 
     1996                        ;                                               have Allison's generic message played. It is not typical to play the greetings 
     1997                        ;                                               since they have been 'hijacked' for these IVR's and from a caller's perspecitive 
     1998                        ;                                               this system appears interconnected with the voicemail so instructions can be 
     1999                        ;                                               left there. 
     2000                        ; timedest: The three variables: ext, context and pri are the goto destination if the caller 
     2001                        ;                                               enters no options and it timesout. None have to be set and a system default 
     2002                        ;                                               will be used. If just ext is set, then defaults will be used for context and 
     2003                        ;                                               pri, etc. 
     2004                        ; loopdest:     This is identical to timedest but used if the caller exceeds the maximum invalid 
     2005                        ;                                               menu choices. 
     2006                        ; [0-9*]:               The user can specify up to 11 ivr options, all as single digits from 0-9 or *. The 
     2007                        ;                                               # key can not be used since it is used as a terminator key for the Read command 
     2008                        ;                                               and will never be returned. A minimum of the ext must be specified for each valid 
     2009                        ;                                               option and as above, the context and priority can also be specified if the default 
     2010                        ;                                               is not to be used. 
     2011                        ;                                               Option '0' takes on a special meaning. Since a user is able to break out of the 
     2012                        ;                                               voicemail command once entering it with a 0, if specified, the 0 destination will 
     2013                        ;                                               be used. 
     2014                        ;                                               Option '*' can also be used to breakout. It is undecided at this point whether 
     2015                        ;                                               providing that option will be used as well. (probably should). 
     2016                        ; 
     2017                        ; 
     2018                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/state:                                                              enabled|disabled 
     2019                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/repeat:                                                             n (times to repeat message) 
     2020                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/timeout:                                                    n (timeout to wait for digit) 
     2021                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/loops:                                                              n (loop returies for invalid entries) 
     2022                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/dovm:                                       vmoptions (if ext is dovm) 
     2023                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/timeout:                    vmoptions (if timeout) 
     2024                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/vmxopts/loops:                              vmoptions (if loops) 
     2025                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/ext:                                       extension (if timeout) 
     2026                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/context:                   context (if timeout) 
     2027                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/timedest/pri:                                       priority (if timeout) 
     2028                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/ext:                                       extension (if too many failures) 
     2029                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/context:                   context (if too many failures) 
     2030                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/loopdest/pri:                                       priority (if too many failures) 
     2031                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/ext:                                         extension (dovm for vm access) 
     2032                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/context:                             context 
     2033                        ; /AMPUSER/<ext>/vmx/[busy|unavail]/[0-9*]/pri:                                         priority 
     2034                        ;------------------------------------------------------------------------ 
     2035 
     2036      */ 
     2037      // ARG1 - extension 
     2038      // ARG2 - DIRECTDIAL/BUSY 
     2039      // ARG3 - RETURN makes macro return, otherwise hangup 
     2040      //exten => s,1,Macro(user-callerid,SKIPTTL) 
     2041      $ext->add('macro-vm', 's', '', new ext_macro('user-callerid', 'SKIPTTL')); 
     2042      //exten => s,n,Set(VMGAIN=${IF($["foo${VM_GAIN}"!="foo"]?"g(${VM_GAIN})":"")}) 
     2043      $ext->add('macro-vm','s', '', new ext_setvar("VMGAIN", '${IF($["foo${VM_GAIN}"!="foo"]?"g(${VM_GAIN})":"")}')); 
     2044      // If BLKVM_OVERRIDE is set, then someone told us to block calls from going to 
     2045      // voicemail. This variable is reset by the answering channel so subsequent 
     2046      // transfers will properly function. 
     2047       
     2048      //exten => s,n,GotoIf($["foo${DB(${BLKVM_OVERRIDE})}" != "fooTRUE"]?vmx,1) 
     2049      $ext->add('macro-vm','s', '', new ext_gotoif('$["foo${DB(${BLKVM_OVERRIDE})}" != "fooTRUE"]','vmx,1')); 
     2050 
     2051      // we didn't branch so block this from voicemail 
     2052 
     2053      //exten => s,n,Noop(CAME FROM: ${NODEST} - Blocking VM cause of key: ${DB(BLKVM_OVERRIDE)}) 
     2054      $ext->add('macro-vm','s', '', new ext_NoOp('CAME FROM: ${NODEST} - Blocking VM cause of key: ${DB(BLKVM_OVERRIDE)}'));  
     2055      //exten => s,n,Hangup 
     2056      $ext->add('macro-vm','s', '', new ext_hangup('')); 
     2057      // If vmx not enabled for the current mode,then jump to normal voicemail behavior 
     2058      // also - if not message (no-msg) is requested, straight to voicemail 
     2059 
     2060      //exten => vmx,1,GotoIf($["${ARG2}"="NOMESSAGE"]?s-${ARG2},1) 
     2061      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${ARG2}"="NOMESSAGE"]','s-${ARG2},1')); 
     2062      //exten => vmx,n,Set(MODE=${IF($["${ARG2}"="BUSY"]?busy:unavail)}) 
     2063      $ext->add('macro-vm','vmx', '', new ext_setvar("MODE", '${IF($["${ARG2}"="BUSY"]?busy:unavail)}')); 
     2064      //exten => vmx,n,GotoIf($["${ARG2}" != "DIRECTDIAL"]?notdirect) 
     2065      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${ARG2}" != "DIRECTDIAL"]','notdirect')); 
     2066      //exten => vmx,n,Set(MODE=${IF($["${REGEX("[b]" ${VM_DDTYPE})}" = "1"]?busy:${MODE})}) 
     2067      $ext->add('macro-vm','vmx', '', new ext_setvar("MODE", '${IF($["${REGEX("[b]" ${VM_DDTYPE})}" = "1"]?busy:${MODE})}')); 
     2068      //exten => vmx,n(notdirect),Noop(Checking if ext ${ARG1} is enabled: ${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}) 
     2069      $ext->add('macro-vm','vmx', 'notdirect', new ext_NoOp('Checking if ext ${ARG1} is enabled: ${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}')); 
     2070      //exten => vmx,n,GotoIf($["${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}" != "enabled"]?s-${ARG2},1) 
     2071      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${DB(AMPUSER/${ARG1}/vmx/${MODE}/state)}" != "enabled"]','s-${ARG2},1')); 
     2072      // If the required voicemail file does not exist, then abort and go to normal voicemail behavior 
     2073      // 
     2074      // TODO: there have been errors using System() with jump to 101 where asterisk works fine at the begining and 
     2075      //       then starts to jump to 101 even on success. This new mode is being tried with the SYSTEM Status which 
     2076      //       returns SUCCESS when the command returned succcessfully with a 0 app return code. 
     2077      // 
     2078      //exten => vmx,n,Macro(get-vmcontext,${ARG1}) 
     2079      $ext->add('macro-vm', 'vmx', '', new ext_macro('get-vmcontext', '${ARG1}'));       
     2080      //;exten => vmx,n,TrySystem(/bin/ls ${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE}.[wW][aA][vV]) 
     2081      //$ext->add('macro-vm', 'vmx', '', new ext_trysystem('/bin/ls ${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE}.[wW][aA][vV]')); 
     2082      //exten => vmx,n,AGI(checksound.agi,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/temp) 
     2083      $ext->add('macro-vm', 'vmx', '',new ext_agi('checksound.agi,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/temp')); 
     2084      //exten => vmx,n,GotoIf($["${SYSTEMSTATUS}" = "SUCCESS"]?tmpgreet) 
     2085      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${SYSTEMSTATUS}" = "SUCCESS"]','tmpgreet')); 
     2086      //exten => vmx,n,AGI(checksound.agi,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE}) 
     2087      $ext->add('macro-vm', 'vmx', '',new ext_agi('checksound.agi,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE}')); 
     2088      //exten => vmx,n,GotoIf($["${SYSTEMSTATUS}" != "SUCCESS"]?nofile) 
     2089      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${SYSTEMSTATUS}" != "SUCCESS"]','nofile')); 
     2090      // Get the repeat, timeout and loop times to use if they are overriden form the global settings 
     2091 
     2092      //exten => vmx,n,Set(LOOPCOUNT=0) 
     2093      $ext->add('macro-vm','vmx', '', new ext_setvar("LOOPCOUNT", '0'));       
     2094      //exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/repeat)}" = "0"]?vmxtime) 
     2095      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/repeat)}" = "0"]','vmxtime')); 
     2096      //exten => vmx,n,Set(VMX_REPEAT=${DB_RESULT}) 
     2097      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_REPEAT", '${DB_RESULT}')); 
     2098      //exten => vmx,n(vmxtime),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timeout)}" = "0"]?vmxloops) 
     2099      $ext->add('macro-vm','vmx', 'vmxtime', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timeout)}" = "0"]','vmxloops')); 
     2100      //exten => vmx,n,Set(VMX_TIMEOUT=${DB_RESULT}) 
     2101      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_TIMEOUT", '${DB_RESULT}')); 
     2102      //exten => vmx,n(vmxloops),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loops)}" = "0"]?vmxanswer) 
     2103      $ext->add('macro-vm','vmx', 'vmxloops', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loops)}" = "0"]','vmxanswer')); 
     2104      //exten => vmx,n,Set(VMX_LOOPS=${DB_RESULT}) 
     2105      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_LOOPS", '${DB_RESULT}')); 
     2106      //exten => vmx,n(vmxanswer),Answer() 
     2107      $ext->add('macro-vm','vmx','vmxanswer',new ext_answer('')); 
     2108 
     2109      // Now play the users voicemail recording as the basis for their ivr, the Read command will repeat as needed and if it timesout 
     2110      // then we go to the timeout. Otherwise handle invalid options by looping until the limit until a valid option is played. 
     2111 
     2112      //exten => vmx,n(loopstart),Read(ACTION,${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE},1,skip,${VMX_REPEAT},${VMX_TIMEOUT}) 
     2113      $ext->add('macro-vm','vmx','loopstart',new ext_read('ACTION', '${ASTSPOOLDIR}/voicemail/${VMCONTEXT}/${ARG1}/${MODE}', 1, 'skip', '${VMX_REPEAT}', '${VMX_TIMEOUT}')); 
     2114      //exten => vmx,n,GotoIf($["${EXISTS(${ACTION})}" = "1"]?checkopt) 
     2115      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${EXISTS(${ACTION})}" = "1"]','checkopt')); 
     2116      // If we are here we timed out, go to the required destination 
     2117 
     2118      //exten => vmx,n(noopt),Noop(Timeout: going to timeout dest) 
     2119      $ext->add('macro-vm','vmx', 'noopt', new ext_NoOp('Timeout: going to timeout dest'));      
     2120      //exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_TIMEOUT}) 
     2121      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_OPTS", '${VMX_OPTS_TIMEOUT}')); 
     2122      //exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/timeout)}" = "0"]?chktime) 
     2123      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/timeout)}" = "0"]','chktime')); 
     2124      //exten => vmx,n,Set(VMX_OPTS=${DB_RESULT}) 
     2125      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_OPTS", '${DB_RESULT}')); 
     2126      //exten => vmx,n(chktime),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/ext)}" = "0"]?dotime) 
     2127      $ext->add('macro-vm','vmx', 'chktime', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/ext)}" = "0"]','dotime')); 
     2128      //exten => vmx,n,Set(VMX_TIMEDEST_EXT=${DB_RESULT}) 
     2129      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_TIMEDEST_EXT",'${DB_RESULT}'));  
     2130      //exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/context)}" = "0"]?timepri) 
     2131      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/context)}" = "0"]','timepri')); 
     2132      //exten => vmx,n,Set(VMX_TIMEDEST_CONTEXT=${DB_RESULT}) 
     2133      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_TIMEDEST_CONTEXT",'${DB_RESULT}')); 
     2134      //exten => vmx,n(timepri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/pri)}" = "0"]?dotime) 
     2135      $ext->add('macro-vm','vmx', 'timepri', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/timedest/pri)}" = "0"]','dotime')); 
     2136      //exten => vmx,n,Set(VMX_TIMEDEST_PRI=${DB_RESULT}) 
     2137      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_TIMEDEST_PRI",'${DB_RESULT}')); 
     2138      //exten => vmx,n(dotime),Goto(${VMX_TIMEDEST_CONTEXT},${VMX_TIMEDEST_EXT},${VMX_TIMEDEST_PRI}) 
     2139      $ext->add('macro-vm','vmx','dotime',new ext_goto('${VMX_TIMEDEST_PRI}', '${VMX_TIMEDEST_EXT}', '${VMX_TIMEDEST_CONTEXT}')); 
     2140      // We got an option, check if the option is defined, or one of the system defaults 
     2141 
     2142      //exten => vmx,n(checkopt),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/ext)}" = "1"]?doopt) 
     2143      $ext->add('macro-vm','vmx', 'checkopt', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/ext)}" = "1"]','doopt')); 
     2144      //exten => vmx,n,GotoIf($["${ACTION}" = "0"]?o,1) 
     2145      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${ACTION}" = "0"]','o,1')); 
     2146      //exten => vmx,n,GotoIf($["${ACTION}" = "*"]?adef,1) 
     2147      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${ACTION}" = "*"]','adef,1')); 
     2148      // Got invalid option loop until the max 
     2149 
     2150      //exten => vmx,n,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1]) 
     2151      $ext->add('macro-vm','vmx', '', new ext_setvar("LOOPCOUNT",'$[${LOOPCOUNT} + 1]')); 
     2152      //exten => vmx,n,GotoIf($[${LOOPCOUNT} > ${VMX_LOOPS}]?toomany) 
     2153      $ext->add('macro-vm','vmx', '', new ext_gotoif('$[${LOOPCOUNT} > ${VMX_LOOPS}]','toomany')); 
     2154      //exten => vmx,n,Playback(pm-invalid-option&please-try-again) 
     2155      $ext->add('macro-vm','vmx','',new ext_playback('pm-invalid-option&please-try-again'));       
     2156      //exten => vmx,n,Goto(loopstart) 
     2157      $ext->add('macro-vm','vmx','',new ext_goto('loopstart')); 
     2158      // tomany: to many invalid options, go to the specified destination 
     2159 
     2160      //exten => vmx,n(toomany),Noop(Too Many invalid entries, got to invalid dest) 
     2161      $ext->add('macro-vm','vmx', 'toomany', new ext_NoOp('Too Many invalid entries, got to invalid dest'));       
     2162      //exten => vmx,n,Set(VMX_OPTS=${VMX_OPTS_LOOPS}) 
     2163      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_OPTS",'${VMX_OPTS_LOOPS}')); 
     2164      //exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/loops)}" = "0"]?chkloop) 
     2165      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/loops)}" = "0"]','chkloop')); 
     2166      //exten => vmx,n,Set(VMX_OPTS=${DB_RESULT}) 
     2167      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_OPTS",'${DB_RESULT}')); 
     2168      //exten => vmx,n(chkloop),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/ext)}" = "0"]?doloop) 
     2169      $ext->add('macro-vm','vmx', 'chkloop', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/ext)}" = "0"]','doloop')); 
     2170      //exten => vmx,n,Set(VMX_LOOPDEST_EXT=${DB_RESULT}) 
     2171      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_LOOPDEST_EXT",'${DB_RESULT}')); 
     2172      //exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/context)}" = "0"]?looppri) 
     2173      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/context)}" = "0"]','looppri')); 
     2174      //exten => vmx,n,Set(VMX_LOOPDEST_CONTEXT=${DB_RESULT}) ;TODO make configurable per above 
     2175      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_LOOPDEST_CONTEXT",'${DB_RESULT}')); 
     2176      //exten => vmx,n(looppri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/pri)}" = "0"]?doloop) 
     2177      $ext->add('macro-vm','vmx', 'looppri', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/loopdest/pri)}" = "0"]','doloop')); 
     2178      //exten => vmx,n,Set(VMX_LOOPDEST_PRI=${DB_RESULT}) ;TODO make configurable per above 
     2179      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_LOOPDEST_PRI",'${DB_RESULT}')); 
     2180      //exten => vmx,n(doloop),Goto(${VMX_LOOPDEST_CONTEXT},${VMX_LOOPDEST_EXT},${VMX_LOOPDEST_PRI}) 
     2181      $ext->add('macro-vm','vmx','doloop',new ext_goto('${VMX_LOOPDEST_PRI}','${VMX_LOOPDEST_EXT}','${VMX_LOOPDEST_CONTEXT}')); 
     2182      // doopt: execute the valid option that was chosen 
     2183 
     2184      //exten => vmx,n(doopt),Noop(Got a valid option: ${DB_RESULT}) 
     2185      $ext->add('macro-vm','vmx', 'doopt', new ext_NoOp('Got a valid option: ${DB_RESULT}'));      
     2186      //exten => vmx,n,Set(VMX_EXT=${DB_RESULT}) 
     2187      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_EXT",'${DB_RESULT}')); 
     2188 
     2189      // Special case, if this option was to go to voicemail, set options and go 
     2190 
     2191      //exten => vmx,n,GotoIf($["${VMX_EXT}" != "dovm"]?getdest) 
     2192      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${VMX_EXT}" != "dovm"]','getdest')); 
     2193      //exten => vmx,n(vmxopts),Set(VMX_OPTS=${VMX_OPTS_DOVM}) 
     2194      $ext->add('macro-vm','vmx', 'vmxopts', new ext_setvar("VMX_OPTS",'${VMX_OPTS_DOVM}')); 
     2195      //exten => vmx,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/dovm)}" = "0"]?vmxdovm) 
     2196      $ext->add('macro-vm','vmx', '', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/vmxopts/dovm)}" = "0"]','vmxdovm')); 
     2197      //exten => vmx,n(vmxopts),Set(VMX_OPTS=${DB_RESULT}) 
     2198      $ext->add('macro-vm','vmx', 'vmxopts', new ext_setvar("VMX_OPTS",'${DB_RESULT}')); 
     2199      //exten => vmx,n(vmxdovm),goto(dovm,1) 
     2200      $ext->add('macro-vm','vmx','vmxdovm',new ext_goto('1','dovm'));      
     2201 
     2202      // General case, setup the goto destination and go there (no error checking, its up to the GUI's to assure 
     2203      // reasonable values 
     2204 
     2205      //exten => vmx,n(getdest),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/context)}" = "0"]?vmxpri) 
     2206      $ext->add('macro-vm','vmx', 'getdest', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/context)}" = "0"]','vmxpri')); 
     2207      //exten => vmx,n,Set(VMX_CONTEXT=${DB_RESULT}) 
     2208      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_CONTEXT",'${DB_RESULT}')); 
     2209      //exten => vmx,n(vmxpri),GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/pri)}" = "0"]?vmxgoto) 
     2210      $ext->add('macro-vm','vmx', 'vmxpri', new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/${ACTION}/pri)}" = "0"]','vmxgoto')); 
     2211      //exten => vmx,n,Set(VMX_PRI=${DB_RESULT}) 
     2212      $ext->add('macro-vm','vmx', '', new ext_setvar("VMX_PRI",'${DB_RESULT}')); 
     2213      //exten => vmx,n(vmxgoto),Goto(${VMX_CONTEXT},${VMX_EXT},${VMX_PRI}) 
     2214      $ext->add('macro-vm','vmx','vmxgoto',new ext_goto('${VMX_PRI}','${VMX_EXT}','${VMX_CONTEXT}')); 
     2215      // If the required voicemail file is not present, then revert to normal voicemail 
     2216      // behavior treating as if it was not set 
     2217 
     2218      //exten => vmx,n(nofile),Noop(File for mode: ${MODE} does not exist, SYSTEMSTATUS: ${SYSTEMSTATUS}, going to normal voicemail) 
     2219      $ext->add('macro-vm','vmx', 'nofile', new ext_NoOp('File for mode: ${MODE} does not exist, SYSTEMSTATUS: ${SYSTEMSTATUS}, going to normal voicemail')); 
     2220      //exten => vmx,n,Goto(s-${ARG2},1) 
     2221      $ext->add('macro-vm','vmx','',new ext_goto('1','s-${ARG2}')); 
     2222      //exten => vmx,n(tmpgreet),Noop(Temporary Greeting Detected, going to normal voicemail) 
     2223      $ext->add('macro-vm','vmx', 'tmpgreet', new ext_NoOp('Temporary Greeting Detected, going to normal voicemail')); 
     2224      //exten => vmx,n,Goto(s-${ARG2},1) 
     2225      $ext->add('macro-vm','vmx','',new ext_goto('1','s-${ARG2}')); 
     2226 
     2227      // Drop into voicemail either as a direct destination (in which case VMX_OPTS might be set to something) or 
     2228      // if the user timed out or broke out of the loop then VMX_OPTS is always cleared such that an Allison 
     2229      // message is played and the caller know's what is going on. 
     2230 
     2231      //exten => dovm,1,Noop(VMX Timeout - go to voicemail) 
     2232      $ext->add('macro-vm','dovm', '', new ext_NoOp('VMX Timeout - go to voicemail')); 
     2233      //exten => dovm,n,Voicemail(${ARG1}@${VMCONTEXT},${VMX_OPTS}${VMGAIN}) ; no flags, so allison plays please leave ... 
     2234      $ext->add('macro-vm','dovm', '',new ext_vm('${ARG1}@${VMCONTEXT},${VMX_OPTS}${VMGAIN}'));  
     2235      //exten => dovm,n,Goto(exit-${VMSTATUS},1) 
     2236      $ext->add('macro-vm','dovm', '',new ext_goto('1','exit-${VMSTATUS}')); 
     2237 
     2238      //exten => s-BUSY,1,NoOp(BUSY voicemail) 
     2239      $ext->add('macro-vm','s-BUSY','',new ext_NoOp('BUSY voicemail')); 
     2240      //exten => s-BUSY,n,Macro(get-vmcontext,${ARG1}) 
     2241      $ext->add('macro-vm','s-BUSY','',new ext_macro('get-vmcontext','${ARG1}')); 
     2242      //exten => s-BUSY,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}b${VMGAIN})   ; Voicemail Busy message 
     2243      $ext->add('macro-vm','s-BUSY', '',new ext_vm('${ARG1}@${VMCONTEXT},${VM_OPTS}b${VMGAIN}')); 
     2244      //exten => s-BUSY,n,Goto(exit-${VMSTATUS},1) 
     2245       $ext->add('macro-vm','s-BUSY', '',new ext_goto('1','exit-${VMSTATUS}')); 
     2246 
     2247      //exten => s-NOMESSAGE,1,NoOp(NOMESSAGE (beeb only) voicemail) 
     2248      $ext->add('macro-vm','s-NOMESSAGE','',new ext_NoOp('NOMESSAGE (beeb only) voicemail')); 
     2249      //exten => s-NOMESSAGE,n,Macro(get-vmcontext,${ARG1}) 
     2250      $ext->add('macro-vm','s-NOMESSAGE','',new ext_macro('get-vmcontext','${ARG1}')); 
     2251      //exten => s-NOMESSAGE,n,Voicemail(${ARG1}@${VMCONTEXT},s${VM_OPTS}${VMGAIN}) 
     2252      $ext->add('macro-vm','s-NOMESSAGE','',new ext_vm('${ARG1}@${VMCONTEXT},s${VM_OPTS}${VMGAIN}')); 
     2253      //exten => s-NOMESSAGE,n,Goto(exit-${VMSTATUS},1) 
     2254      $ext->add('macro-vm','s-NOMESSAGE','',new ext_goto('1','exit-${VMSTATUS}')); 
     2255 
     2256      //exten => s-DIRECTDIAL,1,NoOp(DIRECTDIAL voicemail) 
     2257      $ext->add('macro-vm','s-DIRECTDIAL','',new ext_NoOp('DIRECTDIAL voicemail')); 
     2258      //exten => s-DIRECTDIAL,n,Macro(get-vmcontext,${ARG1}) 
     2259      $ext->add('macro-vm','s-DIRECTDIAL','',new ext_macro('get-vmcontext','${ARG1}')); 
     2260      //exten => s-DIRECTDIAL,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}${VM_DDTYPE}${VMGAIN}) 
     2261      $ext->add('macro-vm','s-DIRECTDIAL','',new ext_vm('${ARG1}@${VMCONTEXT},${VM_OPTS}${VM_DDTYPE}${VMGAIN}')); 
     2262      //exten => s-DIRECTDIAL,n,Goto(exit-${VMSTATUS},1) 
     2263      $ext->add('macro-vm','s-DIRECTDIAL','',new ext_goto('1','exit-${VMSTATUS}')); 
     2264 
     2265      //exten => _s-.,1,Macro(get-vmcontext,${ARG1}) 
     2266      $ext->add('macro-vm','_s-.','',new ext_macro('get-vmcontext','${ARG1}')); 
     2267      //exten => _s-.,n,Voicemail(${ARG1}@${VMCONTEXT},${VM_OPTS}u${VMGAIN})     ; Voicemail Unavailable message 
     2268      $ext->add('macro-vm','_s-.','',new ext_vm('${ARG1}@${VMCONTEXT},${VM_OPTS}u${VMGAIN}')); 
     2269      //exten => _s-.,n,Goto(exit-${VMSTATUS},1) 
     2270      $ext->add('macro-vm','_s-.','',new ext_goto('1','exit-${VMSTATUS}')); 
     2271      // If the user has a 0 option defined, use that for operator zero-out from within voicemail 
     2272      // as well to keep it consistant with the menu structure 
     2273 
     2274      //exten => o,1,Background(one-moment-please)      ; 0 during vm message will hangup 
     2275      $ext->add('macro-vm','o','',new ext_background('one-moment-please')); 
     2276      //exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/ext)}" = "0"]?doopdef) 
     2277      $ext->add('macro-vm','o','',new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/ext)}" = "0"]','doopdef')); 
     2278      //exten => o,n,Set(VMX_OPDEST_EXT=${DB_RESULT}) 
     2279      $ext->add('macro-vm','o','',new ext_setvar("VMX_OPDEST_EXT",'${DB_RESULT}')); 
     2280      //exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/context)}" = "1"]?opcontext) 
     2281      $ext->add('macro-vm','o','',new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/context)}" = "1"]','opcontext')); 
     2282      //exten => o,n,Set(DB_RESULT=${VMX_CONTEXT}) 
     2283      $ext->add('macro-vm','o','',new ext_setvar("DB_RESULT",'${VMX_CONTEXT}')); 
     2284      //exten => o,n(opcontext),Set(VMX_OPDEST_CONTEXT=${DB_RESULT}) 
     2285      $ext->add('macro-vm','o','opcontext',new ext_setvar("VMX_OPDEST_CONTEXT",'${DB_RESULT}')); 
     2286      //exten => o,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/pri)}" = "1"]?oppri) 
     2287      $ext->add('macro-vm','o','',new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/0/pri)}" = "1"]','oppri')); 
     2288      //exten => o,n,Set(DB_RESULT=${VMX_PRI}) 
     2289      $ext->add('macro-vm','o','',new ext_setvar("DB_RESULT",'${VMX_PRI}')); 
     2290      //exten => o,n(oppri),Set(VMX_OPDEST_PRI=${DB_RESULT}) 
     2291      $ext->add('macro-vm','o','oppri',new ext_setvar("VMX_OPDEST_PRI",'${DB_RESULT}')); 
     2292      //exten => o,n,Goto(${VMX_OPDEST_CONTEXT},${VMX_OPDEST_EXT},${VMX_OPDEST_PRI}) 
     2293      $ext->add('macro-vm','o','',new ext_goto('${VMX_OPDEST_PRI}','${VMX_OPDEST_EXT}','${VMX_OPDEST_CONTEXT}')); 
     2294      //exten => o,n(doopdef),GotoIf($["x${OPERATOR_XTN}"="x"]?nooper:from-internal,${OPERATOR_XTN},1) 
     2295      $ext->add('macro-vm','o','doopdef',new ext_gotoif('$["x${OPERATOR_XTN}"="x"]','nooper','from-internal,${OPERATOR_XTN},1')); 
     2296      //exten => o,n(nooper),GotoIf($["x${FROM_DID}"="x"]?nodid) 
     2297      $ext->add('macro-vm','o','nooper',new ext_gotoif('$["x${FROM_DID}"="x"]','nodid')); 
     2298      //exten => o,n,Dial(Local/${FROM_DID}@from-pstn) 
     2299      $ext->add('macro-vm','o','',new ext_dial('Local/${FROM_DID}@from-pstn','')); 
     2300      //exten => o,n,Macro(hangup) 
     2301      $ext->add('macro-vm','o','',new ext_macro('hangup')); 
     2302      //exten => o,n(nodid),Dial(Local/s@from-pstn) 
     2303      $ext->add('macro-vm','o','nodid',new ext_dial('Local/s@from-pstn','')); 
     2304      //exten => o,n,Macro(hangup) 
     2305      $ext->add('macro-vm','o','',new ext_macro('hangup')); 
     2306 
     2307      // If the user has a * option defined, use that for the * out from within voicemail 
     2308      // as well to keep it consistant with the menu structure 
     2309 
     2310      //exten => a,1,Macro(get-vmcontext,${ARG1}) 
     2311      $ext->add('macro-vm','a','',new ext_macro('get-vmcontext','${ARG1}')); 
     2312      //exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/ext)}" = "0"]?adef,1) 
     2313      $ext->add('macro-vm','a','',new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/ext)}" = "0"]','adef,1')); 
     2314      /**/ 
     2315      //exten => a,n,Set(VMX_ADEST_EXT=${DB_RESULT}) 
     2316      $ext->add('macro-vm','a','',new ext_setvar("VMX_ADEST_EXT",'${DB_RESULT}')); 
     2317      //exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/context)}" = "1"]?acontext) 
     2318      $ext->add('macro-vm','a','',new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/context)}" = "1"]','acontext')); 
     2319      /**/ 
     2320      //exten => a,n,Set(DB_RESULT=${VMX_CONTEXT}) 
     2321      $ext->add('macro-vm','a','',new ext_setvar("DB_RESULT",'${VMX_CONTEXT}')); 
     2322      //exten => a,n(acontext),Set(VMX_ADEST_CONTEXT=${DB_RESULT}) 
     2323      $ext->add('macro-vm','a','acontext',new ext_setvar("VMX_ADEST_CONTEXT",'${DB_RESULT}')); 
     2324 
     2325      //exten => a,n,GotoIf($["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/pri)}" = "1"]?apri) 
     2326      $ext->add('macro-vm','a','',new ext_gotoif('$["${DB_EXISTS(AMPUSER/${ARG1}/vmx/${MODE}/*/pri)}" = "1"]','apri')); 
     2327      /**/ 
     2328      //exten => a,n,Set(DB_RESULT=${VMX_PRI}) 
     2329      $ext->add('macro-vm','a','',new ext_setvar("DB_RESULT",'${VMX_PRI}')); 
     2330      //exten => a,n(apri),Set(VMX_ADEST_PRI=${DB_RESULT}) 
     2331      $ext->add('macro-vm','a','apri',new ext_setvar("VMX_ADEST_PRI",'${DB_RESULT}')); 
     2332      //exten => a,n,Goto(${VMX_ADEST_CONTEXT},${VMX_ADEST_EXT},${VMX_ADEST_PRI}) 
     2333      $ext->add('macro-vm','a','',new ext_goto('${VMX_ADEST_PRI}','${VMX_ADEST_EXT}','${VMX_ADEST_CONTEXT}')); 
     2334      //exten => adef,1,VoiceMailMain(${ARG1}@${VMCONTEXT}) 
     2335      $ext->add('macro-vm','adef','',new ext_vmmain('${ARG1}@${VMCONTEXT}')); 
     2336      //exten => adef,n,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1) 
     2337      $ext->add('macro-vm','adef','',new ext_gotoif('$["${ARG3}" = "RETURN"]','exit-RETURN,1')); 
     2338      //exten => adef,n,Hangup 
     2339      $ext->add('macro-vm','adef','',new ext_hangup('')); 
     2340 
     2341      //exten => exit-FAILED,1,Playback(im-sorry&an-error-has-occured) 
     2342      $ext->add('macro-vm','exit-FAILED','',new ext_playback('im-sorry&an-error-has-occured')); 
     2343      //exten => exit-FAILED,n,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1) 
     2344      $ext->add('macro-vm','exit-FAILED','',new ext_gotoif('$["${ARG3}" = "RETURN"]','exit-RETURN,1')); 
     2345      //exten => exit-FAILED,n,Hangup() 
     2346      $ext->add('macro-vm','exit-FAILED','',new ext_hangup('')); 
     2347 
     2348      //exten => exit-SUCCESS,1,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1) 
     2349      $ext->add('macro-vm','exit-SUCCESS','',new ext_gotoif('$["${ARG3}" = "RETURN"]','exit-RETURN,1')); 
     2350      //exten => exit-SUCCESS,n,Playback(goodbye) 
     2351      $ext->add('macro-vm','exit-SUCCESS','',new ext_playback('goodbye')); 
     2352      //exten => exit-SUCCESS,n,Hangup() 
     2353      $ext->add('macro-vm','exit-SUCCESS','',new ext_hangup('')); 
     2354 
     2355      //exten => exit-USEREXIT,1,GotoIf($["${ARG3}" = "RETURN"]?exit-RETURN,1) 
     2356      $ext->add('macro-vm','exit-USEREXIT','',new ext_gotoif('$["${ARG3}" = "RETURN"]','exit-RETURN,1')); 
     2357      //exten => exit-USEREXIT,n,Playback(goodbye) 
     2358      $ext->add('macro-vm','exit-USEREXIT','',new ext_playback('goodbye')); 
     2359      //exten => exit-USEREXIT,n,Hangup() 
     2360      $ext->add('macro-vm','exit-USEREXIT','',new ext_hangup('')); 
     2361 
     2362      //exten => exit-RETURN,1,Noop(Returning From Voicemail because macro) 
     2363      $ext->add('macro-vm','exit-RETURN','',new ext_noop('Returning From Voicemail because macro')); 
     2364      //exten => t,1,Hangup() 
     2365      $ext->add('macro-vm','t','',new ext_hangup('')); 
     2366 
     2367      /* end macro-vm  */ 
    19102368                   
    19112369    break;