Benoit
2010-Jul-23 13:50 UTC
[asterisk-users] application call to Gosub affects flow of control, and needs to be re-written using AEL
Hi, For some reason (outbound call tracking) I've got a few different outbound call process (using a macro for queuemetrics logging, or direct call) i wanted to factorise the routing process so i came up with something like the following. All in one it's working like expected, however every "ael reload" command trigger a lot of warning like that "application call to Gosub affects flow of control, and needs to be re-written using AEL if, while, goto, etc. keywords instead!" But i fail to see how i could do it another way, any idea/suggestion ? Extraction of the outbound processing structure: context outboundSimple { _9X. => { // prepare callerid, secret, ... /// ... // start call routing Gosub(pstnRouting,${EXTEN:1},1); // back, handle return status &dialstatus(${DIALSTATUS},${EXTEN:1}); } } context outboundQueue1 { _9X. => { // prepare callerid, secret, ... /// ... &qmoutqdial(${EXTEN:1},DAHDI/g1/${EXTEN:1},queue-out,Agent/${AgentNum}); } } context outboundQueue2 { .... } // outbound call logging for queuemetrics: macro qmoutqdial( clid, dialstring, queue, agent ) { start_dial_time = ${EPOCH}; QueueLog(${queue},${UNIQUEID},${agent},CALLOUTBOUND,-|${clid}); Set(dialopts=gWKU(queuelog_connect_event^${queue}^${UNIQUEID}^${agent}^${start_dial_time})); Gosub(pstnRouting,${clid},1); end_dial_time = ${EPOCH}; verb = COMPLETECALLER; &queuelog_hangup_event(${queue},${UNIQUEID},${agent},${start_dial_time}); return; } // central call routing rules context pstnRouting { _06XXXXXXXX => { Gosub(pstnInterface2,${EXTEN},1); Return; } .... // left over _X. => { Gosub(pstnInterface1,${EXTEN},1); Return; } } context pstnInterface1 { _X. => { // setup the interface callerid/secret status ChanIsAvail(DAHDI/g1); if( ! ${ISNULL(${AVAILORIGCHAN})} ) { Dial(DAHDI/g1/${ext},,${dialopts}); } Return; } } context pstnInterface2 { _X. => { // setup the interface callerid/secret status ChanIsAvail(SIP/....); if( ! ${ISNULL(${AVAILORIGCHAN})} ) { Dial(SIP/.../${ext},,${dialopts}); } Return; } }
Zeeshan Zakaria
2010-Jul-23 14:44 UTC
[asterisk-users] application call to Gosub affects flow of control, and needs to be re-written using AEL
Hi, I try to avoid any warnings, as they can turn into errors later. I remember having problems with GoSub long time ago, don't remember what it was, but I moved to macros after that. For what you are trying to achieve, I use macros. Just jump to a macro, evaluate what you need to, save the results in variables, and use these variables in the calling context to proceed further. For example, in my context for outbound calls, called [outbound], I jump to macro [user-account-info], get account info, come back to [outbound], then jump to [blacklist], check the caller ID against a blacklist, come back to [outbound], jump to two other macros, and finally I have all the info I need to proceed with a call, stored in various variables. Based on these variables I trigger the Dial command, or do something else as needed. In your case, you can make it even simpler, e.g. like this: context outboundSimple { _9X. => { // prepare callerid, secret, ... /// ... // start call routing if("${EXTEN:1:3}"="06") { &pstnInterface2(${EXTEN:1}); } else { &pstnInterface1(${EXTEN:1}); }; // back, handle return status }; h => { &dialstatus(${DIALSTATUS},${EXTEN:1}); }; } macro pstnInterface1(number) { // setup the interface callerid/secret status ChanIsAvail(DAHDI/g1); if( ! ${ISNULL(${AVAILORIGCHAN})} ) { Dial(DAHDI/g1/${number},,${dialopts}); }; catch h { &dialstatus(${DIALSTATUS},${number}); }; } macro pstnInterface2(number) { // setup the interface callerid/secret status ChanIsAvail(SIP/....); if( ! ${ISNULL(${AVAILORIGCHAN})} ) { Dial(SIP/.../${number},,${dialopts}); }; catch h { &dialstatus(${DIALSTATUS},${number}); }; } On Fri, Jul 23, 2010 at 9:50 AM, Benoit <maverick at maverick.eu.org> wrote:> > Hi, > > For some reason (outbound call tracking) I've got a few different > outbound call process (using a macro for queuemetrics logging, or direct > call) > i wanted to factorise the routing process so i came up with something > like the following. All in one it's working like expected, however > every "ael reload" command trigger a lot of warning like that > > "application call to Gosub affects flow of control, and needs to be > re-written using AEL if, while, goto, etc. keywords instead!" > > But i fail to see how i could do it another way, any idea/suggestion ? > > > Extraction of the outbound processing structure: > > context outboundSimple { > _9X. => { > // prepare callerid, secret, ... > /// ... > > // start call routing > Gosub(pstnRouting,${EXTEN:1},1); > // back, handle return status > &dialstatus(${DIALSTATUS},${EXTEN:1}); > } > } > > context outboundQueue1 { > _9X. => { > // prepare callerid, secret, ... > /// ... > > &qmoutqdial(${EXTEN:1},DAHDI/g1/${EXTEN:1},queue-out,Agent/${AgentNum}); > } > } > > context outboundQueue2 { > .... > } > > // outbound call logging for queuemetrics: > macro qmoutqdial( clid, dialstring, queue, agent ) > { > start_dial_time = ${EPOCH}; > QueueLog(${queue},${UNIQUEID},${agent},CALLOUTBOUND,-|${clid}); > > > > Set(dialopts=gWKU(queuelog_connect_event^${queue}^${UNIQUEID}^${agent}^${start_dial_time})); > Gosub(pstnRouting,${clid},1); > > end_dial_time = ${EPOCH}; > verb = COMPLETECALLER; > &queuelog_hangup_event(${queue},${UNIQUEID},${agent},${start_dial_time}); > return; > } > > > // central call routing rules > context pstnRouting { > > _06XXXXXXXX => { Gosub(pstnInterface2,${EXTEN},1); Return; } > .... > > // left over > _X. => { Gosub(pstnInterface1,${EXTEN},1); Return; } > } > > context pstnInterface1 { > _X. => { > // setup the interface callerid/secret status > > ChanIsAvail(DAHDI/g1); > if( ! ${ISNULL(${AVAILORIGCHAN})} ) { > Dial(DAHDI/g1/${ext},,${dialopts}); > } > Return; > } > } > > context pstnInterface2 { > _X. => { > // setup the interface callerid/secret status > > ChanIsAvail(SIP/....); > if( ! ${ISNULL(${AVAILORIGCHAN})} ) { > Dial(SIP/.../${ext},,${dialopts}); > } > Return; > } > } > > > -- > _____________________________________________________________________ > -- Bandwidth and Colocation Provided by http://www.api-digital.com -- > New to Asterisk? Join us for a live introductory webinar every Thurs: > http://www.asterisk.org/hello > > asterisk-users mailing list > To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-users >-- Zeeshan A Zakaria -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.digium.com/pipermail/asterisk-users/attachments/20100723/88194e00/attachment.htm
Zeeshan Zakaria
2010-Jul-23 15:46 UTC
[asterisk-users] application call to Gosub affects flow of control, and needs to be re-written using AEL
Then I would suggest using the method I mentioned earlier, i.e. using macros. I have a really sophisticated dialplan for my multi-tenant system, which also incorporates some serious security stuff, along with call routing, trunk selection decisions and other checks, and for me macros work really well. Zeeshan A Zakaria -- www.ilovetovoip.com On 2010-07-23 11:40 AM, "Benoit" <maverick at maverick.eu.org> wrote: Le 23/07/2010 16:44, Zeeshan Zakaria a ?crit :> Hi, > > I try to avoid any warnings, as they can turn into errors later.well, that's exactly the point of this inquiry :)> > I remember having problems with GoSub long time ago, don't remember > what it was, but I moved ...Already though of this, doesn't really suit the need. The extract was only a really short version of the original system, the routing is a bit more complex than that and redoing it using if/switch won't be very efficient, especially since context are really made for this. -- _____________________________________________________________________ -- Bandwidth and Colocation Pr... -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.digium.com/pipermail/asterisk-users/attachments/20100723/aaca88ad/attachment.htm