<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#ffffff">
On 09/14/2010 12:08 AM, Tilghman Lesher wrote:
<blockquote cite="mid:201009132308.08699.tlesher@digium.com" type="cite">
  <pre wrap="">On Monday 13 September 2010 15:55:50 Mark Murawski wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">I've just finished writing a hangup handler module. And associated
helper function ast_pbx_exten_parse(), which I think is needed to
separate the functionality of parsing a gosub target from actually going
to the target.  It's been malloc debugged and valgrind debugged.

Overview of module:
I find the 'h' extensions to be limited, cumbersome, and error prone
when writing very complex dialplan, especially when using lots of gotos
and gosubs.  Say you have a main dialplan entry point context called
callqueue.  If at any point after callqueue runs, you want to run a
hangup handler specific for the callqueue dialplan, you have to put an
'h' extension in every single context you plan to possibly jump to after
entering callqueue.  This solves that problem, and gives the added
benefit of cascading hangup handlers.
    </pre>
  </blockquote>
  <pre wrap="">
I'd like to see mechanisms both for adding and removing handlers, especially
if you're going to have multiple handlers, in no particular order (or reverse
order, if this is a stack).  We absolutely need to define what particular
order each will run, if we have multiple, and reverse order is likely the most
practical.

Perhaps, on the order of:
Set(CHANNEL(hanguphandler,add)=somesubroutine,h,1)
Set(CHANNEL(hanguphandler,remove)=somesubroutine,h,1)
and one that pops the last off and adds a new one in a single step:
Set(CHANNEL(hanguphandler,replace)=nextcheckpoint,h,1)

  </pre>
</blockquote>
<font size="+1"><br>
<br>
Looks good.&nbsp; I'll add the remove/replace.<br>
<br>
I'm always a fan of maximal introspection.&nbsp; What about functions that
inspect the hangup handler list?<br>
<br>
What's the preferred format for getting multi part data via functions?
There's functions like CHANNELS(), which return a space delimited
list.&nbsp; Personally I don't like plaintext delimited lists when you can
avoid them, because no matter what delimiter you use, someone is going
to want to use that delimiter as part of their data.<br>
<br>
Before CHANNELS() was available, I wrote my own channels listing
function which functions like<br>
Set(count=${GET_CHANNELS_LIST(foo.*)});<br>
while i &lt; count<br>
&nbsp; Set(nextchan=${GET_CHANNELS_LIST_NEXT()});<br>
<br>
So now you have access to each exact channel name with no delimiters
and no CUT()/etc required<br>
<br>
So with that in mind, I'm thinking something like:<br>
<br>
Set(count=${CHANNEL(hanguphandler,list)});<br>
</font><font size="+1">Set(handler=${CHANNEL(hanguphandler,list_next)});</font><br>
<br>
<br>
</body>
</html>